node/test/parallel/test-child-process-disconnect.js
isaacs 3e1b1dd4a9 Remove excessive copyright/license boilerplate
The copyright and license notice is already in the LICENSE file.  There
is no justifiable reason to also require that it be included in every
file, since the individual files are not individually distributed except
as part of the entire package.
2015-01-12 15:30:28 -08:00

98 lines
2.4 KiB
JavaScript

var assert = require('assert');
var common = require('../common');
var fork = require('child_process').fork;
var net = require('net');
// child
if (process.argv[2] === 'child') {
// Check that the 'disconnect' event is deferred to the next event loop tick.
var disconnect = process.disconnect;
process.disconnect = function() {
disconnect.apply(this, arguments);
// If the event is emitted synchronously, we're too late by now.
process.once('disconnect', common.mustCall(disconnectIsNotAsync));
// The funky function name makes it show up legible in mustCall errors.
function disconnectIsNotAsync() {}
};
var server = net.createServer();
server.on('connection', function(socket) {
socket.resume();
process.on('disconnect', function() {
socket.end((process.connected).toString());
});
// when the socket is closed, we will close the server
// allowing the process to self terminate
socket.on('end', function() {
server.close();
});
socket.write('ready');
});
// when the server is ready tell parent
server.on('listening', function() {
process.send('ready');
});
server.listen(common.PORT);
} else {
// testcase
var child = fork(process.argv[1], ['child']);
var childFlag = false;
var childSelfTerminate = false;
var parentEmit = false;
var parentFlag = false;
// when calling .disconnect the event should emit
// and the disconnected flag should be true.
child.on('disconnect', function() {
parentEmit = true;
parentFlag = child.connected;
});
// the process should also self terminate without using signals
child.on('exit', function() {
childSelfTerminate = true;
});
// when child is listening
child.on('message', function(msg) {
if (msg === 'ready') {
// connect to child using TCP to know if disconnect was emitted
var socket = net.connect(common.PORT);
socket.on('data', function(data) {
data = data.toString();
// ready to be disconnected
if (data === 'ready') {
child.disconnect();
assert.throws(child.disconnect.bind(child), Error);
return;
}
// disconnect is emitted
childFlag = (data === 'true');
});
}
});
process.on('exit', function() {
assert.equal(childFlag, false);
assert.equal(parentFlag, false);
assert.ok(childSelfTerminate);
assert.ok(parentEmit);
});
}