• 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
37console.log('process exit with signal:', proc.signal);
38console.log('process stderr:', proc.stderr.toString());
39
40assert.strictEqual(proc.status, 0);
41assert(fs.existsSync(filename));
42const data = fs.readFileSync(filename, 'utf-8');
43const traces = JSON.parse(data).traceEvents;
44
45function filterTimeoutTraces(trace) {
46  if (trace.pid !== proc.pid)
47    return false;
48  if (trace.cat !== 'node,node.async_hooks')
49    return false;
50  if (trace.name !== 'Timeout')
51    return false;
52  return true;
53}
54
55{
56  const timeoutTraces = traces.filter(filterTimeoutTraces);
57  assert.notDeepStrictEqual(timeoutTraces, []);
58  const threads = new Set();
59  for (const trace of timeoutTraces) {
60    threads.add(trace.tid);
61  }
62  assert.notDeepStrictEqual(timeoutTraces, []);
63}
64