-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: add test for broken child process stdio
This commit adds a test for the scenario where a child process is spawned, but the stdio streams could not be created. PR-URL: #9528 Reviewed-By: Daniel Bevenius <[email protected]> Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Santiago Gimeno <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
- Loading branch information
1 parent
4098514
commit a83a286
Showing
1 changed file
with
63 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
'use strict'; | ||
// Flags: --expose_internals | ||
const common = require('../common'); | ||
const assert = require('assert'); | ||
const cp = require('child_process'); | ||
|
||
if (process.argv[2] === 'child') { | ||
setTimeout(() => {}, common.platformTimeout(100)); | ||
return; | ||
} | ||
|
||
// 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 ChildProcess = require('internal/child_process').ChildProcess; | ||
const original = ChildProcess.prototype.spawn; | ||
|
||
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 = `${process.execPath} ${__filename} child`; | ||
|
||
return cp.exec(cmd, options, common.mustCall(callback)); | ||
} | ||
|
||
// Verify that normal execution of a child process is handled. | ||
{ | ||
createChild({}, (err, stdout, stderr) => { | ||
assert.strictEqual(err, null); | ||
assert.strictEqual(stdout, ''); | ||
assert.strictEqual(stderr, ''); | ||
}); | ||
} | ||
|
||
// Verify that execution with an error event is handled. | ||
{ | ||
const error = new Error('foo'); | ||
const child = createChild({}, (err, stdout, stderr) => { | ||
assert.strictEqual(err, error); | ||
assert.strictEqual(stdout, ''); | ||
assert.strictEqual(stderr, ''); | ||
}); | ||
|
||
child.emit('error', error); | ||
} | ||
|
||
// Verify that execution with a killed process is handled. | ||
{ | ||
createChild({ timeout: 1 }, (err, stdout, stderr) => { | ||
assert.strictEqual(err.killed, true); | ||
assert.strictEqual(stdout, ''); | ||
assert.strictEqual(stderr, ''); | ||
}); | ||
} |