Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fix error reporting in child_process callbacks

Issue 120, test case by Nathan Ostgard
  • Loading branch information...
commit 264e540d008a251a7e37f367611677414c2591d1 1 parent a5b132a
@ry ry authored
Showing with 32 additions and 10 deletions.
  1. +6 −3 lib/child_process.js
  2. +26 −7 test/simple/test-child-process-exit-code.js
View
9 lib/child_process.js
@@ -86,7 +86,7 @@ exports.execFile = function (file, args /*, options, callback */) {
function ChildProcess () {
- process.EventEmitter.call(this);
+ EventEmitter.call(this);
var self = this;
@@ -99,11 +99,14 @@ function ChildProcess () {
var stdout = this.stdout = new Stream();
var stderr = this.stderr = new Stream();
- stderr.onend = stdout.onend = function () {
+ function onClose () {
if (gotCHLD && !stdout.readable && !stderr.readable) {
self.emit('exit', exitCode, termSignal);
}
- };
+ }
+
+ stderr.addListener('close', onClose);
+ stdout.addListener('close', onClose);
internal.onexit = function (code, signal) {
gotCHLD = true;
View
33 test/simple/test-child-process-exit-code.js
@@ -1,11 +1,30 @@
require("../common");
-var spawn = require('child_process').spawn
- , path = require('path')
- , sub = path.join(fixturesDir, 'exit.js')
- , child = spawn(process.argv[0], [sub, 23])
- ;
+spawn = require('child_process').spawn,
+path = require('path');
-child.addListener('exit', function(code, signal) {
+exits = 0;
+
+exitScript = path.join(fixturesDir, 'exit.js')
+exitChild = spawn(process.argv[0], [exitScript, 23]);
+exitChild.addListener('exit', function(code, signal) {
assert.strictEqual(code, 23);
assert.strictEqual(signal, null);
-});
+
+ exits++;
+});
+
+
+
+errorScript = path.join(fixturesDir, 'child_process_should_emit_error.js')
+errorChild = spawn(process.argv[0], [errorScript]);
+errorChild.addListener('exit', function(code, signal) {
+ assert.ok(code !== 0);
+ assert.strictEqual(signal, null);
+
+ exits++;
+});
+
+
+process.addListener('exit', function () {
+ assert.equal(2, exits);
+});
Please sign in to comment.
Something went wrong with that request. Please try again.