blob: 89a889b20192e34a37bf3602cb27fb2219482a46 [file] [log] [blame]
Thorsten Lorenze3e56f12016-11-22 16:13:441'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const tick = require('./tick');
6const async_hooks = require('async_hooks');
Anna Henningsen90dee892017-05-24 11:15:057const { AsyncResource } = async_hooks;
Thorsten Lorenze3e56f12016-11-22 16:13:448
9const initHooks = require('./init-hooks');
10const { checkInvocations } = require('./hook-checks');
11
12const hooks = initHooks();
13hooks.enable();
14
James M Snelld8a03642017-08-30 21:45:2115common.expectsError(
16 () => new AsyncResource(), {
17 code: 'ERR_INVALID_ARG_TYPE',
18 type: TypeError,
19 });
Anatoli Papirovski094bfaf2017-12-08 21:41:3820common.expectsError(() => {
Sebastian Mayr22901d82017-11-09 21:57:0421 new AsyncResource('invalid_trigger_id', { triggerAsyncId: null });
Anatoli Papirovski094bfaf2017-12-08 21:41:3822}, {
Trevor Norris062beb02017-08-03 20:43:4123 code: 'ERR_INVALID_ASYNC_ID',
24 type: RangeError,
Anatoli Papirovski094bfaf2017-12-08 21:41:3825});
David Cai35353a42017-06-05 07:35:0626
Andreas Madsende762b72017-06-14 10:39:5327assert.strictEqual(
Rich Trottaa6fac62017-07-25 17:37:0828 new AsyncResource('default_trigger_id').triggerAsyncId(),
29 async_hooks.executionAsyncId()
Andreas Madsende762b72017-06-14 10:39:5330);
David Cai35353a42017-06-05 07:35:0631
Andreas Madsende762b72017-06-14 10:39:5332// create first custom event 'alcazares' with triggerAsyncId derived
33// from async_hooks executionAsyncId
34const alcaTriggerId = async_hooks.executionAsyncId();
Anna Henningsen90dee892017-05-24 11:15:0535const alcaEvent = new AsyncResource('alcazares', alcaTriggerId);
Thorsten Lorenze3e56f12016-11-22 16:13:4436const alcazaresActivities = hooks.activitiesOfTypes([ 'alcazares' ]);
37
38// alcazares event was constructed and thus only has an `init` call
Anna Henningsen1dc32722017-05-26 15:53:0639assert.strictEqual(alcazaresActivities.length, 1);
Thorsten Lorenze3e56f12016-11-22 16:13:4440const alcazares = alcazaresActivities[0];
Anna Henningsen1dc32722017-05-26 15:53:0641assert.strictEqual(alcazares.type, 'alcazares');
42assert.strictEqual(typeof alcazares.uid, 'number');
Andreas Madsende762b72017-06-14 10:39:5343assert.strictEqual(alcazares.triggerAsyncId, alcaTriggerId);
Thorsten Lorenze3e56f12016-11-22 16:13:4444checkInvocations(alcazares, { init: 1 }, 'alcazares constructed');
45
David Cai35353a42017-06-05 07:35:0646assert.strictEqual(typeof alcaEvent.asyncId(), 'number');
47assert.notStrictEqual(alcaEvent.asyncId(), alcaTriggerId);
Andreas Madsende762b72017-06-14 10:39:5348assert.strictEqual(alcaEvent.triggerAsyncId(), alcaTriggerId);
David Cai35353a42017-06-05 07:35:0649
Thorsten Lorenze3e56f12016-11-22 16:13:4450alcaEvent.emitBefore();
51checkInvocations(alcazares, { init: 1, before: 1 },
52 'alcazares emitted before');
53alcaEvent.emitAfter();
54checkInvocations(alcazares, { init: 1, before: 1, after: 1 },
55 'alcazares emitted after');
56alcaEvent.emitBefore();
57checkInvocations(alcazares, { init: 1, before: 2, after: 1 },
58 'alcazares emitted before again');
59alcaEvent.emitAfter();
60checkInvocations(alcazares, { init: 1, before: 2, after: 2 },
61 'alcazares emitted after again');
62alcaEvent.emitDestroy();
63tick(1, common.mustCall(tick1));
64
65function tick1() {
66 checkInvocations(alcazares, { init: 1, before: 2, after: 2, destroy: 1 },
67 'alcazares emitted destroy');
68
69 // The below shows that we can pass any number as a trigger id
70 const pobTriggerId = 111;
Anna Henningsen90dee892017-05-24 11:15:0571 const pobEvent = new AsyncResource('poblado', pobTriggerId);
Thorsten Lorenze3e56f12016-11-22 16:13:4472 const pobladoActivities = hooks.activitiesOfTypes([ 'poblado' ]);
73 const poblado = pobladoActivities[0];
Anna Henningsen1dc32722017-05-26 15:53:0674 assert.strictEqual(poblado.type, 'poblado');
75 assert.strictEqual(typeof poblado.uid, 'number');
Andreas Madsende762b72017-06-14 10:39:5376 assert.strictEqual(poblado.triggerAsyncId, pobTriggerId);
Thorsten Lorenze3e56f12016-11-22 16:13:4477 checkInvocations(poblado, { init: 1 }, 'poblado constructed');
78 pobEvent.emitBefore();
79 checkInvocations(poblado, { init: 1, before: 1 },
80 'poblado emitted before');
81
82 pobEvent.emitAfter();
83 checkInvocations(poblado, { init: 1, before: 1, after: 1 },
84 'poblado emitted after');
85
86 // after we disable the hooks we shouldn't receive any events anymore
87 hooks.disable();
88 alcaEvent.emitDestroy();
89 tick(1, common.mustCall(tick2));
90
91 function tick2() {
92 checkInvocations(
93 alcazares, { init: 1, before: 2, after: 2, destroy: 1 },
94 'alcazares emitted destroy a second time after hooks disabled');
95 pobEvent.emitDestroy();
96 tick(1, common.mustCall(tick3));
97 }
98
99 function tick3() {
100 checkInvocations(poblado, { init: 1, before: 1, after: 1 },
101 'poblado emitted destroy after hooks disabled');
102 }
103}