'use strict';
const common = require('../common');
if (!common.hasCrypto)
  common.skip('missing crypto');

const assert = require('assert');
const crypto = require('crypto');
const https = require('https');
const fixtures = require('../common/fixtures');

const options = {
  key: fixtures.readKey('agent1-key.pem'),
  cert: fixtures.readKey('agent1-cert.pem'),
  ca: fixtures.readKey('ca1-cert.pem')
};

const server = https.Server(options, function(req, res) {
  res.writeHead(200);
  res.end('hello world\n');
});

function getBaseOptions(port) {
  return {
    path: '/',
    port: port,
    ca: options.ca,
    rejectUnauthorized: true,
    servername: 'agent1',
  };
}

const updatedValues = new Map([
  ['dhparam', fixtures.readKey('dh2048.pem')],
  ['ecdhCurve', 'secp384r1'],
  ['honorCipherOrder', true],
  ['secureOptions', crypto.constants.SSL_OP_CIPHER_SERVER_PREFERENCE],
  ['secureProtocol', 'TLSv1_method'],
  ['sessionIdContext', 'sessionIdContext'],
]);

function variations(iter, port, cb) {
  const { done, value } = iter.next();
  if (done) {
    return common.mustCall(cb);
  } else {
    const [key, val] = value;
    return common.mustCall(function(res) {
      res.resume();
      https.globalAgent.once('free', common.mustCall(function() {
        https.get(
          Object.assign({}, getBaseOptions(port), { [key]: val }),
          variations(iter, port, cb)
        );
      }));
    });
  }
}

server.listen(0, common.mustCall(function() {
  const port = this.address().port;
  const globalAgent = https.globalAgent;
  globalAgent.keepAlive = true;
  https.get(getBaseOptions(port), variations(
    updatedValues.entries(),
    port,
    common.mustCall(function(res) {
      res.resume();
      globalAgent.once('free', common.mustCall(function() {
        // Verify that different keep-alived connections are created
        // for the base call and each variation
        const keys = Object.keys(globalAgent.freeSockets);
        assert.strictEqual(keys.length, 1 + updatedValues.size);
        let i = 1;
        for (const [, value] of updatedValues) {
          assert.ok(
            keys[i].startsWith(value.toString() + ':') ||
            keys[i].endsWith(':' + value.toString()) ||
            keys[i].includes(':' + value.toString() + ':')
          );
          i++;
        }
        globalAgent.destroy();
        server.close();
      }));
    })
  ));
}));
