Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 1 | 'use strict'; |
| 2 | |
| 3 | const common = require('../common'); |
| 4 | const assert = require('assert'); |
| 5 | const tick = require('./tick'); |
| 6 | const async_hooks = require('async_hooks'); |
Anna Henningsen | 90dee89 | 2017-05-24 11:15:05 | [diff] [blame] | 7 | const { AsyncResource } = async_hooks; |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 8 | |
| 9 | const initHooks = require('./init-hooks'); |
| 10 | const { checkInvocations } = require('./hook-checks'); |
| 11 | |
| 12 | const hooks = initHooks(); |
| 13 | hooks.enable(); |
| 14 | |
James M Snell | d8a0364 | 2017-08-30 21:45:21 | [diff] [blame] | 15 | common.expectsError( |
| 16 | () => new AsyncResource(), { |
| 17 | code: 'ERR_INVALID_ARG_TYPE', |
| 18 | type: TypeError, |
| 19 | }); |
Anatoli Papirovski | 094bfaf | 2017-12-08 21:41:38 | [diff] [blame] | 20 | common.expectsError(() => { |
Sebastian Mayr | 22901d8 | 2017-11-09 21:57:04 | [diff] [blame] | 21 | new AsyncResource('invalid_trigger_id', { triggerAsyncId: null }); |
Anatoli Papirovski | 094bfaf | 2017-12-08 21:41:38 | [diff] [blame] | 22 | }, { |
Trevor Norris | 062beb0 | 2017-08-03 20:43:41 | [diff] [blame] | 23 | code: 'ERR_INVALID_ASYNC_ID', |
| 24 | type: RangeError, |
Anatoli Papirovski | 094bfaf | 2017-12-08 21:41:38 | [diff] [blame] | 25 | }); |
David Cai | 35353a4 | 2017-06-05 07:35:06 | [diff] [blame] | 26 | |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 27 | assert.strictEqual( |
Rich Trott | aa6fac6 | 2017-07-25 17:37:08 | [diff] [blame] | 28 | new AsyncResource('default_trigger_id').triggerAsyncId(), |
| 29 | async_hooks.executionAsyncId() |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 30 | ); |
David Cai | 35353a4 | 2017-06-05 07:35:06 | [diff] [blame] | 31 | |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 32 | // create first custom event 'alcazares' with triggerAsyncId derived |
| 33 | // from async_hooks executionAsyncId |
| 34 | const alcaTriggerId = async_hooks.executionAsyncId(); |
Anna Henningsen | 90dee89 | 2017-05-24 11:15:05 | [diff] [blame] | 35 | const alcaEvent = new AsyncResource('alcazares', alcaTriggerId); |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 36 | const alcazaresActivities = hooks.activitiesOfTypes([ 'alcazares' ]); |
| 37 | |
| 38 | // alcazares event was constructed and thus only has an `init` call |
Anna Henningsen | 1dc3272 | 2017-05-26 15:53:06 | [diff] [blame] | 39 | assert.strictEqual(alcazaresActivities.length, 1); |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 40 | const alcazares = alcazaresActivities[0]; |
Anna Henningsen | 1dc3272 | 2017-05-26 15:53:06 | [diff] [blame] | 41 | assert.strictEqual(alcazares.type, 'alcazares'); |
| 42 | assert.strictEqual(typeof alcazares.uid, 'number'); |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 43 | assert.strictEqual(alcazares.triggerAsyncId, alcaTriggerId); |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 44 | checkInvocations(alcazares, { init: 1 }, 'alcazares constructed'); |
| 45 | |
David Cai | 35353a4 | 2017-06-05 07:35:06 | [diff] [blame] | 46 | assert.strictEqual(typeof alcaEvent.asyncId(), 'number'); |
| 47 | assert.notStrictEqual(alcaEvent.asyncId(), alcaTriggerId); |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 48 | assert.strictEqual(alcaEvent.triggerAsyncId(), alcaTriggerId); |
David Cai | 35353a4 | 2017-06-05 07:35:06 | [diff] [blame] | 49 | |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 50 | alcaEvent.emitBefore(); |
| 51 | checkInvocations(alcazares, { init: 1, before: 1 }, |
| 52 | 'alcazares emitted before'); |
| 53 | alcaEvent.emitAfter(); |
| 54 | checkInvocations(alcazares, { init: 1, before: 1, after: 1 }, |
| 55 | 'alcazares emitted after'); |
| 56 | alcaEvent.emitBefore(); |
| 57 | checkInvocations(alcazares, { init: 1, before: 2, after: 1 }, |
| 58 | 'alcazares emitted before again'); |
| 59 | alcaEvent.emitAfter(); |
| 60 | checkInvocations(alcazares, { init: 1, before: 2, after: 2 }, |
| 61 | 'alcazares emitted after again'); |
| 62 | alcaEvent.emitDestroy(); |
| 63 | tick(1, common.mustCall(tick1)); |
| 64 | |
| 65 | function 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 Henningsen | 90dee89 | 2017-05-24 11:15:05 | [diff] [blame] | 71 | const pobEvent = new AsyncResource('poblado', pobTriggerId); |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 72 | const pobladoActivities = hooks.activitiesOfTypes([ 'poblado' ]); |
| 73 | const poblado = pobladoActivities[0]; |
Anna Henningsen | 1dc3272 | 2017-05-26 15:53:06 | [diff] [blame] | 74 | assert.strictEqual(poblado.type, 'poblado'); |
| 75 | assert.strictEqual(typeof poblado.uid, 'number'); |
Andreas Madsen | de762b7 | 2017-06-14 10:39:53 | [diff] [blame] | 76 | assert.strictEqual(poblado.triggerAsyncId, pobTriggerId); |
Thorsten Lorenz | e3e56f1 | 2016-11-22 16:13:44 | [diff] [blame] | 77 | 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 | } |