2017-06-01 14:13:58 +02:00
|
|
|
'use strict';
|
|
|
|
// Test that async ids that are added to the destroy queue while running a
|
|
|
|
// `destroy` callback are handled correctly.
|
|
|
|
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
|
|
const async_hooks = require('async_hooks');
|
|
|
|
|
|
|
|
const initCalls = new Set();
|
|
|
|
let destroyResCallCount = 0;
|
|
|
|
let res2;
|
|
|
|
|
|
|
|
async_hooks.createHook({
|
2017-06-14 12:39:53 +02:00
|
|
|
init: common.mustCallAtLeast((id, provider, triggerAsyncId) => {
|
2017-06-01 14:13:58 +02:00
|
|
|
if (provider === 'foobar')
|
|
|
|
initCalls.add(id);
|
|
|
|
}, 2),
|
|
|
|
destroy: common.mustCallAtLeast((id) => {
|
|
|
|
if (!initCalls.has(id)) return;
|
|
|
|
|
|
|
|
switch (destroyResCallCount++) {
|
|
|
|
case 0:
|
|
|
|
// Trigger the second `destroy` call.
|
|
|
|
res2.emitDestroy();
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
assert.fail('More than 2 destroy() invocations');
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}, 2)
|
|
|
|
}).enable();
|
|
|
|
|
|
|
|
const res1 = new async_hooks.AsyncResource('foobar');
|
|
|
|
res2 = new async_hooks.AsyncResource('foobar');
|
|
|
|
res1.emitDestroy();
|
|
|
|
|
|
|
|
process.on('exit', () => assert.strictEqual(destroyResCallCount, 2));
|