'use strict'; require('../common'); const assert = require('assert'); const async_hooks = require('async_hooks'); const http = require('http'); // Regression test for https://github.com/nodejs/node/issues/19859. // Checks that matching destroys are emitted when creating new/reusing old http // parser instances. const N = 50; const KEEP_ALIVE = 100; const createdIds = []; const destroyedIds = []; async_hooks.createHook({ init: (asyncId, type) => { if (type === 'HTTPINCOMINGMESSAGE' || type === 'HTTPCLIENTREQUEST') { createdIds.push(asyncId); } }, destroy: (asyncId) => { if (createdIds.includes(asyncId)) { destroyedIds.push(asyncId); } if (destroyedIds.length === 2 * N) { server.close(); } } }).enable(); const server = http.createServer((req, res) => { res.end('Hello'); }); const keepAliveAgent = new http.Agent({ keepAlive: true, keepAliveMsecs: KEEP_ALIVE, }); server.listen(0, function() { for (let i = 0; i < N; ++i) { (function makeRequest() { http.get({ port: server.address().port, agent: keepAliveAgent }, function(res) { res.resume(); }); })(); } }); function checkOnExit() { assert.deepStrictEqual(destroyedIds.sort(), createdIds.sort()); // There should be two IDs for each request. assert.strictEqual(createdIds.length, N * 2); } process.on('SIGTERM', () => { // Catching SIGTERM and calling `process.exit(1)` so that the `exit` event // is triggered and the assertions are checked. This can be useful for // troubleshooting this test if it times out. process.exit(1); }); // Ordinary exit. process.on('exit', checkOnExit);