diff options
author | Sakthipriyan Vairamani <thechargingvolcano@gmail.com> | 2015-07-19 19:20:21 +0000 |
---|---|---|
committer | Sakthipriyan Vairamani <thechargingvolcano@gmail.com> | 2015-08-27 11:35:23 +0530 |
commit | bdef668881498f519e4a9432a239d5178c00e87a (patch) | |
tree | 6b9510b3e22c467b48676302e6faa621e6b63f20 /test/parallel/test-cluster-eaccess.js | |
parent | 34e25b2313cd0b4027cbfb5e626596e4b9cff038 (diff) | |
download | android-node-v8-bdef668881498f519e4a9432a239d5178c00e87a.tar.gz android-node-v8-bdef668881498f519e4a9432a239d5178c00e87a.tar.bz2 android-node-v8-bdef668881498f519e4a9432a239d5178c00e87a.zip |
test: handling failure cases properly
Refer: https://github.com/nodejs/io.js/issues/1543
When this test fails, it leaves dead processes in the system. This
patch makes sure that the child processes exit first, in case of
errors.
PR-URL: https://github.com/nodejs/node/pull/2206
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'test/parallel/test-cluster-eaccess.js')
-rw-r--r-- | test/parallel/test-cluster-eaccess.js | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/test/parallel/test-cluster-eaccess.js b/test/parallel/test-cluster-eaccess.js index ad4de97e38..b8c05a2c8a 100644 --- a/test/parallel/test-cluster-eaccess.js +++ b/test/parallel/test-cluster-eaccess.js @@ -1,41 +1,51 @@ 'use strict'; -// test that errors propagated from cluster children are properly -// received in their master creates an EADDRINUSE condition by also -// forking a child process to listen on a socket - -var common = require('../common'); -var assert = require('assert'); -var cluster = require('cluster'); -var fork = require('child_process').fork; -var fs = require('fs'); -var net = require('net'); +// Test that errors propagated from cluster workers are properly +// received in their master. Creates an EADDRINUSE condition by forking +// a process in child cluster and propagates the error to the master. +const common = require('../common'); +const assert = require('assert'); +const cluster = require('cluster'); +const fork = require('child_process').fork; +const fs = require('fs'); +const net = require('net'); if (cluster.isMaster) { - var worker = cluster.fork(); - var gotError = 0; - worker.on('message', function(err) { - gotError++; + const worker = cluster.fork(); + + // makes sure master is able to fork the worker + cluster.on('fork', common.mustCall(function() {})); + + // makes sure the worker is ready + worker.on('online', common.mustCall(function() {})); + + worker.on('message', common.mustCall(function(err) { + // disconnect first, so that we will not leave zombies + worker.disconnect(); + console.log(err); assert.strictEqual('EADDRINUSE', err.code); - worker.disconnect(); - }); + })); + process.on('exit', function() { console.log('master exited'); try { fs.unlinkSync(common.PIPE); } catch (e) { } - assert.equal(gotError, 1); }); + } else { var cp = fork(common.fixturesDir + '/listen-on-socket-and-exit.js', { stdio: 'inherit' }); // message from the child indicates it's ready and listening - cp.on('message', function() { - var server = net.createServer().listen(common.PIPE, function() { - console.log('parent listening, should not be!'); + cp.on('message', common.mustCall(function() { + const server = net.createServer().listen(common.PIPE, function() { + // message child process so that it can exit + cp.send('end'); + // inform master about the unexpected situation + process.send('PIPE should have been in use.'); }); server.on('error', function(err) { @@ -45,5 +55,6 @@ if (cluster.isMaster) { // propagate error to parent process.send(err); }); - }); + + })); } |