node/test/parallel/test-cluster-worker-wait-server-close.js
Sam Roberts 03ce84dfa1 test: fix cluster-worker-wait-server-close races
Wait for data to arrive from worker before doing a disconnect. Without
this, whether the disconnect arrives at the worker before the master
accepts and forwards the connection descriptor to the worker is a race.

Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Rod Vagg <rod@vagg.org>
PR-URL: https://github.com/nodejs/io.js/pull/1953
Fixes: https://github.com/nodejs/io.js/issues/1933
Fixes: https://github.com/nodejs/io.js/pull/1400
2015-06-12 12:56:40 -07:00

49 lines
1.2 KiB
JavaScript

'use strict';
var common = require('../common');
var assert = require('assert');
var cluster = require('cluster');
var net = require('net');
if (cluster.isWorker) {
net.createServer(function(socket) {
// Wait for any data, then close connection
socket.write('.');
socket.on('data', function discard() {
});
}).listen(common.PORT, common.localhostIPv4);
} else if (cluster.isMaster) {
var connectionDone;
var ok;
// start worker
var worker = cluster.fork();
// Disconnect worker when it is ready
worker.once('listening', function() {
net.createConnection(common.PORT, common.localhostIPv4, function() {
var socket = this;
this.on('data', function() {
console.log('got data from client');
// socket definitely connected to worker if we got data
worker.disconnect();
setTimeout(function() {
socket.end();
connectionDone = true;
}, 1000);
});
});
});
// Check worker events and properties
worker.once('disconnect', function() {
assert.ok(connectionDone, 'disconnect should occur after socket close');
ok = true;
});
process.once('exit', function() {
assert.ok(ok);
});
}