-
Notifications
You must be signed in to change notification settings - Fork 29k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: add test for async hooks parity for async/await
Add a basic test ensuring parity between before-after and init-promiseResolve hooks when using async/await. Add ability to initHooks and to checkInvocations utilities to transmit promiseResolve hook as well. See: #20516 PR-URL: #20626 Refs: #20516 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Benedikt Meurer <benedikt.meurer@gmail.com>
- Loading branch information
1 parent
7a98008
commit 0aab92f
Showing
3 changed files
with
106 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
|
||
// This test ensures async hooks are being properly called | ||
// when using async-await mechanics. This involves: | ||
// 1. Checking that all initialized promises are being resolved | ||
// 2. Checking that for each 'before' corresponding hook 'after' hook is called | ||
|
||
const assert = require('assert'); | ||
const initHooks = require('./init-hooks'); | ||
|
||
const util = require('util'); | ||
|
||
const sleep = util.promisify(setTimeout); | ||
// either 'inited' or 'resolved' | ||
const promisesInitState = new Map(); | ||
// either 'before' or 'after' AND asyncId must be present in the other map | ||
const promisesExecutionState = new Map(); | ||
|
||
const hooks = initHooks({ | ||
oninit, | ||
onbefore, | ||
onafter, | ||
ondestroy: null, // Intentionally not tested, since it will be removed soon | ||
onpromiseResolve | ||
}); | ||
hooks.enable(); | ||
|
||
function oninit(asyncId, type, triggerAsyncId, resource) { | ||
if (type === 'PROMISE') { | ||
promisesInitState.set(asyncId, 'inited'); | ||
} | ||
} | ||
|
||
function onbefore(asyncId) { | ||
if (!promisesInitState.has(asyncId)) { | ||
return; | ||
} | ||
promisesExecutionState.set(asyncId, 'before'); | ||
} | ||
|
||
function onafter(asyncId) { | ||
if (!promisesInitState.has(asyncId)) { | ||
return; | ||
} | ||
|
||
assert.strictEqual(promisesExecutionState.get(asyncId), 'before', | ||
'after hook called for promise without prior call' + | ||
'to before hook'); | ||
assert.strictEqual(promisesInitState.get(asyncId), 'resolved', | ||
'after hook called for promise without prior call' + | ||
'to resolve hook'); | ||
promisesExecutionState.set(asyncId, 'after'); | ||
} | ||
|
||
function onpromiseResolve(asyncId) { | ||
assert(promisesInitState.has(asyncId), | ||
'resolve hook called for promise without prior call to init hook'); | ||
|
||
promisesInitState.set(asyncId, 'resolved'); | ||
} | ||
|
||
const timeout = common.platformTimeout(10); | ||
|
||
function checkPromisesInitState() { | ||
for (const initState of promisesInitState.values()) { | ||
assert.strictEqual(initState, 'resolved', | ||
'promise initialized without being resolved'); | ||
} | ||
} | ||
|
||
function checkPromisesExecutionState() { | ||
for (const executionState of promisesExecutionState.values()) { | ||
assert.strictEqual(executionState, 'after', | ||
'mismatch between before and after hook calls'); | ||
} | ||
} | ||
|
||
process.on('beforeExit', common.mustCall(() => { | ||
hooks.disable(); | ||
hooks.sanityCheck('PROMISE'); | ||
|
||
checkPromisesInitState(); | ||
checkPromisesExecutionState(); | ||
})); | ||
|
||
async function asyncFunc() { | ||
await sleep(timeout); | ||
} | ||
|
||
asyncFunc(); |