'use strict';
const common = require('../common');
const fixtures = require('../common/fixtures');

// This test verifies that http2 server support ALPNCallback option.

if (!common.hasCrypto) common.skip('missing crypto');

const assert = require('assert');
const h2 = require('http2');
const tls = require('tls');

{
  // Server sets two incompatible ALPN options:
  assert.throws(() => h2.createSecureServer({
    ALPNCallback: () => 'a',
    ALPNProtocols: ['b', 'c']
  }), (error) => error.code === 'ERR_TLS_ALPN_CALLBACK_WITH_PROTOCOLS');
}

{
  const server = h2.createSecureServer({
    key: fixtures.readKey('rsa_private.pem'),
    cert: fixtures.readKey('rsa_cert.crt'),
    ALPNCallback: () => 'a',
  });

  server.on(
    'secureConnection',
    common.mustCall((socket) => {
      assert.strictEqual(socket.alpnProtocol, 'a');
      socket.end();
      server.close();
    })
  );

  server.listen(0, common.mustCall(() => {
    const client = tls.connect({
      port: server.address().port,
      rejectUnauthorized: false,
      ALPNProtocols: ['a'],
    }, common.mustCall(() => {
      assert.strictEqual(client.alpnProtocol, 'a');
      client.end();
    }));
  }));
}
