'use strict'; require('../common'); const assert = require('assert'); const net = require('net'); // Sets the server's maxConnections property to 1. // Open 2 connections (connection 0 and connection 1). // Connection 0 should be accepted. // Connection 1 should be rejected. // Closes connection 0. // Open 2 more connections (connection 2 and 3). // Connection 2 should be accepted. // Connection 3 should be rejected. const connections = []; const received = []; const sent = []; function createConnection(index) { console.error(`creating connection ${index}`); return new Promise(function(resolve, reject) { const connection = net.createConnection(server.address().port, function() { const msg = String(index); console.error(`sending message: ${msg}`); this.write(msg); sent.push(msg); }); connection.on('error', function(err) { assert.strictEqual(err.code, 'ECONNRESET'); resolve(); }); connection.on('data', function(e) { console.error(`connection ${index} received response`); resolve(); }); connection.on('end', function() { console.error(`ending ${index}`); resolve(); }); connections[index] = connection; }); } function closeConnection(index) { console.error(`closing connection ${index}`); return new Promise(function(resolve, reject) { connections[index].on('end', function() { resolve(); }); connections[index].end(); }); } const server = net.createServer(function(socket) { socket.on('data', function(data) { console.error(`received message: ${data}`); received.push(String(data)); socket.write('acknowledged'); }); }); server.maxConnections = 1; server.listen(0, function() { createConnection(0) .then(createConnection.bind(null, 1)) .then(closeConnection.bind(null, 0)) .then(createConnection.bind(null, 2)) .then(createConnection.bind(null, 3)) .then(server.close.bind(server)) .then(closeConnection.bind(null, 2)); }); process.on('exit', function() { // Confirm that all connections tried to send data... assert.deepStrictEqual(sent, ['0', '1', '2', '3']); // ...but that only connections 0 and 2 were successful. assert.deepStrictEqual(received, ['0', '2']); });