Skip to content

Commit 7087a08

Browse files
committed
forcibly kill every forked subprocess.
Killing the parent process skips execution of `end` listeners on remaining forked child processes. This interferes with `nyc` if processes are kept running after test completion. Refrence: istanbuljs/nyc#52
1 parent efde568 commit 7087a08

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

cli.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,12 @@ function exit(results) {
158158
// correctly flush the output when multiple test files
159159
process.stdout.write('');
160160

161-
process.exit(failed > 0 ? 1 : 0);
161+
// Individually kill each child process.
162+
Promise.map(results, function (result) {
163+
return result.kill();
164+
}).finally(function () {
165+
process.exit(failed > 0 ? 1 : 0);
166+
});
162167
}
163168

164169
function init(files) {

lib/fork.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,29 @@ module.exports = function (args) {
1818

1919
var ps = childProcess.fork(babel, args, options);
2020

21+
var killed = false;
22+
var killedPromise = new Promise(function (resolve) {
23+
ps.on('exit', function (code) {
24+
killed = true;
25+
resolve(code);
26+
});
27+
});
28+
29+
function kill() {
30+
if (!killed) {
31+
ps.kill();
32+
}
33+
return killedPromise;
34+
}
35+
2136
var promise = new Promise(function (resolve, reject) {
2237
ps.on('results', function (results) {
38+
results.kill = kill;
2339
resolve(results);
2440
});
2541

2642
// reject only when forked process failed
27-
ps.on('exit', function (code) {
43+
killedPromise.then(function (code) {
2844
if (code > 0) {
2945
reject();
3046
}

test/fixture/long-running.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
'use strict';
2+
const test = require('../../');
3+
4+
test('long running', function (t) {
5+
t.plan(1);
6+
7+
setTimeout(function () {
8+
console.log('I\'m gonna live forever!!');
9+
}, 15000);
10+
11+
t.ok(true);
12+
});

test/fork.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,15 @@ test('rejects on error and streams output', function (t) {
3939
t.end();
4040
});
4141
});
42+
43+
test('result.kill forcibly kills process', function (t) {
44+
t.plan(1);
45+
var start = Date.now();
46+
fork(fixture('long-running.js'))
47+
.on('exit', function () {
48+
t.ok(Date.now() - start < 10000);
49+
})
50+
.then(function (result) {
51+
result.kill();
52+
});
53+
});

0 commit comments

Comments
 (0)