mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
test: convert test_encoding_binding.cc to a JS test
The cctest file `test_encoding_binding.cc` is never tested and it is not a valid test. Binding functions should never be tested with V8 API circumvented. A binding function should only be tested with JS calls. PR-URL: https://github.com/nodejs/node/pull/56791 Refs: https://github.com/nodejs/node/pull/55275 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Daniel Lemire <daniel@lemire.me> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
committed by
Node.js GitHub Bot
parent
1b2a966125
commit
3c105b6e21
@@ -1,176 +0,0 @@
|
||||
#include "encoding_binding.h"
|
||||
#include "env-inl.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "node_test_fixture.h"
|
||||
#include "v8.h"
|
||||
|
||||
namespace node {
|
||||
namespace encoding_binding {
|
||||
|
||||
bool RunDecodeLatin1(Environment* env,
|
||||
Local<Value> args[],
|
||||
bool ignore_bom,
|
||||
bool has_fatal,
|
||||
Local<Value>* result) {
|
||||
Isolate* isolate = env->isolate();
|
||||
TryCatch try_catch(isolate);
|
||||
|
||||
Local<Boolean> ignoreBOMValue = Boolean::New(isolate, ignore_bom);
|
||||
Local<Boolean> fatalValue = Boolean::New(isolate, has_fatal);
|
||||
|
||||
Local<Value> updatedArgs[] = {args[0], ignoreBOMValue, fatalValue};
|
||||
|
||||
BindingData::DecodeLatin1(FunctionCallbackInfo<Value>(updatedArgs));
|
||||
|
||||
if (try_catch.HasCaught()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*result = args[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
class EncodingBindingTest : public NodeTestFixture {};
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_ValidInput) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t latin1_data[] = {0xC1, 0xE9, 0xF3};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_TRUE(RunDecodeLatin1(env, args, false, false, &result));
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "Áéó");
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_EmptyInput) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, 0);
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, 0);
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_TRUE(RunDecodeLatin1(env, args, false, false, &result));
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "");
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_InvalidInput) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
Local<Value> args[] = {String::NewFromUtf8Literal(isolate, "Invalid input")};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_FALSE(RunDecodeLatin1(env, args, false, false, &result));
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_IgnoreBOM) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t latin1_data[] = {0xFE, 0xFF, 0xC1, 0xE9, 0xF3};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_TRUE(RunDecodeLatin1(env, args, true, false, &result));
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "Áéó");
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_FatalInvalidInput) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t invalid_data[] = {0xFF, 0xFF, 0xFF};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(invalid_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), invalid_data, sizeof(invalid_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(invalid_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_FALSE(RunDecodeLatin1(env, args, false, true, &result));
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_IgnoreBOMAndFatal) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t latin1_data[] = {0xFE, 0xFF, 0xC1, 0xE9, 0xF3};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_TRUE(RunDecodeLatin1(env, args, true, true, &result));
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "Áéó");
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_BOMPresent) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t latin1_data[] = {0xFF, 0xC1, 0xE9, 0xF3};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
EXPECT_TRUE(RunDecodeLatin1(env, args, true, false, &result));
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "Áéó");
|
||||
}
|
||||
|
||||
TEST_F(EncodingBindingTest, DecodeLatin1_ReturnsString) {
|
||||
Environment* env = CreateEnvironment();
|
||||
Isolate* isolate = env->isolate();
|
||||
HandleScope handle_scope(isolate);
|
||||
|
||||
const uint8_t latin1_data[] = {0xC1, 0xE9, 0xF3};
|
||||
Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));
|
||||
memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));
|
||||
|
||||
Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));
|
||||
Local<Value> args[] = {array};
|
||||
|
||||
Local<Value> result;
|
||||
ASSERT_TRUE(RunDecodeLatin1(env, args, false, false, &result));
|
||||
|
||||
ASSERT_TRUE(result->IsString());
|
||||
|
||||
String::Utf8Value utf8_result(isolate, result);
|
||||
EXPECT_STREQ(*utf8_result, "Áéó");
|
||||
}
|
||||
|
||||
} // namespace encoding_binding
|
||||
} // namespace node
|
||||
48
test/parallel/test-internal-encoding-binding.js
Normal file
48
test/parallel/test-internal-encoding-binding.js
Normal file
@@ -0,0 +1,48 @@
|
||||
// Flags: --expose-internals
|
||||
|
||||
'use strict';
|
||||
|
||||
require('../common');
|
||||
|
||||
const assert = require('node:assert');
|
||||
const { internalBinding } = require('internal/test/binding');
|
||||
const binding = internalBinding('encoding_binding');
|
||||
|
||||
{
|
||||
// Valid input
|
||||
const buf = Uint8Array.from([0xC1, 0xE9, 0xF3]);
|
||||
assert.strictEqual(binding.decodeLatin1(buf, false, false), 'Áéó');
|
||||
}
|
||||
|
||||
{
|
||||
// Empty input
|
||||
const buf = Uint8Array.from([]);
|
||||
assert.strictEqual(binding.decodeLatin1(buf, false, false), '');
|
||||
}
|
||||
|
||||
{
|
||||
// Invalid input, but Latin1 has no invalid chars and should never throw.
|
||||
const buf = new TextEncoder().encode('Invalid Latin1 🧑🧑🧒🧒');
|
||||
assert.strictEqual(
|
||||
binding.decodeLatin1(buf, false, false),
|
||||
'Invalid Latin1 ð\x9F§\x91â\x80\x8Dð\x9F§\x91â\x80\x8Dð\x9F§\x92â\x80\x8Dð\x9F§\x92'
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
// IgnoreBOM with BOM
|
||||
const buf = Uint8Array.from([0xFE, 0xFF, 0xC1, 0xE9, 0xF3]);
|
||||
assert.strictEqual(binding.decodeLatin1(buf, true, false), 'þÿÁéó');
|
||||
}
|
||||
|
||||
{
|
||||
// Fatal and InvalidInput, but Latin1 has no invalid chars and should never throw.
|
||||
const buf = Uint8Array.from([0xFF, 0xFF, 0xFF]);
|
||||
assert.strictEqual(binding.decodeLatin1(buf, false, true), 'ÿÿÿ');
|
||||
}
|
||||
|
||||
{
|
||||
// IgnoreBOM and Fatal, but Latin1 has no invalid chars and should never throw.
|
||||
const buf = Uint8Array.from([0xFE, 0xFF, 0xC1, 0xE9, 0xF3]);
|
||||
assert.strictEqual(binding.decodeLatin1(buf, true, true), 'þÿÁéó');
|
||||
}
|
||||
Reference in New Issue
Block a user