|
| 1 | +'use strict'; |
| 2 | +// Flags: --expose_internals |
| 3 | +const common = require('../common'); |
| 4 | +const assert = require('assert'); |
| 5 | +const cp = require('child_process'); |
| 6 | + |
| 7 | +if (process.argv[2] === 'child') { |
| 8 | + setTimeout(() => {}, common.platformTimeout(100)); |
| 9 | + return; |
| 10 | +} |
| 11 | + |
| 12 | +// Monkey patch spawn() to create a child process normally, but destroy the |
| 13 | +// stdout and stderr streams. This replicates the conditions where the streams |
| 14 | +// cannot be properly created. |
| 15 | +const ChildProcess = require('internal/child_process').ChildProcess; |
| 16 | +const original = ChildProcess.prototype.spawn; |
| 17 | + |
| 18 | +ChildProcess.prototype.spawn = function() { |
| 19 | + const err = original.apply(this, arguments); |
| 20 | + |
| 21 | + this.stdout.destroy(); |
| 22 | + this.stderr.destroy(); |
| 23 | + this.stdout = null; |
| 24 | + this.stderr = null; |
| 25 | + |
| 26 | + return err; |
| 27 | +}; |
| 28 | + |
| 29 | +function createChild(options, callback) { |
| 30 | + const cmd = `${process.execPath} ${__filename} child`; |
| 31 | + |
| 32 | + return cp.exec(cmd, options, common.mustCall(callback)); |
| 33 | +} |
| 34 | + |
| 35 | +// Verify that normal execution of a child process is handled. |
| 36 | +{ |
| 37 | + createChild({}, (err, stdout, stderr) => { |
| 38 | + assert.strictEqual(err, null); |
| 39 | + assert.strictEqual(stdout, ''); |
| 40 | + assert.strictEqual(stderr, ''); |
| 41 | + }); |
| 42 | +} |
| 43 | + |
| 44 | +// Verify that execution with an error event is handled. |
| 45 | +{ |
| 46 | + const error = new Error('foo'); |
| 47 | + const child = createChild({}, (err, stdout, stderr) => { |
| 48 | + assert.strictEqual(err, error); |
| 49 | + assert.strictEqual(stdout, ''); |
| 50 | + assert.strictEqual(stderr, ''); |
| 51 | + }); |
| 52 | + |
| 53 | + child.emit('error', error); |
| 54 | +} |
| 55 | + |
| 56 | +// Verify that execution with a killed process is handled. |
| 57 | +{ |
| 58 | + createChild({ timeout: 1 }, (err, stdout, stderr) => { |
| 59 | + assert.strictEqual(err.killed, true); |
| 60 | + assert.strictEqual(stdout, ''); |
| 61 | + assert.strictEqual(stderr, ''); |
| 62 | + }); |
| 63 | +} |
0 commit comments