diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index cc9bcc09b714fe..c4194923cc0f44 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -318,7 +318,7 @@ class FileTest extends Test { function runTestFile(path, filesWatcher, opts) { const watchMode = filesWatcher != null; - const subtest = opts.root.createSubtest(FileTest, path, async (t) => { + const subtest = opts.root.createSubtest(FileTest, path, { __proto__: null, signal: opts.signal }, async (t) => { const args = getRunArgs(path, opts); const stdio = ['pipe', 'pipe', 'pipe']; const env = { __proto__: null, ...process.env, NODE_TEST_CONTEXT: 'child-v8' }; diff --git a/test/parallel/test-runner-run.mjs b/test/parallel/test-runner-run.mjs index 0d7aa346409647..911f115e5fb6a4 100644 --- a/test/parallel/test-runner-run.mjs +++ b/test/parallel/test-runner-run.mjs @@ -176,6 +176,17 @@ describe('require(\'node:test\').run', { concurrency: true }, () => { }); describe('AbortSignal', () => { + it('should accept a signal', async () => { + const stream = run({ signal: AbortSignal.timeout(50), files: [ + fixtures.path('test-runner', 'never_ending_sync.js'), + fixtures.path('test-runner', 'never_ending_async.js'), + ] }); + stream.on('test:fail', common.mustCall(2)); + stream.on('test:pass', common.mustNotCall()); + // eslint-disable-next-line no-unused-vars + for await (const _ of stream); + }); + it('should stop watch mode when abortSignal aborts', async () => { const controller = new AbortController(); const result = await run({