current commit
250223.10 · inspector: skip promise hook in the inspector async hook
// Flags: --expose-internals
'use strict';
const common = require('../common');
common.skipIfInspectorDisabled();
common.skipIf32Bits();

const assert = require('assert');
const { inspect } = require('util');
const { internalBinding } = require('internal/test/binding');
const { async_hook_fields, constants, getPromiseHooks } = internalBinding('async_wrap');
const { kTotals } = constants;
const inspector = require('inspector/promises');

const setDepth = 'Debugger.setAsyncCallStackDepth';
const emptyPromiseHooks = [ undefined, undefined, undefined, undefined ];
function verifyAsyncHookDisabled(message) {
  assert.strictEqual(async_hook_fields[kTotals], 0,
                     `${async_hook_fields[kTotals]} !== 0: ${message}`);
  const promiseHooks = getPromiseHooks();
  assert.deepStrictEqual(
    promiseHooks, emptyPromiseHooks,
    `${message}: promise hooks ${inspect(promiseHooks)}`
  );
}

function verifyAsyncHookEnabled(message) {
  assert.strictEqual(async_hook_fields[kTotals], 4,
                     `${async_hook_fields[kTotals]} !== 4: ${message}`);
  const promiseHooks = getPromiseHooks();
  assert.deepStrictEqual(  // Inspector async hooks should not enable promise hooks
    promiseHooks, emptyPromiseHooks,
    `${message}: promise hooks ${inspect(promiseHooks)}`
  );
}

// By default inspector async hooks should not have been installed.
verifyAsyncHookDisabled('inspector async hook should be disabled at startup');

const session = new inspector.Session();
verifyAsyncHookDisabled('creating a session should not enable async hooks');

session.connect();
verifyAsyncHookDisabled('connecting a session should not enable async hooks');

(async () => {
  await session.post('Debugger.enable');
  verifyAsyncHookDisabled('enabling debugger should not enable async hooks');
  await assert.rejects(session.post(setDepth, { invalid: 'message' }), { code: 'ERR_INSPECTOR_COMMAND' });
  verifyAsyncHookDisabled('invalid message should not enable async hooks');
  await assert.rejects(session.post(setDepth, { maxDepth: 'five' }), { code: 'ERR_INSPECTOR_COMMAND' });
  verifyAsyncHookDisabled('invalid maxDepth (string) should not enable ' +
                          'async hooks');
  await assert.rejects(session.post(setDepth, { maxDepth: NaN }), { code: 'ERR_INSPECTOR_COMMAND' });
  verifyAsyncHookDisabled('invalid maxDepth (NaN) should not enable ' +
                          'async hooks');
  await session.post(setDepth, { maxDepth: 10 });
  verifyAsyncHookEnabled('valid message should enable async hooks');

  await session.post(setDepth, { maxDepth: 0 });
  verifyAsyncHookDisabled('Setting maxDepth to 0 should disable ' +
                          'async hooks');

  await session.post(setDepth, { maxDepth: 32 });
  verifyAsyncHookEnabled('valid message should enable async hooks');

  await session.post('Debugger.disable');
  verifyAsyncHookDisabled('Debugger.disable should disable async hooks');

  await session.post('Debugger.enable');
  verifyAsyncHookDisabled('Enabling debugger should not enable hooks');

  await session.post(setDepth, { maxDepth: 64 });
  verifyAsyncHookEnabled('valid message should enable async hooks');

  await session.disconnect();

  verifyAsyncHookDisabled('Disconnecting session should disable ' +
                          'async hooks');
})().then(common.mustCall());