|
| 1 | +'use strict'; |
| 2 | +require('../common'); |
| 3 | +const tmpdir = require('../common/tmpdir'); |
| 4 | +const assert = require('assert'); |
| 5 | +const path = require('path'); |
| 6 | +const child_process = require('child_process'); |
| 7 | + |
| 8 | +tmpdir.refresh(); |
| 9 | + |
| 10 | +// Tests that exceptions from the PromiseRejectCallback are printed to stderr |
| 11 | +// when they occur as a best-effort way of handling them, and that calling |
| 12 | +// `console.log()` works after that. Earlier, the latter did not work because |
| 13 | +// of the exception left lying around by the PromiseRejectCallback when its JS |
| 14 | +// part exceeded the call stack limit, and when the inspector/built-in coverage |
| 15 | +// was enabled, it resulted in a hard crash. |
| 16 | + |
| 17 | +for (const NODE_V8_COVERAGE of ['', tmpdir.path]) { |
| 18 | + // NODE_V8_COVERAGE does not work without the inspector. |
| 19 | + // Refs: https://github.com/nodejs/node/issues/29542 |
| 20 | + if (!process.features.inspector && NODE_V8_COVERAGE !== '') continue; |
| 21 | + |
| 22 | + const { status, signal, stdout, stderr } = |
| 23 | + child_process.spawnSync(process.execPath, |
| 24 | + [path.join(__dirname, 'test-ttywrap-stack.js')], |
| 25 | + { env: { ...process.env, NODE_V8_COVERAGE } }); |
| 26 | + |
| 27 | + assert(stdout.toString('utf8') |
| 28 | + .startsWith('RangeError: Maximum call stack size exceeded'), |
| 29 | + `stdout: <${stdout}>`); |
| 30 | + assert(stderr.toString('utf8') |
| 31 | + .startsWith('Exception in PromiseRejectCallback'), |
| 32 | + `stderr: <${stderr}>`); |
| 33 | + assert.strictEqual(status, 0); |
| 34 | + assert.strictEqual(signal, null); |
| 35 | +} |
0 commit comments