| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| const net = require('net'); |
| const cluster = require('cluster'); |
| const tmpdir = require('../common/tmpdir'); |
| |
| // The core has bug in handling pipe handle by ipc when platform is win32, |
| // it can be triggered on win32. I will fix it in another pr. |
| if (common.isWindows) |
| common.skip('no setSimultaneousAccepts on pipe handle'); |
| |
| const totalConns = 10; |
| const totalWorkers = 3; |
| let worker0; |
| let worker1; |
| let worker2; |
| let connectionCount = 0; |
| let listenCount = 0; |
| |
| function request(path) { |
| for (let i = 0; i < totalConns; i++) { |
| net.connect(path); |
| } |
| } |
| |
| function handleMessage(message) { |
| assert.match(message.action, /listen|connection/); |
| if (message.action === 'listen') { |
| if (++listenCount === totalWorkers) { |
| request(common.PIPE); |
| } |
| } else if (message.action === 'connection') { |
| if (++connectionCount === totalConns) { |
| worker0.send({ action: 'disconnect' }); |
| worker1.send({ action: 'disconnect' }); |
| worker2.send({ action: 'disconnect' }); |
| } |
| } |
| } |
| |
| if (cluster.isPrimary) { |
| cluster.schedulingPolicy = cluster.SCHED_RR; |
| tmpdir.refresh(); |
| worker0 = cluster.fork({ maxConnections: 0, pipePath: common.PIPE }); |
| worker1 = cluster.fork({ maxConnections: 1, pipePath: common.PIPE }); |
| worker2 = cluster.fork({ maxConnections: 9, pipePath: common.PIPE }); |
| // expected = { action: 'listen' } + maxConnections * { action: 'connection' } |
| worker0.on('message', common.mustCall((message) => { |
| handleMessage(message); |
| }, 1)); |
| worker1.on('message', common.mustCall((message) => { |
| handleMessage(message); |
| }, 2)); |
| worker2.on('message', common.mustCall((message) => { |
| handleMessage(message); |
| }, 10)); |
| } else { |
| const server = net.createServer(common.mustCall((socket) => { |
| process.send({ action: 'connection' }); |
| }, +process.env.maxConnections)); |
| |
| server.listen(process.env.pipePath, common.mustCall(() => { |
| process.send({ action: 'listen' }); |
| })); |
| |
| server.maxConnections = +process.env.maxConnections; |
| |
| process.on('message', common.mustCall((message) => { |
| assert.strictEqual(message.action, 'disconnect'); |
| process.disconnect(); |
| })); |
| } |