'use strict'; const common = require('../common'); const fixtures = require('../common/fixtures'); const assert = require('assert'); const { spawnSync, spawn } = require('child_process'); const { once } = require('events'); const { finished } = require('stream/promises'); async function runAndKill(file) { if (common.isWindows) { common.printSkipMessage(`signals are not supported in windows, skipping ${file}`); return; } let stdout = ''; const child = spawn(process.execPath, ['--test', file]); child.stdout.setEncoding('utf8'); child.stdout.on('data', (chunk) => { if (!stdout.length) child.kill('SIGINT'); stdout += chunk; }); const [code, signal] = await once(child, 'exit'); await finished(child.stdout); assert.match(stdout, /not ok 1/); assert.match(stdout, /# cancelled 1\n/); assert.strictEqual(signal, null); assert.strictEqual(code, 1); } if (process.argv[2] === 'child') { const test = require('node:test'); if (process.argv[3] === 'pass') { test('passing test', () => { assert.strictEqual(true, true); }); } else if (process.argv[3] === 'fail') { assert.strictEqual(process.argv[3], 'fail'); test('failing test', () => { assert.strictEqual(true, false); }); } else assert.fail('unreachable'); } else { let child = spawnSync(process.execPath, [__filename, 'child', 'pass']); assert.strictEqual(child.status, 0); assert.strictEqual(child.signal, null); child = spawnSync(process.execPath, ['--test', fixtures.path('test-runner', 'subdir', 'subdir_test.js')]); assert.strictEqual(child.status, 0); assert.strictEqual(child.signal, null); child = spawnSync(process.execPath, [__filename, 'child', 'fail']); assert.strictEqual(child.status, 1); assert.strictEqual(child.signal, null); runAndKill(fixtures.path('test-runner', 'never_ending_sync.js')).then(common.mustCall()); runAndKill(fixtures.path('test-runner', 'never_ending_async.js')).then(common.mustCall()); }