1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const cp = require('child_process'); 5const path = require('path'); 6const fs = require('fs'); 7const tmpdir = require('../common/tmpdir'); 8 9// Tests that node.console trace events for counters and time methods are 10// emitted as expected. 11 12const names = [ 13 'time::foo', 14 'count::bar', 15]; 16const expectedCounts = [ 1, 2, 0 ]; 17const expectedTimeTypes = [ 'b', 'n', 'e' ]; 18 19if (process.argv[2] === 'child') { 20 // The following console outputs exercise the test, causing node.console 21 // trace events to be emitted for the counter and time calls. 22 console.count('bar'); 23 console.count('bar'); 24 console.countReset('bar'); 25 console.time('foo'); 26 setImmediate(() => { 27 console.timeLog('foo'); 28 setImmediate(() => { 29 console.timeEnd('foo'); 30 }); 31 }); 32} else { 33 tmpdir.refresh(); 34 35 const proc = cp.fork(__filename, 36 [ 'child' ], { 37 cwd: tmpdir.path, 38 execArgv: [ 39 '--trace-event-categories', 40 'node.console', 41 ] 42 }); 43 44 proc.once('exit', common.mustCall(async () => { 45 const file = path.join(tmpdir.path, 'node_trace.1.log'); 46 47 assert(fs.existsSync(file)); 48 const data = await fs.promises.readFile(file, { encoding: 'utf8' }); 49 JSON.parse(data).traceEvents 50 .filter((trace) => trace.cat !== '__metadata') 51 .forEach((trace) => { 52 assert.strictEqual(trace.pid, proc.pid); 53 assert(names.includes(trace.name)); 54 if (trace.name === 'count::bar') 55 assert.strictEqual(trace.args.data, expectedCounts.shift()); 56 else if (trace.name === 'time::foo') 57 assert.strictEqual(trace.ph, expectedTimeTypes.shift()); 58 }); 59 assert.strictEqual(expectedCounts.length, 0); 60 assert.strictEqual(expectedTimeTypes.length, 0); 61 })); 62} 63