aboutsummaryrefslogtreecommitdiff
path: root/test/parallel/test-child-process-bad-stdio.js
diff options
context:
space:
mode:
authorcjihrig <cjihrig@gmail.com>2016-11-09 10:08:23 -0500
committercjihrig <cjihrig@gmail.com>2016-11-15 15:35:11 -0500
commit7cdfe8a130deb2300d4311da9f4372e971a37eac (patch)
tree6556d1e2fa0135320a5047110d9d939aa3f1c6fc /test/parallel/test-child-process-bad-stdio.js
parent478fabf3e4eb11899e64333e8ce8125cfb74824c (diff)
downloadandroid-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.js63
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, '');
+ });
+}