text: 'use strict';
  
  const common = require('../common');
  const assert = require('assert');
  const http = require('http');
  const Countdown = require('../common/countdown');
  
  assert.throws(() => new http.Agent({
    maxTotalSockets: 'test',
  }), {
    code: 'ERR_INVALID_ARG_TYPE',
    name: 'TypeError',
    message: 'The "maxTotalSockets" argument must be of type number. ' +
      "Received type string ('test')",
  });
  
  [-1, 0, NaN].forEach((item) => {
    assert.throws(() => new http.Agent({
      maxTotalSockets: item,
    }), {
      code: 'ERR_OUT_OF_RANGE',
      name: 'RangeError',
      message: 'The value of "maxTotalSockets" is out of range. ' +
        `It must be > 0. Received ${item}`,
    });
  });
  
  assert.ok(new http.Agent({
    maxTotalSockets: Infinity,
  }));
  
  function start(param = {}) {
    const { maxTotalSockets, maxSockets } = param;
  
    const agent = new http.Agent({
      keepAlive: true,
      keepAliveMsecs: 1000,
      maxTotalSockets,
      maxSockets,
      maxFreeSockets: 3
    });
  
    const server = http.createServer(common.mustCall((req, res) => {
      res.end('hello world');
    }, 6));
    const server2 = http.createServer(common.mustCall((req, res) => {
      res.end('hello world');
    }, 6));
  
    server.keepAliveTimeout = 0;
    server2.keepAliveTimeout = 0;
  
    const countdown = new Countdown(12, () => {
      assert.strictEqual(getRequestCount(), 0);
      agent.destroy();
      server.close();
      server2.close();
    });
  
    function handler(s) {
      for (let i = 0; i < 6; i++) {
        http.get({
          host: 'localhost',
          port: s.address().port,
          agent,
          path: `/${i}`,
        }, common.mustCall((res) => {
          assert.strictEqual(res.statusCode, 200);
          res.resume();
          res.on('end', common.mustCall(() => {
            for (const key of Object.keys(agent.sockets)) {
              assert(agent.sockets[key].length <= maxSockets);
            }
            assert(getTotalSocketsCount() <= maxTotalSockets);
            countdown.dec();
          }));
        }));
      }
    }
  
    function getTotalSocketsCount() {
      let num = 0;
      for (const key of Object.keys(agent.sockets)) {
        num += agent.sockets[key].length;
      }
      return num;
    }
  
    function getRequestCount() {
      let num = 0;
      for (const key of Object.keys(agent.requests)) {
        num += agent.requests[key].length;
      }
      return num;
    }
  
    server.listen(0, common.mustCall(() => handler(server)));
    server2.listen(0, common.mustCall(() => handler(server2)));
  }
  
  // If maxTotalSockets is larger than maxSockets,
  // then the origin check will be skipped
  // when the socket is removed.
  [{
    maxTotalSockets: 2,
    maxSockets: 3,
  }, {
    maxTotalSockets: 3,
    maxSockets: 2,
  }, {
    maxTotalSockets: 2,
    maxSockets: 2,
  }].forEach(start);
  