| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| const cp = require('child_process'); |
| const fs = require('fs'); |
| const tmpdir = require('../common/tmpdir'); |
| const { scheduler } = require('timers/promises'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const { hkdf } = require('crypto'); |
| const { deflate } = require('zlib'); |
| |
| if (process.env.isChild === '1') { |
| hkdf('sha512', 'key', 'salt', 'info', 64, () => {}); |
| deflate('hello', () => {}); |
| scheduler.wait(10); |
| return; |
| } |
| |
| tmpdir.refresh(); |
| const FILE_NAME = tmpdir.resolve('node_trace.1.log'); |
| |
| cp.spawnSync(process.execPath, |
| [ |
| '--trace-events-enabled', |
| '--trace-event-categories', |
| 'node.threadpoolwork.sync,node.threadpoolwork.async', |
| __filename, |
| ], |
| { |
| cwd: tmpdir.path, |
| env: { |
| ...process.env, |
| isChild: '1', |
| }, |
| }); |
| |
| assert(fs.existsSync(FILE_NAME)); |
| const data = fs.readFileSync(FILE_NAME); |
| const traces = JSON.parse(data.toString()).traceEvents; |
| |
| assert(traces.length > 0); |
| |
| let zlibCount = 0; |
| let cryptoCount = 0; |
| |
| traces.forEach((item) => { |
| if ([ |
| 'node,node.threadpoolwork,node.threadpoolwork.sync', |
| 'node,node.threadpoolwork,node.threadpoolwork.async', |
| ].includes(item.cat)) { |
| if (item.name === 'zlib') { |
| zlibCount++; |
| } else if (item.name === 'crypto') { |
| cryptoCount++; |
| } |
| } |
| }); |
| |
| // There are two types, each type has two async events and sync events at least |
| assert.ok(zlibCount >= 4); |
| assert.ok(cryptoCount >= 4); |