1// Flags: --expose-internals
2'use strict';
3
4const common = require('../common');
5
6common.skipIfInspectorDisabled();
7common.skipIfWorker(); // https://github.com/nodejs/node/issues/22767
8
9const { internalBinding } = require('internal/test/binding');
10
11const {
12  trace: {
13    TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN: kBeforeEvent
14  }
15} = internalBinding('constants');
16
17const { trace } = internalBinding('trace_events');
18
19const assert = require('assert');
20const { Session } = require('inspector');
21
22const session = new Session();
23
24function post(message, data) {
25  return new Promise((resolve, reject) => {
26    session.post(message, data, (err, result) => {
27      if (err)
28        reject(new Error(JSON.stringify(err)));
29      else
30        resolve(result);
31    });
32  });
33}
34
35async function test() {
36  session.connect();
37
38  const events = [];
39  let tracingComplete = false;
40  session.on('NodeTracing.dataCollected', (n) => {
41    assert.ok(n && n.params && n.params.value);
42    events.push(...n.params.value);  // append the events.
43  });
44  session.on('NodeTracing.tracingComplete', () => tracingComplete = true);
45
46  trace(kBeforeEvent, 'foo', 'test1', 0, 'test');
47
48  const traceConfig = { includedCategories: ['foo'] };
49  await post('NodeTracing.start', { traceConfig });
50
51  trace(kBeforeEvent, 'foo', 'test2', 0, 'test');
52  trace(kBeforeEvent, 'bar', 'test3', 0, 'test');
53
54  await post('NodeTracing.stop', { traceConfig });
55
56  trace(kBeforeEvent, 'foo', 'test4', 0, 'test');
57  session.disconnect();
58
59  assert.ok(tracingComplete);
60
61  const marks = events.filter((t) => null !== /foo/.exec(t.cat));
62  assert.strictEqual(marks.length, 1);
63  assert.strictEqual(marks[0].name, 'test2');
64}
65
66test();
67