text: 'use strict';
  const common = require('../common');
  const assert = require('assert');
  
  if (!common.hasCrypto)
    common.skip('missing crypto');
  
  const https = require('https');
  const crypto = require('crypto');
  const fixtures = require('../common/fixtures');
  
  const options = {
    key: fixtures.readKey('agent1-key.pem'),
    cert: fixtures.readKey('agent1-cert.pem')
  };
  
  const ca = fixtures.readKey('ca1-cert.pem');
  
  const clientSessions = {};
  let serverRequests = 0;
  
  const agent = new https.Agent({
    maxCachedSessions: 1
  });
  
  const server = https.createServer(options, function(req, res) {
    if (req.url === '/drop-key')
      server.setTicketKeys(crypto.randomBytes(48));
  
    serverRequests++;
    res.end('ok');
  }).listen(0, function() {
    const queue = [
      {
        name: 'first',
  
        method: 'GET',
        path: '/',
        servername: 'agent1',
        ca: ca,
        port: this.address().port
      },
      {
        name: 'first-reuse',
  
        method: 'GET',
        path: '/',
        servername: 'agent1',
        ca: ca,
        port: this.address().port
      },
      {
        name: 'cipher-change',
  
        method: 'GET',
        path: '/',
        servername: 'agent1',
  
        // Choose different cipher to use different cache entry
        ciphers: 'AES256-SHA',
        ca: ca,
        port: this.address().port
      },
      // Change the ticket key to ensure session is updated in cache
      {
        name: 'before-drop',
  
        method: 'GET',
        path: '/drop-key',
        servername: 'agent1',
        ca: ca,
        port: this.address().port
      },
  
      // Ticket will be updated starting from this
      {
        name: 'after-drop',
  
        method: 'GET',
        path: '/',
        servername: 'agent1',
        ca: ca,
        port: this.address().port
      },
      {
        name: 'after-drop-reuse',
  
        method: 'GET',
        path: '/',
        servername: 'agent1',
        ca: ca,
        port: this.address().port
      }
    ];
  
    function request() {
      const options = queue.shift();
      options.agent = agent;
      https.request(options, function(res) {
        clientSessions[options.name] = res.socket.getSession();
  
        res.resume();
        res.on('end', function() {
          if (queue.length !== 0)
            return request();
          server.close();
        });
      }).end();
    }
    request();
  });
  
  process.on('exit', function() {
    assert.strictEqual(serverRequests, 6);
    assert.strictEqual(clientSessions['first'].toString('hex'),
                       clientSessions['first-reuse'].toString('hex'));
    assert.notStrictEqual(clientSessions['first'].toString('hex'),
                          clientSessions['cipher-change'].toString('hex'));
    assert.notStrictEqual(clientSessions['first'].toString('hex'),
                          clientSessions['before-drop'].toString('hex'));
    assert.notStrictEqual(clientSessions['cipher-change'].toString('hex'),
                          clientSessions['before-drop'].toString('hex'));
    assert.notStrictEqual(clientSessions['before-drop'].toString('hex'),
                          clientSessions['after-drop'].toString('hex'));
    assert.strictEqual(clientSessions['after-drop'].toString('hex'),
                       clientSessions['after-drop-reuse'].toString('hex'));
  });
  