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