diff options
author | Rich Trott <rtrott@gmail.com> | 2018-06-02 12:34:06 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2018-06-05 10:24:41 +0200 |
commit | 3c5b8b4602cd26e2e2c8eafdb3c74cb1cb1e13fd (patch) | |
tree | a876aa83e3295f45cef91dd79f3e48a522a50e65 /test/parallel/test-child-process-fork-net.js | |
parent | 5aa47bd26bc4beb011d87da35c93170b36381002 (diff) | |
download | android-node-v8-3c5b8b4602cd26e2e2c8eafdb3c74cb1cb1e13fd.tar.gz android-node-v8-3c5b8b4602cd26e2e2c8eafdb3c74cb1cb1e13fd.tar.bz2 android-node-v8-3c5b8b4602cd26e2e2c8eafdb3c74cb1cb1e13fd.zip |
test: refactor child-process-fork-net
Split test-child-process-fork-net into
test-child-process-fork-net-server and
test-child-process-fork-net-socket. Rename
test-child-process-fork-net2.js to test-child-process-fork-net.js.
Refs: https://github.com/nodejs/node/pull/21012
PR-URL: https://github.com/nodejs/node/pull/21095
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Diffstat (limited to 'test/parallel/test-child-process-fork-net.js')
-rw-r--r-- | test/parallel/test-child-process-fork-net.js | 251 |
1 files changed, 105 insertions, 146 deletions
diff --git a/test/parallel/test-child-process-fork-net.js b/test/parallel/test-child-process-fork-net.js index cfc8f564d2..babde351d3 100644 --- a/test/parallel/test-child-process-fork-net.js +++ b/test/parallel/test-child-process-fork-net.js @@ -24,182 +24,141 @@ const common = require('../common'); const assert = require('assert'); const fork = require('child_process').fork; const net = require('net'); - -function ProgressTracker(missing, callback) { - this.missing = missing; - this.callback = callback; -} -ProgressTracker.prototype.done = function() { - this.missing -= 1; - this.check(); -}; -ProgressTracker.prototype.check = function() { - if (this.missing === 0) this.callback(); -}; +const count = 12; if (process.argv[2] === 'child') { + const needEnd = []; + const id = process.argv[3]; + + process.on('message', function(m, socket) { + if (!socket) return; - let serverScope; + console.error(`[${id}] got socket ${m}`); - process.on('message', function onServer(msg, server) { - if (msg.what !== 'server') return; - process.removeListener('message', onServer); + // will call .end('end') or .write('write'); + socket[m](m); - serverScope = server; + socket.resume(); - server.on('connection', function(socket) { - console.log('CHILD: got connection'); - process.send({ what: 'connection' }); - socket.destroy(); + socket.on('data', function() { + console.error(`[${id}] socket.data ${m}`); }); - // Start making connection from parent. - console.log('CHILD: server listening'); - process.send({ what: 'listening' }); - }); + socket.on('end', function() { + console.error(`[${id}] socket.end ${m}`); + }); - process.on('message', function onClose(msg) { - if (msg.what !== 'close') return; - process.removeListener('message', onClose); + // store the unfinished socket + if (m === 'write') { + needEnd.push(socket); + } - serverScope.on('close', function() { - process.send({ what: 'close' }); + socket.on('close', function(had_error) { + console.error(`[${id}] socket.close ${had_error} ${m}`); }); - serverScope.close(); - }); - process.on('message', function onSocket(msg, socket) { - if (msg.what !== 'socket') return; - process.removeListener('message', onSocket); - socket.end('echo'); - console.log('CHILD: got socket'); + socket.on('finish', function() { + console.error(`[${id}] socket finished ${m}`); + }); }); - process.send({ what: 'ready' }); -} else { + process.on('message', function(m) { + if (m !== 'close') return; + console.error(`[${id}] got close message`); + needEnd.forEach(function(endMe, i) { + console.error(`[${id}] ending ${i}/${needEnd.length}`); + endMe.end('end'); + }); + }); - const child = fork(process.argv[1], ['child']); + process.on('disconnect', function() { + console.error(`[${id}] process disconnect, ending`); + needEnd.forEach(function(endMe, i) { + console.error(`[${id}] ending ${i}/${needEnd.length}`); + endMe.end('end'); + }); + }); - child.on('exit', common.mustCall(function(code, signal) { - const message = `CHILD: died with ${code}, ${signal}`; - assert.strictEqual(code, 0, message); - })); +} else { - // Send net.Server to child and test by connecting. - function testServer(callback) { + const child1 = fork(process.argv[1], ['child', '1']); + const child2 = fork(process.argv[1], ['child', '2']); + const child3 = fork(process.argv[1], ['child', '3']); + + const server = net.createServer(); + + let connected = 0; + let closed = 0; + server.on('connection', function(socket) { + switch (connected % 6) { + case 0: + child1.send('end', socket); break; + case 1: + child1.send('write', socket); break; + case 2: + child2.send('end', socket); break; + case 3: + child2.send('write', socket); break; + case 4: + child3.send('end', socket); break; + case 5: + child3.send('write', socket); break; + } + connected += 1; - // Destroy server execute callback when done. - const progress = new ProgressTracker(2, function() { - server.on('close', function() { - console.log('PARENT: server closed'); - child.send({ what: 'close' }); - }); - server.close(); + socket.once('close', function() { + console.log(`[m] socket closed, total ${++closed}`); }); - // We expect 4 connections and close events. - const connections = new ProgressTracker(4, progress.done.bind(progress)); - const closed = new ProgressTracker(4, progress.done.bind(progress)); - - // Create server and send it to child. - const server = net.createServer(); - server.on('connection', function(socket) { - console.log('PARENT: got connection'); - socket.destroy(); - connections.done(); - }); - server.on('listening', function() { - console.log('PARENT: server listening'); - child.send({ what: 'server' }, server); - }); - server.listen(0); - - // Handle client messages. - function messageHandlers(msg) { - - if (msg.what === 'listening') { - // Make connections. - let socket; - for (let i = 0; i < 4; i++) { - socket = net.connect(server.address().port, function() { - console.log('CLIENT: connected'); - }); - socket.on('close', function() { - closed.done(); - console.log('CLIENT: closed'); - }); - } - - } else if (msg.what === 'connection') { - // child got connection - connections.done(); - } else if (msg.what === 'close') { - child.removeListener('message', messageHandlers); - callback(); - } + if (connected === count) { + closeServer(); } + }); - child.on('message', messageHandlers); - } - - // Send net.Socket to child. - function testSocket(callback) { + let disconnected = 0; + server.on('listening', function() { - // Create a new server and connect to it, - // but the socket will be handled by the child. - const server = net.createServer(); - server.on('connection', function(socket) { - socket.on('close', function() { - console.log('CLIENT: socket closed'); + let j = count; + while (j--) { + const client = net.connect(this.address().port, '127.0.0.1'); + client.on('error', function() { + // This can happen if we kill the child too early. + // The client should still get a close event afterwards. + console.error('[m] CLIENT: error event'); }); - child.send({ what: 'socket' }, socket); - }); - server.on('close', function() { - console.log('PARENT: server closed'); - callback(); - }); - // Don't listen on the same port, because SmartOS sometimes says - // that the server's fd is closed, but it still cannot listen - // on the same port again. - // - // An isolated test for this would be lovely, but for now, this - // will have to do. - server.listen(0, function() { - console.log('testSocket, listening'); - const connect = net.connect(server.address().port); - let store = ''; - connect.on('data', function(chunk) { - store += chunk; - console.log('CLIENT: got data'); - }); - connect.on('close', function() { - console.log('CLIENT: closed'); - assert.strictEqual(store, 'echo'); - server.close(); + client.on('close', function() { + console.error('[m] CLIENT: close event'); + disconnected += 1; }); - }); - } + client.resume(); + } + }); - // Create server and send it to child. - let serverSuccess = false; - let socketSuccess = false; - child.on('message', function onReady(msg) { - if (msg.what !== 'ready') return; - child.removeListener('message', onReady); + let closeEmitted = false; + server.on('close', common.mustCall(function() { + closeEmitted = true; - testServer(function() { - serverSuccess = true; + child1.kill(); + child2.kill(); + child3.kill(); + })); - testSocket(function() { - socketSuccess = true; - }); - }); + server.listen(0, '127.0.0.1'); - }); + function closeServer() { + server.close(); + + setTimeout(function() { + assert(!closeEmitted); + child1.send('close'); + child2.send('close'); + child3.disconnect(); + }, 200); + } process.on('exit', function() { - assert.ok(serverSuccess); - assert.ok(socketSuccess); + assert.strictEqual(server._workers.length, 0); + assert.strictEqual(disconnected, count); + assert.strictEqual(connected, count); }); - } |