| 'use strict'; |
| // Flags: --expose-internals |
| const common = require('../common'); |
| |
| if (process.argv[2] === 'child') { |
| setTimeout(() => {}, common.platformTimeout(1000)); |
| return; |
| } |
| |
| const assert = require('node:assert'); |
| const cp = require('node:child_process'); |
| const { mock, test } = require('node:test'); |
| const { ChildProcess } = require('internal/child_process'); |
| |
| // Monkey patch spawn() to create a child process normally, but destroy the |
| // stdout and stderr streams. This replicates the conditions where the streams |
| // cannot be properly created. |
| const original = ChildProcess.prototype.spawn; |
| |
| mock.method(ChildProcess.prototype, 'spawn', function() { |
| const err = original.apply(this, arguments); |
| |
| this.stdout.destroy(); |
| this.stderr.destroy(); |
| this.stdout = null; |
| this.stderr = null; |
| |
| return err; |
| }); |
| |
| function createChild(options, callback) { |
| const [cmd, opts] = common.escapePOSIXShell`"${process.execPath}" "${__filename}" child`; |
| options = { ...options, env: { ...opts?.env, ...options.env } }; |
| |
| return cp.exec(cmd, options, common.mustCall(callback)); |
| } |
| |
| test('normal execution of a child process is handled', (_, done) => { |
| createChild({}, common.mustCall((err, stdout, stderr) => { |
| assert.strictEqual(err, null); |
| assert.strictEqual(stdout, ''); |
| assert.strictEqual(stderr, ''); |
| done(); |
| })); |
| }); |
| |
| test('execution with an error event is handled', (_, done) => { |
| const error = new Error('foo'); |
| const child = createChild({}, common.mustCall((err, stdout, stderr) => { |
| assert.strictEqual(err, error); |
| assert.strictEqual(stdout, ''); |
| assert.strictEqual(stderr, ''); |
| done(); |
| })); |
| |
| child.emit('error', error); |
| }); |
| |
| test('execution with a killed process is handled', (_, done) => { |
| createChild({ timeout: 1 }, common.mustCall((err, stdout, stderr) => { |
| assert.strictEqual(err.killed, true); |
| assert.strictEqual(stdout, ''); |
| assert.strictEqual(stderr, ''); |
| done(); |
| })); |
| }); |