• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3// This tests that tracing can be enabled dynamically with the
4// trace_events module.
5
6const common = require('../common');
7try {
8  require('trace_events');
9} catch {
10  common.skip('missing trace events');
11}
12
13const assert = require('assert');
14const cp = require('child_process');
15const fs = require('fs');
16const path = require('path');
17
18const enable = `require("trace_events").createTracing(
19{ categories: ["node.async_hooks"] }).enable();`;
20const code =
21  'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)';
22
23const tmpdir = require('../common/tmpdir');
24const filename = path.join(tmpdir.path, 'node_trace.1.log');
25
26tmpdir.refresh();
27const proc = cp.spawnSync(
28  process.execPath,
29  ['-e', enable + code ],
30  {
31    cwd: tmpdir.path,
32    env: { ...process.env,
33           'NODE_DEBUG_NATIVE': 'tracing',
34           'NODE_DEBUG': 'tracing'
35    }
36  });
37
38console.log('process exit with signal:', proc.signal);
39console.log('process stderr:', proc.stderr.toString());
40
41assert.strictEqual(proc.status, 0);
42assert(fs.existsSync(filename));
43const data = fs.readFileSync(filename, 'utf-8');
44const traces = JSON.parse(data).traceEvents;
45
46function filterTimeoutTraces(trace) {
47  if (trace.pid !== proc.pid)
48    return false;
49  if (trace.cat !== 'node,node.async_hooks')
50    return false;
51  if (trace.name !== 'Timeout')
52    return false;
53  return true;
54}
55
56{
57  const timeoutTraces = traces.filter(filterTimeoutTraces);
58  assert.notDeepStrictEqual(timeoutTraces, []);
59  const threads = new Set();
60  for (const trace of timeoutTraces) {
61    threads.add(trace.tid);
62  }
63  assert.notDeepStrictEqual(timeoutTraces, []);
64}
65