'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const Countdown = require('../common/countdown');

const agent = new http.Agent({
  keepAlive: true,
  keepAliveMsecs: 1000,
  maxSockets: 2,
  maxFreeSockets: 2
});

const server = http.createServer(common.mustCall((req, res) => {
  res.end('hello world');
}, 2));

server.keepAliveTimeout = 0;

function get(path, callback) {
  return http.get({
    host: 'localhost',
    port: server.address().port,
    agent: agent,
    path: path
  }, callback);
}

const countdown = new Countdown(2, common.mustCall(() => {
  const freepool = agent.freeSockets[Object.keys(agent.freeSockets)[0]];
  assert.strictEqual(freepool.length, 2,
                     `expect keep 2 free sockets, but got ${freepool.length}`);
  agent.destroy();
  server.close();
}));

function dec() {
  process.nextTick(() => countdown.dec());
}

function onGet(res) {
  assert.strictEqual(res.statusCode, 200);
  res.resume();
  res.on('end', common.mustCall(dec));
}

server.listen(0, common.mustCall(() => {
  get('/1', common.mustCall(onGet));
  get('/2', common.mustCall(onGet));
}));
