• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3
4const common = require('../common');
5const StreamWrap = require('internal/js_stream_socket');
6const net = require('net');
7
8// This test ensures that when we directly call `socket.destroy()` without
9// having called `socket.end()` on an instance of streamWrap, it will
10// still emit EOF which makes the socket on the other side emit "end" and
11// "close" events, and vice versa.
12{
13  let port;
14  const server = net.createServer((socket) => {
15    socket.on('error', common.mustNotCall());
16    socket.on('end', common.mustNotCall());
17    socket.on('close', common.mustCall());
18    socket.destroy();
19  });
20
21  server.listen(() => {
22    port = server.address().port;
23    createSocket();
24  });
25
26  function createSocket() {
27    let streamWrap;
28    const socket = new net.connect({
29      port,
30    }, () => {
31      socket.on('error', common.mustNotCall());
32      socket.on('end', common.mustCall());
33      socket.on('close', common.mustCall());
34
35      streamWrap.on('error', common.mustNotCall());
36      // The "end" events will be emitted which is as same as
37      // the same situation for an instance of `net.Socket` without
38      // `StreamWrap`.
39      streamWrap.on('end', common.mustCall());
40      // Destroying a socket in the server side should emit EOF and cause
41      // the corresponding client-side socket closed.
42      streamWrap.on('close', common.mustCall(() => {
43        server.close();
44      }));
45    });
46    streamWrap = new StreamWrap(socket);
47  }
48}
49
50// Destroy the streamWrap and test again.
51{
52  let port;
53  const server = net.createServer((socket) => {
54    socket.on('error', common.mustNotCall());
55    socket.on('end', common.mustCall());
56    socket.on('close', common.mustCall(() => {
57      server.close();
58    }));
59    // Do not `socket.end()` and directly `socket.destroy()`.
60  });
61
62  server.listen(() => {
63    port = server.address().port;
64    createSocket();
65  });
66
67  function createSocket() {
68    let streamWrap;
69    const socket = new net.connect({
70      port,
71    }, () => {
72      socket.on('error', common.mustNotCall());
73      socket.on('end', common.mustNotCall());
74      socket.on('close', common.mustCall());
75
76      streamWrap.on('error', common.mustNotCall());
77      streamWrap.on('end', common.mustNotCall());
78      // Destroying a socket in the server side should emit EOF and cause
79      // the corresponding client-side socket closed.
80      streamWrap.on('close', common.mustCall());
81      streamWrap.destroy();
82    });
83    streamWrap = new StreamWrap(socket);
84  }
85}
86
87// Destroy the client socket and test again.
88{
89  let port;
90  const server = net.createServer((socket) => {
91    socket.on('error', common.mustNotCall());
92    socket.on('end', common.mustCall());
93    socket.on('close', common.mustCall(() => {
94      server.close();
95    }));
96  });
97
98  server.listen(() => {
99    port = server.address().port;
100    createSocket();
101  });
102
103  function createSocket() {
104    let streamWrap;
105    const socket = new net.connect({
106      port,
107    }, () => {
108      socket.on('error', common.mustNotCall());
109      socket.on('end', common.mustNotCall());
110      socket.on('close', common.mustCall());
111
112      streamWrap.on('error', common.mustNotCall());
113      streamWrap.on('end', common.mustNotCall());
114      streamWrap.on('close', common.mustCall());
115      socket.destroy();
116    });
117    streamWrap = new StreamWrap(socket);
118  }
119}
120