'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const dc = require('diagnostics_channel');

const isHTTPServer = (server) => server instanceof http.Server;
const isOutgoingMessage = (object) => object instanceof http.OutgoingMessage;

dc.subscribe('http.client.request.created', common.mustCall(({ request }) => {
  assert.strictEqual(request.getHeader('foo'), 'bar');
  assert.strictEqual(request.getHeader('baz'), undefined);
  assert.strictEqual(isOutgoingMessage(request), true);
  assert.strictEqual(isHTTPServer(server), true);
}));

dc.subscribe('http.client.request.start', common.mustCall(({ request }) => {
  assert.strictEqual(request.getHeader('foo'), 'bar');
  assert.strictEqual(request.getHeader('baz'), 'bar');
  assert.strictEqual(isOutgoingMessage(request), true);
}));

const server = http.createServer(common.mustCall((_, res) => {
  res.end('done');
}));

server.listen(common.mustCall(async () => {
  const { port } = server.address();
  const req = http.request({
    port,
    headers: {
      'foo': 'bar',
    }
  }, common.mustCall(() => {
    server.close();
  }));
  req.setHeader('baz', 'bar');
  req.end();
}));
