1'use strict';
2require('../common');
3const assert = require('assert');
4const async_hooks = require('async_hooks');
5
6// Regression test for:
7// - https://github.com/nodejs/node/issues/38814
8// - https://github.com/nodejs/node/issues/38815
9
10const layers = new Map();
11
12// Only init to start context-based promise hook
13async_hooks.createHook({
14  init(asyncId, type) {
15    layers.set(asyncId, {
16      type,
17      init: true,
18      before: false,
19      after: false,
20      promiseResolve: false
21    });
22  },
23  before(asyncId) {
24    if (layers.has(asyncId)) {
25      layers.get(asyncId).before = true;
26    }
27  },
28  after(asyncId) {
29    if (layers.has(asyncId)) {
30      layers.get(asyncId).after = true;
31    }
32  },
33  promiseResolve(asyncId) {
34    if (layers.has(asyncId)) {
35      layers.get(asyncId).promiseResolve = true;
36    }
37  }
38}).enable();
39
40// With destroy, this should switch to native
41// and disable context - based promise hook
42async_hooks.createHook({
43  init() { },
44  destroy() { }
45}).enable();
46
47async function main() {
48  return Promise.resolve();
49}
50
51main();
52
53process.on('exit', () => {
54  assert.deepStrictEqual(Array.from(layers.values()), [
55    {
56      type: 'PROMISE',
57      init: true,
58      before: true,
59      after: true,
60      promiseResolve: true
61    },
62    {
63      type: 'PROMISE',
64      init: true,
65      before: false,
66      after: false,
67      promiseResolve: true
68    },
69    {
70      type: 'PROMISE',
71      init: true,
72      before: true,
73      after: true,
74      promiseResolve: true
75    },
76  ]);
77});
78