• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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