// Flags: --expose-internals 'use strict'; const common = require('../common'); const { internalBinding } = require('internal/test/binding'); const async_wrap = internalBinding('async_wrap'); const assert = require('assert'); const async_hooks = require('async_hooks'); const RUNS = 5; let test_id = null; let run_cntr = 0; let hooks = null; process.on('beforeExit', common.mustCall(() => { process.removeAllListeners('uncaughtException'); hooks.disable(); assert.strictEqual(test_id, null); assert.strictEqual(run_cntr, RUNS); })); hooks = async_hooks.createHook({ destroy(id) { if (id === test_id) { run_cntr++; test_id = null; } }, }).enable(); (function runner(n) { assert.strictEqual(test_id, null); if (n <= 0) return; test_id = (Math.random() * 1e9) >>> 0; async_wrap.queueDestroyAsyncId(test_id); setImmediate(common.mustCall(runner), n - 1); })(RUNS);