Fix error reporting in child_process callbacks
Issue 120, test case by Nathan Ostgard
This commit is contained in:
parent
a5b132ad63
commit
264e540d00
@ -86,7 +86,7 @@ exports.execFile = function (file, args /*, options, callback */) {
|
|||||||
|
|
||||||
|
|
||||||
function ChildProcess () {
|
function ChildProcess () {
|
||||||
process.EventEmitter.call(this);
|
EventEmitter.call(this);
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
@ -99,11 +99,14 @@ function ChildProcess () {
|
|||||||
var stdout = this.stdout = new Stream();
|
var stdout = this.stdout = new Stream();
|
||||||
var stderr = this.stderr = new Stream();
|
var stderr = this.stderr = new Stream();
|
||||||
|
|
||||||
stderr.onend = stdout.onend = function () {
|
function onClose () {
|
||||||
if (gotCHLD && !stdout.readable && !stderr.readable) {
|
if (gotCHLD && !stdout.readable && !stderr.readable) {
|
||||||
self.emit('exit', exitCode, termSignal);
|
self.emit('exit', exitCode, termSignal);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
stderr.addListener('close', onClose);
|
||||||
|
stdout.addListener('close', onClose);
|
||||||
|
|
||||||
internal.onexit = function (code, signal) {
|
internal.onexit = function (code, signal) {
|
||||||
gotCHLD = true;
|
gotCHLD = true;
|
||||||
|
@ -1,11 +1,30 @@
|
|||||||
require("../common");
|
require("../common");
|
||||||
var spawn = require('child_process').spawn
|
spawn = require('child_process').spawn,
|
||||||
, path = require('path')
|
path = require('path');
|
||||||
, sub = path.join(fixturesDir, 'exit.js')
|
|
||||||
, child = spawn(process.argv[0], [sub, 23])
|
|
||||||
;
|
|
||||||
|
|
||||||
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(code, 23);
|
||||||
assert.strictEqual(signal, null);
|
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);
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user