1'use strict'; 2const common = require('../common'); 3const assert = require('assert'); 4const { spawnSync } = require('child_process'); 5const async_hooks = require('async_hooks'); 6const initHooks = require('./init-hooks'); 7 8const arg = process.argv[2]; 9switch (arg) { 10 case 'test_init_callback': 11 initHooks({ 12 oninit: common.mustCall(() => { throw new Error(arg); }) 13 }).enable(); 14 new async_hooks.AsyncResource(`${arg}_type`); 15 return; 16 17 case 'test_callback': 18 initHooks({ 19 onbefore: common.mustCall(() => { throw new Error(arg); }) 20 }).enable(); 21 const resource = new async_hooks.AsyncResource(`${arg}_type`); 22 resource.runInAsyncScope(() => {}); 23 return; 24 25 case 'test_callback_abort': 26 initHooks({ 27 oninit: common.mustCall(() => { throw new Error(arg); }) 28 }).enable(); 29 new async_hooks.AsyncResource(`${arg}_type`); 30 return; 31} 32 33// This part should run only for the master test 34assert.ok(!arg); 35{ 36 // console.log should stay until this test's flakiness is solved 37 console.log('start case 1'); 38 console.time('end case 1'); 39 const child = spawnSync(process.execPath, [__filename, 'test_init_callback']); 40 assert.ifError(child.error); 41 const test_init_first_line = child.stderr.toString().split(/[\r\n]+/g)[0]; 42 assert.strictEqual(test_init_first_line, 'Error: test_init_callback'); 43 assert.strictEqual(child.status, 1); 44 console.timeEnd('end case 1'); 45} 46 47{ 48 console.log('start case 2'); 49 console.time('end case 2'); 50 const child = spawnSync(process.execPath, [__filename, 'test_callback']); 51 assert.ifError(child.error); 52 const test_callback_first_line = child.stderr.toString().split(/[\r\n]+/g)[0]; 53 assert.strictEqual(test_callback_first_line, 'Error: test_callback'); 54 assert.strictEqual(child.status, 1); 55 console.timeEnd('end case 2'); 56} 57 58{ 59 console.log('start case 3'); 60 console.time('end case 3'); 61 let program = process.execPath; 62 let args = [ 63 '--abort-on-uncaught-exception', __filename, 'test_callback_abort' ]; 64 const options = { encoding: 'utf8' }; 65 if (!common.isWindows) { 66 program = `ulimit -c 0 && exec ${program} ${args.join(' ')}`; 67 args = []; 68 options.shell = true; 69 } 70 const child = spawnSync(program, args, options); 71 if (common.isWindows) { 72 assert.strictEqual(child.status, 134); 73 assert.strictEqual(child.signal, null); 74 } else { 75 assert.strictEqual(child.status, null); 76 // Most posix systems will show 'SIGABRT', but alpine34 does not 77 if (child.signal !== 'SIGABRT') { 78 console.log(`parent received signal ${child.signal}\nchild's stderr:`); 79 console.log(child.stderr); 80 process.exit(1); 81 } 82 assert.strictEqual(child.signal, 'SIGABRT'); 83 } 84 assert.strictEqual(child.stdout, ''); 85 const firstLineStderr = child.stderr.split(/[\r\n]+/g)[0].trim(); 86 assert.strictEqual(firstLineStderr, 'Error: test_callback_abort'); 87 console.timeEnd('end case 3'); 88} 89