• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const cluster = require('cluster');
6const net = require('net');
7
8assert.throws(() => {
9  new net.Socket({ fd: -1 });
10}, { code: 'ERR_OUT_OF_RANGE' });
11
12assert.throws(() => {
13  new net.Socket({ fd: 'foo' });
14}, { code: 'ERR_INVALID_ARG_TYPE' });
15
16function test(sock, readable, writable) {
17  let socket;
18  if (sock instanceof net.Socket) {
19    socket = sock;
20  } else {
21    socket = new net.Socket(sock);
22    socket.unref();
23  }
24
25  assert.strictEqual(socket.readable, readable);
26  assert.strictEqual(socket.writable, writable);
27}
28
29if (cluster.isMaster) {
30  test(undefined, true, true);
31
32  const server = net.createServer(common.mustCall((socket) => {
33    socket.unref();
34    test(socket, true, true);
35    test({ handle: socket._handle }, true, true);
36    test({ handle: socket._handle, readable: true, writable: true },
37         true, true);
38    server.close();
39  }));
40
41  server.listen(common.mustCall(() => {
42    const { port } = server.address();
43    const socket = net.connect(port, common.mustCall(() => {
44      test(socket, true, true);
45      socket.end();
46    }));
47
48    test(socket, true, true);
49  }));
50
51  cluster.setupMaster({
52    stdio: ['pipe', 'pipe', 'pipe', 'ipc', 'pipe', 'pipe', 'pipe']
53  });
54
55  const worker = cluster.fork();
56  worker.on('exit', common.mustCall((code, signal) => {
57    assert.strictEqual(code, 0);
58    assert.strictEqual(signal, null);
59  }));
60} else {
61  test(4, true, true);
62  test({ fd: 5 }, true, true);
63  test({ fd: 6, readable: true, writable: true }, true, true);
64  process.disconnect();
65}
66