mirror of
https://github.com/nodejs/node.git
synced 2024-11-28 22:46:31 +01:00
3e1b1dd4a9
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.
102 lines
2.5 KiB
JavaScript
102 lines
2.5 KiB
JavaScript
/*
|
|
* The purpose of this test is to make sure that when forking a process,
|
|
* sending a fd representing a UDP socket to the child and sending messages
|
|
* to this endpoint, these messages are distributed to the parent and the
|
|
* child process.
|
|
*
|
|
* Because it's not really possible to predict how the messages will be
|
|
* distributed among the parent and the child processes, we keep sending
|
|
* messages until both the parent and the child received at least one
|
|
* message. The worst case scenario is when either one never receives
|
|
* a message. In this case the test runner will timeout after 60 secs
|
|
* and the test will fail.
|
|
*/
|
|
|
|
var dgram = require('dgram');
|
|
var fork = require('child_process').fork;
|
|
var assert = require('assert');
|
|
var common = require('../common');
|
|
|
|
if (process.platform === 'win32') {
|
|
console.error('Sending dgram sockets to child processes not supported');
|
|
process.exit(0);
|
|
}
|
|
|
|
if (process.argv[2] === 'child') {
|
|
var childCollected = 0;
|
|
var server;
|
|
|
|
process.on('message', function removeMe(msg, clusterServer) {
|
|
if (msg === 'server') {
|
|
server = clusterServer;
|
|
|
|
server.on('message', function () {
|
|
process.send('gotMessage');
|
|
});
|
|
|
|
} else if (msg === 'stop') {
|
|
server.close();
|
|
process.removeListener('message', removeMe);
|
|
}
|
|
});
|
|
|
|
} else {
|
|
var server = dgram.createSocket('udp4');
|
|
var client = dgram.createSocket('udp4');
|
|
var child = fork(__filename, ['child']);
|
|
|
|
var msg = new Buffer('Some bytes');
|
|
|
|
var childGotMessage = false;
|
|
var parentGotMessage = false;
|
|
|
|
server.on('message', function (msg, rinfo) {
|
|
parentGotMessage = true;
|
|
});
|
|
|
|
server.on('listening', function () {
|
|
child.send('server', server);
|
|
|
|
child.once('message', function (msg) {
|
|
if (msg === 'gotMessage') {
|
|
childGotMessage = true;
|
|
}
|
|
});
|
|
|
|
sendMessages();
|
|
});
|
|
|
|
var sendMessages = function () {
|
|
var timer = setInterval(function () {
|
|
client.send(msg, 0, msg.length, common.PORT, '127.0.0.1', function(err) {
|
|
if (err) throw err;
|
|
}
|
|
);
|
|
|
|
/*
|
|
* Both the parent and the child got at least one message,
|
|
* test passed, clean up everyting.
|
|
*/
|
|
if (parentGotMessage && childGotMessage) {
|
|
clearInterval(timer);
|
|
shutdown();
|
|
}
|
|
|
|
}, 1);
|
|
};
|
|
|
|
var shutdown = function () {
|
|
child.send('stop');
|
|
|
|
server.close();
|
|
client.close();
|
|
};
|
|
|
|
server.bind(common.PORT, '127.0.0.1');
|
|
|
|
process.once('exit', function () {
|
|
assert(parentGotMessage);
|
|
assert(childGotMessage);
|
|
});
|
|
}
|