mirror of
https://github.com/nodejs/node.git
synced 2025-05-06 05:21:19 +00:00

Removed reliance on worker exit before arbitrary timeout. Instead of failing the test after 200 or 1000 ms wait indefinitely for child process exit. If the test hangs the test harness global timeout will kick in and fail the test. Note that if the orphaned children are not reaped correctly (in the absence of init, e.g. Docker) the test will hang and the harness will fail it. PR-URL: https://github.com/nodejs/node/pull/6531 Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Andreas Madsen <amwebdk@gmail.com> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
78 lines
1.6 KiB
JavaScript
78 lines
1.6 KiB
JavaScript
'use strict';
|
|
var common = require('../common');
|
|
var assert = require('assert');
|
|
var cluster = require('cluster');
|
|
|
|
if (cluster.isWorker) {
|
|
|
|
// keep the worker alive
|
|
var http = require('http');
|
|
http.Server().listen(common.PORT, '127.0.0.1');
|
|
|
|
} else if (process.argv[2] === 'cluster') {
|
|
|
|
var worker = cluster.fork();
|
|
|
|
// send PID info to testcase process
|
|
process.send({
|
|
pid: worker.process.pid
|
|
});
|
|
|
|
// terminate the cluster process
|
|
worker.once('listening', function() {
|
|
setTimeout(function() {
|
|
process.exit(0);
|
|
}, 1000);
|
|
});
|
|
|
|
} else {
|
|
|
|
// This is the testcase
|
|
var fork = require('child_process').fork;
|
|
|
|
// is process alive helper
|
|
var isAlive = function(pid) {
|
|
try {
|
|
//this will throw an error if the process is dead
|
|
process.kill(pid, 0);
|
|
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
// Spawn a cluster process
|
|
var master = fork(process.argv[1], ['cluster']);
|
|
|
|
// get pid info
|
|
var pid = null;
|
|
master.once('message', function(data) {
|
|
pid = data.pid;
|
|
});
|
|
|
|
// When master is dead
|
|
var alive = true;
|
|
master.on('exit', function(code) {
|
|
|
|
// make sure that the master died on purpose
|
|
assert.equal(code, 0);
|
|
|
|
// check worker process status
|
|
var pollWorker = function() {
|
|
alive = isAlive(pid);
|
|
if (alive) {
|
|
setTimeout(pollWorker, 50);
|
|
}
|
|
};
|
|
// Loop indefinitely until worker exit.
|
|
pollWorker();
|
|
});
|
|
|
|
process.once('exit', function() {
|
|
assert.equal(typeof pid, 'number', 'did not get worker pid info');
|
|
assert.equal(alive, false, 'worker was alive after master died');
|
|
});
|
|
|
|
}
|