|
@ -4,101 +4,86 @@ |
|
|
* sending a fd representing a UDP socket to the child and sending messages |
|
|
* 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 |
|
|
* to this endpoint, these messages are distributed to the parent and the |
|
|
* child process. |
|
|
* 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. |
|
|
|
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
const common = require('../common'); |
|
|
const common = require('../common'); |
|
|
var dgram = require('dgram'); |
|
|
const dgram = require('dgram'); |
|
|
var fork = require('child_process').fork; |
|
|
const fork = require('child_process').fork; |
|
|
var assert = require('assert'); |
|
|
const assert = require('assert'); |
|
|
|
|
|
|
|
|
if (common.isWindows) { |
|
|
if (common.isWindows) { |
|
|
common.skip('Sending dgram sockets to child processes is ' + |
|
|
common.skip('Sending dgram sockets to child processes is not supported'); |
|
|
'not supported'); |
|
|
|
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var server; |
|
|
|
|
|
if (process.argv[2] === 'child') { |
|
|
if (process.argv[2] === 'child') { |
|
|
process.on('message', function removeMe(msg, clusterServer) { |
|
|
let childServer; |
|
|
if (msg === 'server') { |
|
|
|
|
|
server = clusterServer; |
|
|
|
|
|
|
|
|
|
|
|
server.on('message', function() { |
|
|
process.once('message', function(msg, clusterServer) { |
|
|
|
|
|
childServer = clusterServer; |
|
|
|
|
|
|
|
|
|
|
|
childServer.once('message', function() { |
|
|
process.send('gotMessage'); |
|
|
process.send('gotMessage'); |
|
|
|
|
|
childServer.close(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
} else if (msg === 'stop') { |
|
|
process.send('handleReceived'); |
|
|
server.close(); |
|
|
|
|
|
process.removeListener('message', removeMe); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
server = dgram.createSocket('udp4'); |
|
|
const parentServer = dgram.createSocket('udp4'); |
|
|
var client = dgram.createSocket('udp4'); |
|
|
const client = dgram.createSocket('udp4'); |
|
|
var child = fork(__filename, ['child']); |
|
|
const child = fork(__filename, ['child']); |
|
|
|
|
|
|
|
|
var msg = Buffer.from('Some bytes'); |
|
|
const msg = Buffer.from('Some bytes'); |
|
|
|
|
|
|
|
|
var childGotMessage = false; |
|
|
var childGotMessage = false; |
|
|
var parentGotMessage = false; |
|
|
var parentGotMessage = false; |
|
|
|
|
|
|
|
|
server.on('message', function(msg, rinfo) { |
|
|
parentServer.once('message', function(msg, rinfo) { |
|
|
parentGotMessage = true; |
|
|
parentGotMessage = true; |
|
|
|
|
|
parentServer.close(); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
server.on('listening', function() { |
|
|
parentServer.on('listening', function() { |
|
|
child.send('server', server); |
|
|
child.send('server', parentServer); |
|
|
|
|
|
|
|
|
child.once('message', function(msg) { |
|
|
child.on('message', function(msg) { |
|
|
if (msg === 'gotMessage') { |
|
|
if (msg === 'gotMessage') { |
|
|
childGotMessage = true; |
|
|
childGotMessage = true; |
|
|
|
|
|
} else if (msg = 'handlReceived') { |
|
|
|
|
|
sendMessages(); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
sendMessages(); |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
var sendMessages = function() { |
|
|
const sendMessages = function() { |
|
|
var timer = setInterval(function() { |
|
|
const serverPort = parentServer.address().port; |
|
|
|
|
|
|
|
|
|
|
|
const timer = setInterval(function() { |
|
|
|
|
|
/* |
|
|
|
|
|
* Both the parent and the child got at least one message, |
|
|
|
|
|
* test passed, clean up everyting. |
|
|
|
|
|
*/ |
|
|
|
|
|
if (parentGotMessage && childGotMessage) { |
|
|
|
|
|
clearInterval(timer); |
|
|
|
|
|
client.close(); |
|
|
|
|
|
} else { |
|
|
client.send( |
|
|
client.send( |
|
|
msg, |
|
|
msg, |
|
|
0, |
|
|
0, |
|
|
msg.length, |
|
|
msg.length, |
|
|
server.address().port, |
|
|
serverPort, |
|
|
'127.0.0.1', |
|
|
'127.0.0.1', |
|
|
function(err) { |
|
|
function(err) { |
|
|
if (err) throw 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); |
|
|
}, 1); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
var shutdown = function() { |
|
|
parentServer.bind(0, '127.0.0.1'); |
|
|
child.send('stop'); |
|
|
|
|
|
|
|
|
|
|
|
server.close(); |
|
|
|
|
|
client.close(); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
server.bind(0, '127.0.0.1'); |
|
|
|
|
|
|
|
|
|
|
|
process.once('exit', function() { |
|
|
process.once('exit', function() { |
|
|
assert(parentGotMessage); |
|
|
assert(parentGotMessage); |
|
|