'use strict'; // Flags: --expose-internals // Make sure http.request() can catch immediate errors in // net.createConnection(). const common = require('../common'); const assert = require('assert'); const net = require('net'); const http = require('http'); const { internalBinding } = require('internal/test/binding'); const { UV_ENETUNREACH } = internalBinding('uv'); const { newAsyncId, symbols: { async_id_symbol } } = require('internal/async_hooks'); const agent = new http.Agent(); agent.createConnection = common.mustCall((cfg) => { const sock = new net.Socket(); // Fake the handle so we can enforce returning an immediate error sock._handle = { connect: common.mustCall((req, addr, port) => { return UV_ENETUNREACH; }), readStart() {}, close() {} }; // Simulate just enough socket handle initialization sock[async_id_symbol] = newAsyncId(); sock.connect(cfg); return sock; }); http.get({ host: '127.0.0.1', port: 1, agent }).on('error', common.mustCall((err) => { assert.strictEqual(err.code, 'ENETUNREACH'); }));