1'use strict';
2const common = require('../common');
3const assert = require('assert');
4const net = require('net');
5const cluster = require('cluster');
6const tmpdir = require('../common/tmpdir');
7
8// The core has bug in handling pipe handle by ipc when platform is win32,
9// it can be triggered on win32. I will fix it in another pr.
10if (common.isWindows)
11  common.skip('no setSimultaneousAccepts on pipe handle');
12
13let connectionCount = 0;
14let listenCount = 0;
15let worker1;
16let worker2;
17
18function request(path) {
19  for (let i = 0; i < 10; i++) {
20    net.connect(path);
21  }
22}
23
24function handleMessage(message) {
25  assert.match(message.action, /listen|connection/);
26  if (message.action === 'listen') {
27    if (++listenCount === 2) {
28      request(common.PIPE);
29    }
30  } else if (message.action === 'connection') {
31    if (++connectionCount === 10) {
32      worker1.send({ action: 'disconnect' });
33      worker2.send({ action: 'disconnect' });
34    }
35  }
36}
37
38if (cluster.isPrimary) {
39  cluster.schedulingPolicy = cluster.SCHED_RR;
40  tmpdir.refresh();
41  worker1 = cluster.fork({ maxConnections: 1, pipePath: common.PIPE });
42  worker2 = cluster.fork({ maxConnections: 9, pipePath: common.PIPE });
43  worker1.on('message', common.mustCall((message) => {
44    handleMessage(message);
45  }, 2));
46  worker2.on('message', common.mustCall((message) => {
47    handleMessage(message);
48  }, 10));
49} else {
50  const server = net.createServer(common.mustCall((socket) => {
51    process.send({ action: 'connection' });
52  }, +process.env.maxConnections));
53
54  server.listen(process.env.pipePath, common.mustCall(() => {
55    process.send({ action: 'listen' });
56  }));
57
58  server.maxConnections = +process.env.maxConnections;
59
60  process.on('message', common.mustCall((message) => {
61    assert.strictEqual(message.action, 'disconnect');
62    process.disconnect();
63  }));
64}
65