mirror of https://github.com/lukechilds/node.git
Andreas Madsen
13 years ago
committed by
Ryan Dahl
11 changed files with 928 additions and 165 deletions
@ -0,0 +1,58 @@ |
|||
// Copyright Joyent, Inc. and other Node contributors.
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
// copy of this software and associated documentation files (the
|
|||
// "Software"), to deal in the Software without restriction, including
|
|||
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
// persons to whom the Software is furnished to do so, subject to the
|
|||
// following conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be included
|
|||
// in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
var common = require('../common'); |
|||
var assert = require('assert'); |
|||
|
|||
//messages
|
|||
var PREFIX = 'NODE_'; |
|||
var normal = {cmd: 'foo' + PREFIX}; |
|||
var internal = {cmd: PREFIX + 'bar'}; |
|||
|
|||
if (process.argv[2] === 'child') { |
|||
//send non-internal message containing PREFIX at a non prefix position
|
|||
process.send(normal); |
|||
|
|||
//send inernal message
|
|||
process.send(internal); |
|||
|
|||
process.exit(0); |
|||
|
|||
} else { |
|||
|
|||
var fork = require('child_process').fork; |
|||
var child = fork(process.argv[1], ['child']); |
|||
|
|||
var gotNormal; |
|||
child.once('message', function(data) { |
|||
gotNormal = data; |
|||
}); |
|||
|
|||
var gotInternal; |
|||
child.once('inernalMessage', function(data) { |
|||
gotInternal = data; |
|||
}); |
|||
|
|||
process.on('exit', function() { |
|||
assert.deepEqual(gotNormal, normal); |
|||
assert.deepEqual(gotInternal, internal); |
|||
}); |
|||
} |
@ -0,0 +1,161 @@ |
|||
// Copyright Joyent, Inc. and other Node contributors.
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
// copy of this software and associated documentation files (the
|
|||
// "Software"), to deal in the Software without restriction, including
|
|||
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
// persons to whom the Software is furnished to do so, subject to the
|
|||
// following conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be included
|
|||
// in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
|
|||
var common = require('../common'); |
|||
var assert = require('assert'); |
|||
var cluster = require('cluster'); |
|||
|
|||
function forEach(obj, fn) { |
|||
Object.keys(obj).forEach(function(name, index) { |
|||
fn(obj[name], name, index); |
|||
}); |
|||
} |
|||
|
|||
|
|||
if (cluster.isWorker) { |
|||
var http = require('http'); |
|||
http.Server(function() { |
|||
|
|||
}).listen(common.PORT, '127.0.0.1'); |
|||
} |
|||
|
|||
else if (cluster.isMaster) { |
|||
|
|||
assert.equal('NODE_UNIQUE_ID' in process.env, false, |
|||
'cluster.isMaster should not be true when NODE_UNIQUE_ID is set'); |
|||
|
|||
var checks = { |
|||
cluster: { |
|||
events: { |
|||
fork: false, |
|||
online: false, |
|||
listening: false, |
|||
death: false |
|||
}, |
|||
equal: { |
|||
fork: false, |
|||
online: false, |
|||
listening: false, |
|||
death: false |
|||
} |
|||
}, |
|||
|
|||
worker: { |
|||
events: { |
|||
online: false, |
|||
listening: false, |
|||
death: false |
|||
}, |
|||
equal: { |
|||
online: false, |
|||
listening: false, |
|||
death: false |
|||
}, |
|||
states: { |
|||
none: false, |
|||
online: false, |
|||
listening: false, |
|||
dead: false |
|||
} |
|||
} |
|||
}; |
|||
|
|||
var worker; |
|||
var stateNames = Object.keys(checks.worker.states); |
|||
|
|||
//Check events, states, and emit arguments
|
|||
forEach(checks.cluster.events, function(bool, name, index) { |
|||
|
|||
//Listen on event
|
|||
cluster.on(name, function(/* worker */) { |
|||
|
|||
//Set event
|
|||
checks.cluster.events[name] = true; |
|||
|
|||
//Check argument
|
|||
checks.cluster.equal[name] = worker === arguments[0]; |
|||
|
|||
//Check state
|
|||
var state = stateNames[index]; |
|||
checks.worker.states[state] = (state === worker.state); |
|||
}); |
|||
}); |
|||
|
|||
//Kill worker when listening
|
|||
cluster.on('listening', function() { |
|||
worker.destroy(); |
|||
}); |
|||
|
|||
//Kill process when worker is killed
|
|||
cluster.on('death', function() { |
|||
process.exit(0); |
|||
}); |
|||
|
|||
//Create worker
|
|||
worker = cluster.fork(); |
|||
assert.ok(worker instanceof cluster.Worker, |
|||
'the worker is not a instance of the Worker constructor'); |
|||
|
|||
//Check event
|
|||
forEach(checks.worker.events, function(bool, name, index) { |
|||
worker.on(name, function() { |
|||
//Set event
|
|||
checks.worker.events[name] = true; |
|||
|
|||
//Check argument
|
|||
checks.worker.equal[name] = worker === arguments[0]; |
|||
}); |
|||
}); |
|||
|
|||
//Check all values
|
|||
process.once('exit', function() { |
|||
//Check cluster events
|
|||
forEach(checks.cluster.events, function(check, name) { |
|||
assert.ok(check, 'The cluster event "' + name + '" on the cluster ' + |
|||
'object did not fire'); |
|||
}); |
|||
|
|||
//Check cluster event arguments
|
|||
forEach(checks.cluster.equal, function(check, name) { |
|||
assert.ok(check, 'The cluster event "' + name + '" did not emit ' + |
|||
'with corrent argument'); |
|||
}); |
|||
|
|||
//Check worker states
|
|||
forEach(checks.worker.states, function(check, name) { |
|||
assert.ok(check, 'The worker state "' + name + '" was not set to true'); |
|||
}); |
|||
|
|||
//Check worker events
|
|||
forEach(checks.worker.events, function(check, name) { |
|||
assert.ok(check, 'The worker event "' + name + '" on the worker object ' + |
|||
'did not fire'); |
|||
}); |
|||
|
|||
//Check worker event arguments
|
|||
forEach(checks.worker.equal, function(check, name) { |
|||
assert.ok(check, 'The worker event "' + name + '" did not emit with ' + |
|||
'corrent argument'); |
|||
}); |
|||
}); |
|||
|
|||
} |
@ -0,0 +1,130 @@ |
|||
// Copyright Joyent, Inc. and other Node contributors.
|
|||
//
|
|||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
// copy of this software and associated documentation files (the
|
|||
// "Software"), to deal in the Software without restriction, including
|
|||
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
// persons to whom the Software is furnished to do so, subject to the
|
|||
// following conditions:
|
|||
//
|
|||
// The above copyright notice and this permission notice shall be included
|
|||
// in all copies or substantial portions of the Software.
|
|||
//
|
|||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|||
|
|||
var common = require('../common'); |
|||
var assert = require('assert'); |
|||
var cluster = require('cluster'); |
|||
var net = require('net'); |
|||
|
|||
function forEach(obj, fn) { |
|||
Object.keys(obj).forEach(function(name, index) { |
|||
fn(obj[name], name, index); |
|||
}); |
|||
} |
|||
|
|||
if (cluster.isWorker) { |
|||
// Create a tcp server
|
|||
// this will be used as cluster-shared-server
|
|||
// and as an alternativ IPC channel
|
|||
var server = net.Server(); |
|||
server.on('connection', function(socket) { |
|||
|
|||
// Tell master using TCP socket that a message is received
|
|||
process.on('message', function(message) { |
|||
socket.write(JSON.stringify({ |
|||
code: 'received message', |
|||
echo: message |
|||
})); |
|||
}); |
|||
|
|||
process.send('message from worker'); |
|||
}); |
|||
|
|||
server.listen(common.PORT, '127.0.0.1'); |
|||
} |
|||
|
|||
else if (cluster.isMaster) { |
|||
|
|||
var checks = { |
|||
master: { |
|||
'receive': false, |
|||
'correct': false |
|||
}, |
|||
worker: { |
|||
'receive': false, |
|||
'correct': false |
|||
} |
|||
}; |
|||
|
|||
|
|||
var client; |
|||
var check = function(type, result) { |
|||
checks[type].receive = true; |
|||
checks[type].correct = result; |
|||
|
|||
var missing = false; |
|||
forEach(checks, function(type) { |
|||
if (type.receive === false) missing = true; |
|||
}); |
|||
|
|||
if (missing === false) { |
|||
client.end(); |
|||
} |
|||
}; |
|||
|
|||
// Spawn worker
|
|||
var worker = cluster.fork(); |
|||
|
|||
// When a IPC message is resicved form the worker
|
|||
worker.on('message', function(message) { |
|||
check('master', message === 'message from worker'); |
|||
}); |
|||
|
|||
// When a TCP connection is made with the worker connect to it
|
|||
worker.on('listening', function() { |
|||
|
|||
client = net.connect(common.PORT, function() { |
|||
|
|||
//Send message to worker
|
|||
worker.send('message from master'); |
|||
}); |
|||
|
|||
client.on('data', function(data) { |
|||
// All data is JSON
|
|||
data = JSON.parse(data.toString()); |
|||
|
|||
if (data.code === 'received message') { |
|||
check('worker', data.echo === 'message from master'); |
|||
} else { |
|||
throw new Error('worng TCP message recived: ' + data); |
|||
} |
|||
}); |
|||
|
|||
// When the connection ends kill worker and shutdown process
|
|||
client.on('end', function() { |
|||
worker.destroy(); |
|||
}); |
|||
|
|||
worker.on('death', function() { |
|||
process.exit(0); |
|||
}); |
|||
|
|||
}); |
|||
|
|||
process.once('exit', function() { |
|||
forEach(checks, function(check, type) { |
|||
assert.ok(check.receive, 'The ' + type + ' did not receive any message'); |
|||
assert.ok(check.correct, |
|||
'The ' + type + ' did not get the correct message'); |
|||
}); |
|||
}); |
|||
} |
Loading…
Reference in new issue