nodejs/test/parallel/test-promise-reject-callbac...

36 lines
1.4 KiB
JavaScript

'use strict';
require('../common');
const tmpdir = require('../common/tmpdir');
const assert = require('assert');
const path = require('path');
const child_process = require('child_process');
tmpdir.refresh();
// Tests that exceptions from the PromiseRejectCallback are printed to stderr
// when they occur as a best-effort way of handling them, and that calling
// `console.log()` works after that. Earlier, the latter did not work because
// of the exception left lying around by the PromiseRejectCallback when its JS
// part exceeded the call stack limit, and when the inspector/built-in coverage
// was enabled, it resulted in a hard crash.
for (const NODE_V8_COVERAGE of ['', tmpdir.path]) {
// NODE_V8_COVERAGE does not work without the inspector.
// Refs: https://github.com/nodejs/node/issues/29542
if (!process.features.inspector && NODE_V8_COVERAGE !== '') continue;
const { status, signal, stdout, stderr } =
child_process.spawnSync(process.execPath,
[path.join(__dirname, 'test-ttywrap-stack.js')],
{ env: { ...process.env, NODE_V8_COVERAGE } });
assert(stdout.toString('utf8')
.startsWith('RangeError: Maximum call stack size exceeded'),
`stdout: <${stdout}>`);
assert(stderr.toString('utf8')
.startsWith('Exception in PromiseRejectCallback'),
`stderr: <${stderr}>`);
assert.strictEqual(status, 0);
assert.strictEqual(signal, null);
}