summaryrefslogtreecommitdiff
path: root/test/cctest/test_environment.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/cctest/test_environment.cc')
-rw-r--r--test/cctest/test_environment.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc
index 0db2963acc..132f7b44f7 100644
--- a/test/cctest/test_environment.cc
+++ b/test/cctest/test_environment.cc
@@ -1,3 +1,4 @@
+#include "node_buffer.h"
#include "node_internals.h"
#include "libplatform/libplatform.h"
@@ -208,3 +209,34 @@ TEST_F(EnvironmentTest, SetImmediateCleanup) {
EXPECT_EQ(called, 1);
EXPECT_EQ(called_unref, 0);
}
+
+static char hello[] = "hello";
+
+TEST_F(EnvironmentTest, BufferWithFreeCallbackIsDetached) {
+ // Test that a Buffer allocated with a free callback is detached after
+ // its callback has been called.
+ const v8::HandleScope handle_scope(isolate_);
+ const Argv argv;
+
+ int callback_calls = 0;
+
+ v8::Local<v8::ArrayBuffer> ab;
+ {
+ Env env {handle_scope, argv};
+ v8::Local<v8::Object> buf_obj = node::Buffer::New(
+ isolate_,
+ hello,
+ sizeof(hello),
+ [](char* data, void* hint) {
+ CHECK_EQ(data, hello);
+ ++*static_cast<int*>(hint);
+ },
+ &callback_calls).ToLocalChecked();
+ CHECK(buf_obj->IsUint8Array());
+ ab = buf_obj.As<v8::Uint8Array>()->Buffer();
+ CHECK_EQ(ab->ByteLength(), sizeof(hello));
+ }
+
+ CHECK_EQ(callback_calls, 1);
+ CHECK_EQ(ab->ByteLength(), 0);
+}