From 19bb1600f9cebc770709f73deb3f767c4e12810a Mon Sep 17 00:00:00 2001 From: Ben Grant Date: Wed, 28 May 2025 14:53:23 -0700 Subject: [PATCH] node tests --- .../test-worker-message-port-drain.js | 40 +++++++++++++++++++ .../test-worker-stdio-flush-inflight.js | 24 +++++++++++ .../test/parallel/test-worker-stdio-flush.js | 25 ++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 test/js/node/test/parallel/test-worker-message-port-drain.js create mode 100644 test/js/node/test/parallel/test-worker-stdio-flush-inflight.js create mode 100644 test/js/node/test/parallel/test-worker-stdio-flush.js diff --git a/test/js/node/test/parallel/test-worker-message-port-drain.js b/test/js/node/test/parallel/test-worker-message-port-drain.js new file mode 100644 index 0000000000..6eca13e3b7 --- /dev/null +++ b/test/js/node/test/parallel/test-worker-message-port-drain.js @@ -0,0 +1,40 @@ +'use strict'; +require('../common'); + +// This test ensures that the messages from the internal +// message port are drained before the call to 'kDispose', +// and so all the stdio messages from the worker are processed +// in the parent and are pushed to their target streams. + +const assert = require('assert'); +const { + Worker, + isMainThread, + parentPort, + threadId, +} = require('worker_threads'); + +if (isMainThread) { + const workerIdsToOutput = new Map(); + + for (let i = 0; i < 2; i++) { + const worker = new Worker(__filename, { stdout: true }); + const workerOutput = []; + workerIdsToOutput.set(worker.threadId, workerOutput); + worker.on('message', console.log); + worker.stdout.on('data', (chunk) => { + workerOutput.push(chunk.toString().trim()); + }); + } + + process.on('exit', () => { + for (const [threadId, workerOutput] of workerIdsToOutput) { + assert.ok(workerOutput.includes(`1 threadId: ${threadId}`)); + assert.ok(workerOutput.includes(`2 threadId: ${threadId}`)); + } + }); +} else { + console.log(`1 threadId: ${threadId}`); + console.log(`2 threadId: ${threadId}`); + parentPort.postMessage(Array(100).fill(1)); +} diff --git a/test/js/node/test/parallel/test-worker-stdio-flush-inflight.js b/test/js/node/test/parallel/test-worker-stdio-flush-inflight.js new file mode 100644 index 0000000000..34b8115281 --- /dev/null +++ b/test/js/node/test/parallel/test-worker-stdio-flush-inflight.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { Worker, isMainThread } = require('worker_threads'); + +if (isMainThread) { + const w = new Worker(__filename, { stdout: true }); + const expected = 'hello world'; + + let data = ''; + w.stdout.setEncoding('utf8'); + w.stdout.on('data', (chunk) => { + data += chunk; + }); + + w.on('exit', common.mustCall(() => { + assert.strictEqual(data, expected); + })); +} else { + process.stdout.write('hello'); + process.stdout.write(' '); + process.stdout.write('world'); + process.exit(0); +} diff --git a/test/js/node/test/parallel/test-worker-stdio-flush.js b/test/js/node/test/parallel/test-worker-stdio-flush.js new file mode 100644 index 0000000000..e52e721fc6 --- /dev/null +++ b/test/js/node/test/parallel/test-worker-stdio-flush.js @@ -0,0 +1,25 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const { Worker, isMainThread } = require('worker_threads'); + +if (isMainThread) { + const w = new Worker(__filename, { stdout: true }); + const expected = 'hello world'; + + let data = ''; + w.stdout.setEncoding('utf8'); + w.stdout.on('data', (chunk) => { + data += chunk; + }); + + w.on('exit', common.mustCall(() => { + assert.strictEqual(data, expected); + })); +} else { + process.on('exit', () => { + process.stdout.write(' '); + process.stdout.write('world'); + }); + process.stdout.write('hello'); +}