summaryrefslogtreecommitdiff
path: root/test/parallel/test-promise-unhandled-error.js
blob: bb906fdcbe7591645626230cb718e286780ee6f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Flags: --unhandled-rejections=strict
'use strict';

const common = require('../common');
const Countdown = require('../common/countdown');
const assert = require('assert');

common.disableCrashOnUnhandledRejection();

// Verify that unhandled rejections always trigger uncaught exceptions instead
// of triggering unhandled rejections.

const err1 = new Error('One');
const err2 = new Error(
  'This error originated either by throwing ' +
  'inside of an async function without a catch block, or by rejecting a ' +
  'promise which was not handled with .catch(). The promise rejected with the' +
  ' reason "null".'
);
err2.code = 'ERR_UNHANDLED_REJECTION';
Object.defineProperty(err2, 'name', {
  value: 'UnhandledPromiseRejection',
  writable: true,
  configurable: true
});

const errors = [err1, err2];
const identical = [true, false];

const ref = new Promise(() => {
  throw err1;
});
// Explicitly reject `null`.
Promise.reject(null);

process.on('warning', common.mustNotCall('warning'));
process.on('unhandledRejection', common.mustCall(2));
process.on('rejectionHandled', common.mustNotCall('rejectionHandled'));
process.on('exit', assert.strictEqual.bind(null, 0));

const timer = setTimeout(() => console.log(ref), 1000);

const counter = new Countdown(2, () => {
  clearTimeout(timer);
});

process.on('uncaughtException', common.mustCall((err, origin) => {
  counter.dec();
  assert.strictEqual(origin, 'unhandledRejection', err);
  const knownError = errors.shift();
  assert.deepStrictEqual(err, knownError);
  // Check if the errors are reference equal.
  assert(identical.shift() ? err === knownError : err !== knownError);
}, 2));