Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: plug AliasedBuffer cctest memory leak #20665

Closed
wants to merge 2 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 37 additions & 42 deletions test/cctest/test_aliased_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,26 @@ using node::AliasedBuffer;
class AliasBufferTest : public NodeTestFixture {};

template<class NativeT>
void CreateOracleValues(NativeT* buf, size_t count) {
for (size_t i = 0, j = count; i < count; i++, j--) {
buf[i] = static_cast<NativeT>(j);
void CreateOracleValues(std::vector<NativeT>* buf) {
for (size_t i = 0, j = buf->size(); i < buf->size(); i++, j--) {
(*buf)[i] = static_cast<NativeT>(j);
}
}

template<class NativeT, class V8T>
void WriteViaOperator(AliasedBuffer<NativeT, V8T>* aliasedBuffer,
size_t size,
NativeT* oracle) {
const std::vector<NativeT>& oracle) {
// write through the API
for (size_t i = 0; i < size; i++) {
for (size_t i = 0; i < oracle.size(); i++) {
(*aliasedBuffer)[i] = oracle[i];
}
}

template<class NativeT, class V8T>
void WriteViaSetValue(AliasedBuffer<NativeT, V8T>* aliasedBuffer,
size_t size,
NativeT* oracle) {
const std::vector<NativeT>& oracle) {
// write through the API
for (size_t i = 0; i < size; i++) {
for (size_t i = 0; i < oracle.size(); i++) {
aliasedBuffer->SetValue(i, oracle[i]);
}
}
Expand All @@ -38,27 +36,26 @@ template<class NativeT, class V8T>
void ReadAndValidate(v8::Isolate* isolate,
v8::Local<v8::Context> context,
AliasedBuffer<NativeT, V8T>* aliasedBuffer,
size_t size,
NativeT* oracle) {
const std::vector<NativeT>& oracle) {
// read through the API
for (size_t i = 0; i < size; i++) {
for (size_t i = 0; i < oracle.size(); i++) {
NativeT v1 = (*aliasedBuffer)[i];
NativeT v2 = aliasedBuffer->GetValue(i);
EXPECT_TRUE(v1 == oracle[i]);
EXPECT_TRUE(v2 == oracle[i]);
}

// validate size of JS Buffer
EXPECT_TRUE(aliasedBuffer->GetJSArray()->Length() == size);
EXPECT_TRUE(aliasedBuffer->GetJSArray()->Length() == oracle.size());
EXPECT_TRUE(
aliasedBuffer->GetJSArray()->ByteLength() ==
(size * sizeof(NativeT)));
(oracle.size() * sizeof(NativeT)));

// validate operator * and GetBuffer are the same
EXPECT_TRUE(aliasedBuffer->GetNativeBuffer() == *(*aliasedBuffer));

// read through the JS API
for (size_t i = 0; i < size; i++) {
for (size_t i = 0; i < oracle.size(); i++) {
v8::Local<V8T> v8TypedArray = aliasedBuffer->GetJSArray();
v8::MaybeLocal<v8::Value> v = v8TypedArray->Get(context, i);
EXPECT_TRUE(v.IsEmpty() == false);
Expand All @@ -80,21 +77,19 @@ void ReadWriteTest(v8::Isolate* isolate) {

const size_t size = 100;
AliasedBuffer<NativeT, V8T> ab(isolate, size);
NativeT* oracle = new NativeT[size];
CreateOracleValues(oracle, size);
WriteViaOperator(&ab, size, oracle);
ReadAndValidate(isolate, context, &ab, size, oracle);
std::vector<NativeT> oracle(size);
CreateOracleValues(&oracle);
WriteViaOperator(&ab, oracle);
ReadAndValidate(isolate, context, &ab, oracle);

WriteViaSetValue(&ab, size, oracle);
WriteViaSetValue(&ab, oracle);

// validate copy constructor
{
AliasedBuffer<NativeT, V8T> ab2(ab);
ReadAndValidate(isolate, context, &ab2, size, oracle);
ReadAndValidate(isolate, context, &ab2, oracle);
}
ReadAndValidate(isolate, context, &ab, size, oracle);

delete[] oracle;
ReadAndValidate(isolate, context, &ab, oracle);
}

template<
Expand Down Expand Up @@ -124,28 +119,28 @@ void SharedBufferTest(
AliasedBuffer<NativeT_C, V8T_C> ab_C(
isolate, sizeInBytes_A + sizeInBytes_B, count_C, rootBuffer);

NativeT_A* oracle_A = new NativeT_A[count_A];
NativeT_B* oracle_B = new NativeT_B[count_B];
NativeT_C* oracle_C = new NativeT_C[count_C];
CreateOracleValues(oracle_A, count_A);
CreateOracleValues(oracle_B, count_B);
CreateOracleValues(oracle_C, count_C);
std::vector<NativeT_A> oracle_A(count_A);
std::vector<NativeT_B> oracle_B(count_B);
std::vector<NativeT_C> oracle_C(count_C);
CreateOracleValues(&oracle_A);
CreateOracleValues(&oracle_B);
CreateOracleValues(&oracle_C);

WriteViaOperator(&ab_A, count_A, oracle_A);
WriteViaOperator(&ab_B, count_B, oracle_B);
WriteViaOperator(&ab_C, count_C, oracle_C);
WriteViaOperator(&ab_A, oracle_A);
WriteViaOperator(&ab_B, oracle_B);
WriteViaOperator(&ab_C, oracle_C);

ReadAndValidate(isolate, context, &ab_A, count_A, oracle_A);
ReadAndValidate(isolate, context, &ab_B, count_B, oracle_B);
ReadAndValidate(isolate, context, &ab_C, count_C, oracle_C);
ReadAndValidate(isolate, context, &ab_A, oracle_A);
ReadAndValidate(isolate, context, &ab_B, oracle_B);
ReadAndValidate(isolate, context, &ab_C, oracle_C);

WriteViaSetValue(&ab_A, count_A, oracle_A);
WriteViaSetValue(&ab_B, count_B, oracle_B);
WriteViaSetValue(&ab_C, count_C, oracle_C);
WriteViaSetValue(&ab_A, oracle_A);
WriteViaSetValue(&ab_B, oracle_B);
WriteViaSetValue(&ab_C, oracle_C);

ReadAndValidate(isolate, context, &ab_A, count_A, oracle_A);
ReadAndValidate(isolate, context, &ab_B, count_B, oracle_B);
ReadAndValidate(isolate, context, &ab_C, count_C, oracle_C);
ReadAndValidate(isolate, context, &ab_A, oracle_A);
ReadAndValidate(isolate, context, &ab_B, oracle_B);
ReadAndValidate(isolate, context, &ab_C, oracle_C);
}

TEST_F(AliasBufferTest, Uint8Array) {
Expand Down