diff options
author | cjihrig <cjihrig@gmail.com> | 2016-11-09 10:08:23 -0500 |
---|---|---|
committer | cjihrig <cjihrig@gmail.com> | 2016-11-15 15:35:11 -0500 |
commit | 7cdfe8a130deb2300d4311da9f4372e971a37eac (patch) | |
tree | 6556d1e2fa0135320a5047110d9d939aa3f1c6fc /test/parallel/test-child-process-bad-stdio.js | |
parent | 478fabf3e4eb11899e64333e8ce8125cfb74824c (diff) | |
download | android-node-v8-7cdfe8a130deb2300d4311da9f4372e971a37eac.tar.gz android-node-v8-7cdfe8a130deb2300d4311da9f4372e971a37eac.tar.bz2 android-node-v8-7cdfe8a130deb2300d4311da9f4372e971a37eac.zip |
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: https://github.com/nodejs/node/pull/9528
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Diffstat (limited to 'test/parallel/test-child-process-bad-stdio.js')
-rw-r--r-- | test/parallel/test-child-process-bad-stdio.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/parallel/test-child-process-bad-stdio.js b/test/parallel/test-child-process-bad-stdio.js new file mode 100644 index 0000000000..e92bbcf11f --- /dev/null +++ b/test/parallel/test-child-process-bad-stdio.js @@ -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, ''); + }); +} |