summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-11-19 21:39:07 +0100
committerAnna Henningsen <anna@addaleax.net>2019-11-30 02:02:52 +0100
commitf4f8ec2b65ea1e520c93ad0cee3d7241d113934d (patch)
tree623c90ef30d24309b9dc33e3ba42854d8ba6f291
parentfa5937b1e75ab04c1a1aaf396b36fbfaf4fff155 (diff)
downloadandroid-node-v8-f4f8ec2b65ea1e520c93ad0cee3d7241d113934d.tar.gz
android-node-v8-f4f8ec2b65ea1e520c93ad0cee3d7241d113934d.tar.bz2
android-node-v8-f4f8ec2b65ea1e520c93ad0cee3d7241d113934d.zip
test: port worker + buffer test to N-API
This ports `test/addons/worker-buffer-callback` to N-API, with the small exception of using external `ArrayBuffer`s rather than external Node.js `Buffer`s. PR-URL: https://github.com/nodejs/node/pull/30551 Reviewed-By: Gabriel Schulhof <gabriel.schulhof@intel.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
-rw-r--r--test/node-api/test_worker_buffer_callback/binding.gyp8
-rw-r--r--test/node-api/test_worker_buffer_callback/test-free-called.js17
-rw-r--r--test/node-api/test_worker_buffer_callback/test.js15
-rw-r--r--test/node-api/test_worker_buffer_callback/test_worker_buffer_callback.c43
4 files changed, 83 insertions, 0 deletions
diff --git a/test/node-api/test_worker_buffer_callback/binding.gyp b/test/node-api/test_worker_buffer_callback/binding.gyp
new file mode 100644
index 0000000000..7ab6381930
--- /dev/null
+++ b/test/node-api/test_worker_buffer_callback/binding.gyp
@@ -0,0 +1,8 @@
+{
+ 'targets': [
+ {
+ 'target_name': 'binding',
+ 'sources': [ 'test_worker_buffer_callback.c' ]
+ }
+ ]
+}
diff --git a/test/node-api/test_worker_buffer_callback/test-free-called.js b/test/node-api/test_worker_buffer_callback/test-free-called.js
new file mode 100644
index 0000000000..2a3cc9e47c
--- /dev/null
+++ b/test/node-api/test_worker_buffer_callback/test-free-called.js
@@ -0,0 +1,17 @@
+'use strict';
+const common = require('../../common');
+const path = require('path');
+const assert = require('assert');
+const { Worker } = require('worker_threads');
+const binding = path.resolve(__dirname, `./build/${common.buildType}/binding`);
+const { getFreeCallCount } = require(binding);
+
+// Test that buffers allocated with a free callback through our APIs are
+// released when a Worker owning it exits.
+
+const w = new Worker(`require(${JSON.stringify(binding)})`, { eval: true });
+
+assert.strictEqual(getFreeCallCount(), 0);
+w.on('exit', common.mustCall(() => {
+ assert.strictEqual(getFreeCallCount(), 1);
+}));
diff --git a/test/node-api/test_worker_buffer_callback/test.js b/test/node-api/test_worker_buffer_callback/test.js
new file mode 100644
index 0000000000..4884a27d39
--- /dev/null
+++ b/test/node-api/test_worker_buffer_callback/test.js
@@ -0,0 +1,15 @@
+'use strict';
+const common = require('../../common');
+const assert = require('assert');
+const { MessageChannel } = require('worker_threads');
+const { buffer } = require(`./build/${common.buildType}/binding`);
+
+// Test that buffers allocated with a free callback through our APIs are not
+// transferred.
+
+const { port1 } = new MessageChannel();
+const origByteLength = buffer.byteLength;
+port1.postMessage(buffer, [buffer]);
+
+assert.strictEqual(buffer.byteLength, origByteLength);
+assert.notStrictEqual(buffer.byteLength, 0);
diff --git a/test/node-api/test_worker_buffer_callback/test_worker_buffer_callback.c b/test/node-api/test_worker_buffer_callback/test_worker_buffer_callback.c
new file mode 100644
index 0000000000..b911fd8638
--- /dev/null
+++ b/test/node-api/test_worker_buffer_callback/test_worker_buffer_callback.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <node_api.h>
+#include <assert.h>
+#include "../../js-native-api/common.h"
+
+uint32_t free_call_count = 0;
+char data[] = "hello";
+
+napi_value GetFreeCallCount(napi_env env, napi_callback_info info) {
+ napi_value value;
+ NAPI_CALL(env, napi_create_uint32(env, free_call_count, &value));
+ return value;
+}
+
+static void finalize_cb(napi_env env, void* finalize_data, void* hint) {
+ assert(finalize_data == data);
+ free_call_count++;
+}
+
+NAPI_MODULE_INIT() {
+ napi_property_descriptor properties[] = {
+ DECLARE_NAPI_PROPERTY("getFreeCallCount", GetFreeCallCount)
+ };
+
+ NAPI_CALL(env, napi_define_properties(
+ env, exports, sizeof(properties) / sizeof(*properties), properties));
+
+ // This is a slight variation on the non-N-API test: We create an ArrayBuffer
+ // rather than a Node.js Buffer, since testing the latter would only test
+ // the same code paths and not the ones specific to N-API.
+ napi_value buffer;
+ NAPI_CALL(env, napi_create_external_arraybuffer(
+ env,
+ data,
+ sizeof(data),
+ finalize_cb,
+ NULL,
+ &buffer));
+
+ NAPI_CALL(env, napi_set_named_property(env, exports, "buffer", buffer));
+
+ return exports;
+}