'use strict'; require('../common'); const assert = require('assert'); const childProcess = require('child_process'); const os = require('os'); if (process.argv[2] === 'child') { child(process.argv[3], process.argv[4]); } else { main(); } function child(type, valueType) { const { createHook } = require('async_hooks'); const fs = require('fs'); createHook({ [type]() { if (valueType === 'symbol') { throw Symbol('foo'); } // eslint-disable-next-line no-throw-literal throw null; } }).enable(); // Trigger `promiseResolve`. new Promise((resolve) => resolve()) // Trigger `after`/`destroy`. .then(() => fs.promises.readFile(__filename, 'utf8')) // Make process exit with code 0 if no error caught. .then(() => process.exit(0)); } function main() { const types = [ 'init', 'before', 'after', 'destroy', 'promiseResolve' ]; const valueTypes = [ [ 'null', 'Error: null' ], [ 'symbol', 'Error: Symbol(foo)' ], ]; for (const type of types) { for (const [valueType, expect] of valueTypes) { const cp = childProcess.spawnSync( process.execPath, [ __filename, 'child', type, valueType ], { encoding: 'utf8', }); assert.strictEqual(cp.status, 1, type); assert.strictEqual(cp.stderr.trim().split(os.EOL)[0], expect, type); } } }