• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3// This tests that enabling node.async_hooks in main threads also
4// affects the workers.
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 code =
19  'setTimeout(() => { for (let i = 0; i < 100000; i++) { "test" + i } }, 1)';
20const worker =
21`const { Worker } = require('worker_threads');
22const worker = new Worker('${code}',
23{ eval: true, stdout: true, stderr: true });
24worker.stdout.on('data',
25  (chunk) => console.log('worker', chunk.toString()));
26worker.stderr.on('data',
27  (chunk) => console.error('worker', chunk.toString()));
28worker.on('exit', () => { ${code} })`;
29
30const tmpdir = require('../common/tmpdir');
31const filename = path.join(tmpdir.path, 'node_trace.1.log');
32
33tmpdir.refresh();
34const proc = cp.spawnSync(
35  process.execPath,
36  [ '--trace-event-categories', 'node.async_hooks', '-e', worker ],
37  {
38    cwd: tmpdir.path,
39    env: { ...process.env,
40           'NODE_DEBUG_NATIVE': 'tracing',
41           'NODE_DEBUG': 'tracing'
42    }
43  });
44
45console.log('process exit with signal:', proc.signal);
46console.log('process stderr:', proc.stderr.toString());
47
48assert.strictEqual(proc.status, 0);
49assert(fs.existsSync(filename));
50const data = fs.readFileSync(filename, 'utf-8');
51const traces = JSON.parse(data).traceEvents;
52
53function filterTimeoutTraces(trace) {
54  if (trace.pid !== proc.pid)
55    return false;
56  if (trace.cat !== 'node,node.async_hooks')
57    return false;
58  if (trace.name !== 'Timeout')
59    return false;
60  return true;
61}
62
63{
64  const timeoutTraces = traces.filter(filterTimeoutTraces);
65  assert.notDeepStrictEqual(timeoutTraces, []);
66  const threads = new Set();
67  for (const trace of timeoutTraces) {
68    threads.add(trace.tid);
69  }
70  assert.notDeepStrictEqual(timeoutTraces, []);
71  console.log('Threads with Timeout traces:', threads);
72  assert.strictEqual(threads.size, 2);
73}
74