summaryrefslogtreecommitdiff
path: root/tests/specs/node
diff options
context:
space:
mode:
Diffstat (limited to 'tests/specs/node')
-rw-r--r--tests/specs/node/worker_threads/__test__.jsonc44
-rw-r--r--tests/specs/node/worker_threads/auto_exits.mjs19
-rw-r--r--tests/specs/node/worker_threads/auto_exits.out3
-rw-r--r--tests/specs/node/worker_threads/message_port.mjs41
-rw-r--r--tests/specs/node/worker_threads/message_port.out6
-rw-r--r--tests/specs/node/worker_threads/message_port_1.cjs9
-rw-r--r--tests/specs/node/worker_threads/message_port_removelistener.out (renamed from tests/specs/node/worker_threads/message_port_removelistener.mjs.out)0
-rw-r--r--tests/specs/node/worker_threads/message_port_transfer.mjs14
-rw-r--r--tests/specs/node/worker_threads/message_port_transfer.out3
-rw-r--r--tests/specs/node/worker_threads/message_port_transfer1.mjs10
-rw-r--r--tests/specs/node/worker_threads/message_port_unref.mjs40
-rw-r--r--tests/specs/node/worker_threads/message_port_unref.out2
12 files changed, 185 insertions, 6 deletions
diff --git a/tests/specs/node/worker_threads/__test__.jsonc b/tests/specs/node/worker_threads/__test__.jsonc
index adcb9a85d..9254d9d37 100644
--- a/tests/specs/node/worker_threads/__test__.jsonc
+++ b/tests/specs/node/worker_threads/__test__.jsonc
@@ -1,8 +1,40 @@
{
- "steps": [{
- "args": "run message_port_removelistener.mjs",
- "output": "message_port_removelistener.mjs.out",
- // Note: successful exit asserts that the test passed
- "exitCode": 0
- }]
+ "tests": {
+ "auto_exits": {
+ // Test for https://github.com/denoland/deno/issues/22629
+ // Test for https://github.com/denoland/deno/issues/22934
+ "args": "run --quiet --allow-read auto_exits.mjs",
+ "output": "auto_exits.out",
+ "exitCode": 0
+ },
+ "message_port": {
+ "args": "run --allow-env --allow-read message_port.mjs",
+ "output": "message_port.out",
+ "exitCode": 0
+ },
+ "message_port_transfer": {
+ "args": "run --quiet --allow-read message_port_transfer.mjs",
+ "output": "message_port_transfer.out",
+ "exitCode": 0
+ },
+ "message_port_removelistener": {
+ "args": "run message_port_removelistener.mjs",
+ "output": "message_port_removelistener.out",
+ // Note: successful exit asserts that the test passed
+ "exitCode": 0
+ },
+ "message_port_unref": {
+ "args": "run --allow-env --allow-read message_port_unref.mjs",
+ "output": "message_port_unref.out",
+ "exitCode": 0
+ },
+ "parent_port_unref": {
+ "args": "run --allow-env --allow-read message_port_unref.mjs",
+ "envs": {
+ "PARENT_PORT": "1"
+ },
+ "output": "message_port_unref.out",
+ "exitCode": 0
+ }
+ }
}
diff --git a/tests/specs/node/worker_threads/auto_exits.mjs b/tests/specs/node/worker_threads/auto_exits.mjs
new file mode 100644
index 000000000..e434f59f7
--- /dev/null
+++ b/tests/specs/node/worker_threads/auto_exits.mjs
@@ -0,0 +1,19 @@
+import { isMainThread, parentPort, Worker } from "node:worker_threads";
+
+function onMessageOneshot() {
+ console.log("Got message from main thread!");
+ parentPort.off("message", onMessageOneshot);
+}
+
+if (isMainThread) {
+ // This re-loads the current file inside a Worker instance.
+ const w = new Worker(import.meta.filename);
+
+ setTimeout(() => {
+ w.postMessage("Hello! I am from the main thread.");
+ }, 500);
+} else {
+ console.log("Inside Worker!");
+ console.log(isMainThread); // Prints 'false'.
+ parentPort.on("message", onMessageOneshot);
+}
diff --git a/tests/specs/node/worker_threads/auto_exits.out b/tests/specs/node/worker_threads/auto_exits.out
new file mode 100644
index 000000000..a160931db
--- /dev/null
+++ b/tests/specs/node/worker_threads/auto_exits.out
@@ -0,0 +1,3 @@
+Inside Worker!
+false
+Got message from main thread!
diff --git a/tests/specs/node/worker_threads/message_port.mjs b/tests/specs/node/worker_threads/message_port.mjs
new file mode 100644
index 000000000..f6503b78d
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port.mjs
@@ -0,0 +1,41 @@
+import workerThreads from "node:worker_threads";
+
+const { port1: mainPort, port2: workerPort } = new workerThreads
+ .MessageChannel();
+
+// Note: not using Promise.withResolver() because it's not available in Node.js
+const deferred = createDeferred();
+
+const worker = new workerThreads.Worker(
+ import.meta.resolve("./message_port_1.cjs"),
+ {
+ workerData: workerPort,
+ transferList: [workerPort],
+ },
+);
+
+worker.on("message", (data) => {
+ console.log("worker:", data);
+ mainPort.on("message", (msg) => {
+ console.log("mainPort:", msg);
+ deferred.resolve();
+ });
+ mainPort.on("close", (_msg) => {
+ console.log("mainPort closed");
+ });
+});
+
+worker.postMessage("Hello from parent");
+await deferred.promise;
+await worker.terminate();
+mainPort.close();
+
+function createDeferred() {
+ let resolveCallback;
+ let rejectCallback;
+ const promise = new Promise((resolve, reject) => {
+ resolveCallback = resolve;
+ rejectCallback = reject;
+ });
+ return { promise, resolve: resolveCallback, reject: rejectCallback };
+}
diff --git a/tests/specs/node/worker_threads/message_port.out b/tests/specs/node/worker_threads/message_port.out
new file mode 100644
index 000000000..95b4fbc96
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port.out
@@ -0,0 +1,6 @@
+[UNORDERED_START]
+worker port closed
+worker: Hello from worker on parentPort!
+mainPort: Hello from worker on workerPort!
+mainPort closed
+[UNORDERED_END]
diff --git a/tests/specs/node/worker_threads/message_port_1.cjs b/tests/specs/node/worker_threads/message_port_1.cjs
new file mode 100644
index 000000000..3f78cd539
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_1.cjs
@@ -0,0 +1,9 @@
+const { parentPort, workerData } = require("worker_threads");
+
+parentPort.on("message", (msg) => {
+ const workerPort = workerData;
+ parentPort.postMessage("Hello from worker on parentPort!");
+ workerPort.postMessage("Hello from worker on workerPort!");
+ workerPort.on("close", () => console.log("worker port closed"));
+ workerPort.close();
+});
diff --git a/tests/specs/node/worker_threads/message_port_removelistener.mjs.out b/tests/specs/node/worker_threads/message_port_removelistener.out
index 980a0d5f1..980a0d5f1 100644
--- a/tests/specs/node/worker_threads/message_port_removelistener.mjs.out
+++ b/tests/specs/node/worker_threads/message_port_removelistener.out
diff --git a/tests/specs/node/worker_threads/message_port_transfer.mjs b/tests/specs/node/worker_threads/message_port_transfer.mjs
new file mode 100644
index 000000000..733a91c86
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_transfer.mjs
@@ -0,0 +1,14 @@
+import { MessageChannel, Worker } from "node:worker_threads";
+
+const { port1, port2 } = new MessageChannel();
+const worker = new Worker(
+ import.meta.resolve("./message_port_transfer1.mjs"),
+);
+// Send the port directly after the worker is created
+worker.postMessage(port2, [port2]);
+// Send a message to the worker using the transferred port
+port1.postMessage("Hello from main thread!");
+worker.on("message", (message) => {
+ console.log("Received message from worker:", message);
+ worker.terminate();
+});
diff --git a/tests/specs/node/worker_threads/message_port_transfer.out b/tests/specs/node/worker_threads/message_port_transfer.out
new file mode 100644
index 000000000..8e8f11940
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_transfer.out
@@ -0,0 +1,3 @@
+Worker thread started!
+Received message from main thread: Hello from main thread!
+Received message from worker: Reply from worker
diff --git a/tests/specs/node/worker_threads/message_port_transfer1.mjs b/tests/specs/node/worker_threads/message_port_transfer1.mjs
new file mode 100644
index 000000000..4d0a38bd5
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_transfer1.mjs
@@ -0,0 +1,10 @@
+import { parentPort } from "node:worker_threads";
+
+parentPort.on("message", (message) => {
+ const transferredPort = message;
+ transferredPort.on("message", (message) => {
+ console.log("Received message from main thread:", message);
+ parentPort.postMessage("Reply from worker");
+ });
+ console.log("Worker thread started!");
+});
diff --git a/tests/specs/node/worker_threads/message_port_unref.mjs b/tests/specs/node/worker_threads/message_port_unref.mjs
new file mode 100644
index 000000000..a12be1ec8
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_unref.mjs
@@ -0,0 +1,40 @@
+import {
+ isMainThread,
+ MessageChannel,
+ parentPort,
+ Worker,
+ workerData,
+} from "node:worker_threads";
+
+const useParentPort = Deno.env.get("PARENT_PORT") === "1";
+
+if (useParentPort) {
+ if (isMainThread) {
+ const worker = new Worker(import.meta.filename);
+ worker.postMessage("main says hi!");
+ worker.on("message", (msg) => console.log(msg));
+ } else {
+ parentPort.on("message", (msg) => {
+ console.log(msg);
+ parentPort.postMessage("worker says hi!");
+ parentPort.unref();
+ });
+ }
+} else {
+ if (isMainThread) {
+ const { port1, port2 } = new MessageChannel();
+ const worker = new Worker(import.meta.filename, {
+ workerData: port2,
+ transferList: [port2],
+ });
+ port1.postMessage("main says hi!");
+ port1.on("message", (msg) => console.log(msg));
+ } else {
+ const port = workerData;
+ port.on("message", (msg) => {
+ console.log(msg);
+ port.postMessage("worker says hi!");
+ port.unref();
+ });
+ }
+}
diff --git a/tests/specs/node/worker_threads/message_port_unref.out b/tests/specs/node/worker_threads/message_port_unref.out
new file mode 100644
index 000000000..c9d5325bc
--- /dev/null
+++ b/tests/specs/node/worker_threads/message_port_unref.out
@@ -0,0 +1,2 @@
+main says hi!
+worker says hi!