'use strict'; const common = require('../../common'); const assert = require('assert'); const async_hooks = require('async_hooks'); const test_async = require(`./build/${common.buildType}/test_async`); const events = []; let testId; const initAsyncId = async_hooks.executionAsyncId(); async_hooks.createHook({ init(id, provider, triggerAsyncId, resource) { if (provider === 'TestResource') { testId = id; events.push({ type: 'init', id, provider, triggerAsyncId, resource }); } }, before(id) { if (testId === id) { events.push({ type: 'before', id }); } }, after(id) { if (testId === id) { events.push({ type: 'after', id }); } }, destroy(id) { if (testId === id) { events.push({ type: 'destroy', id }); } } }).enable(); const resource = { foo: 'foo' }; events.push({ type: 'start' }); test_async.Test(5, resource, common.mustCall(function(err, val) { assert.strictEqual(err, null); assert.strictEqual(val, 10); events.push({ type: 'complete' }); process.nextTick(common.mustCall()); })); events.push({ type: 'scheduled' }); process.on('exit', () => { assert.deepStrictEqual(events, [ { type: 'start' }, { type: 'init', id: testId, provider: 'TestResource', triggerAsyncId: initAsyncId, resource }, { type: 'scheduled' }, { type: 'before', id: testId }, { type: 'complete' }, { type: 'after', id: testId }, { type: 'destroy', id: testId }, ]); });