1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const cp = require('child_process'); 5const fs = require('fs'); 6const path = require('path'); 7const tmpdir = require('../common/tmpdir'); 8 9if (process.argv[2] === 'child') { 10 const p = Promise.reject(1); // Handled later 11 Promise.reject(2); // Unhandled 12 setImmediate(() => { 13 p.catch(() => { /* intentional noop */ }); 14 }); 15} else { 16 tmpdir.refresh(); 17 18 const proc = cp.fork(__filename, 19 [ 'child' ], { 20 cwd: tmpdir.path, 21 execArgv: [ 22 '--no-warnings', 23 '--trace-event-categories', 24 'node.promises.rejections', 25 ] 26 }); 27 28 proc.once('exit', common.mustCall(() => { 29 const file = path.join(tmpdir.path, 'node_trace.1.log'); 30 31 assert(fs.existsSync(file)); 32 fs.readFile(file, common.mustCall((err, data) => { 33 const traces = JSON.parse(data.toString()).traceEvents 34 .filter((trace) => trace.cat !== '__metadata'); 35 traces.forEach((trace) => { 36 assert.strictEqual(trace.pid, proc.pid); 37 assert.strictEqual(trace.name, 'rejections'); 38 assert(trace.args.unhandled <= 2); 39 assert(trace.args.handledAfter <= 1); 40 }); 41 })); 42 })); 43} 44