1'use strict';
2const common = require('../common');
3const assert = require('assert');
4const http = require('http');
5
6const baseOptions = {
7  method: 'GET',
8  port: undefined,
9  host: common.localhostIPv4,
10};
11
12const failingAgentOptions = [
13  true,
14  'agent',
15  {},
16  1,
17  () => null,
18  Symbol(),
19];
20
21const acceptableAgentOptions = [
22  false,
23  undefined,
24  null,
25  new http.Agent(),
26];
27
28const server = http.createServer((req, res) => {
29  res.end('hello');
30});
31
32let numberOfResponses = 0;
33
34function createRequest(agent) {
35  const options = Object.assign(baseOptions, { agent });
36  const request = http.request(options);
37  request.end();
38  request.on('response', common.mustCall(() => {
39    numberOfResponses++;
40    if (numberOfResponses === acceptableAgentOptions.length) {
41      server.close();
42    }
43  }));
44}
45
46server.listen(0, baseOptions.host, common.mustCall(function() {
47  baseOptions.port = this.address().port;
48
49  failingAgentOptions.forEach((agent) => {
50    assert.throws(
51      () => createRequest(agent),
52      {
53        code: 'ERR_INVALID_ARG_TYPE',
54        name: 'TypeError',
55        message: 'The "options.agent" property must be one of Agent-like ' +
56                 'Object, undefined, or false.' +
57                 common.invalidArgTypeHelper(agent)
58      }
59    );
60  });
61
62  acceptableAgentOptions.forEach((agent) => {
63    createRequest(agent);
64  });
65}));
66
67process.on('exit', () => {
68  assert.strictEqual(numberOfResponses, acceptableAgentOptions.length);
69});
70