• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../../common');
4const assert = require('assert');
5const async_hooks = require('async_hooks');
6const binding = require(`./build/${common.buildType}/binding`);
7
8if (process.env.NODE_TEST_WITH_ASYNC_HOOKS) {
9  common.skip('cannot test with env var NODE_TEST_WITH_ASYNC_HOOKS');
10  return;
11}
12
13// Baseline to make sure the internal field isn't being set.
14assert.strictEqual(
15  binding.getPromiseField(Promise.resolve(1)),
16  0);
17
18const hook0 = async_hooks.createHook({}).enable();
19
20// Check that no PromiseWrap is created when there are no hook callbacks.
21assert.strictEqual(
22  binding.getPromiseField(Promise.resolve(1)),
23  0);
24
25hook0.disable();
26
27let pwrap = null;
28const hook1 = async_hooks.createHook({
29  init(id, type, tid, resource) {
30    pwrap = resource;
31  }
32}).enable();
33
34// Check that the internal field returns the same PromiseWrap passed to init().
35assert.strictEqual(
36  binding.getPromiseField(Promise.resolve(1)),
37  pwrap);
38
39hook1.disable();
40
41// Check that internal fields are no longer being set. This needs to be delayed
42// a bit because the `disable()` call only schedules disabling the hook in a
43// future microtask.
44setImmediate(() => {
45  assert.strictEqual(
46    binding.getPromiseField(Promise.resolve(1)),
47    0);
48});
49