'use strict'; const assert = require('assert'); function getTestCases(isWorker = false) { const cases = []; function exitsOnExitCodeSet() { process.exitCode = 42; process.on('exit', (code) => { assert.strictEqual(process.exitCode, 42); assert.strictEqual(code, 42); }); } cases.push({ func: exitsOnExitCodeSet, result: 42 }); function changesCodeViaExit() { process.exitCode = 99; process.on('exit', (code) => { assert.strictEqual(process.exitCode, 42); assert.strictEqual(code, 42); }); process.exit(42); } cases.push({ func: changesCodeViaExit, result: 42 }); function changesCodeZeroExit() { process.exitCode = 99; process.on('exit', (code) => { assert.strictEqual(process.exitCode, 0); assert.strictEqual(code, 0); }); process.exit(0); } cases.push({ func: changesCodeZeroExit, result: 0 }); function exitWithOneOnUncaught() { process.exitCode = 99; process.on('exit', (code) => { // Cannot use assert because it will be uncaughtException -> 1 exit code // that will render this test useless if (code !== 1 || process.exitCode !== 1) { console.log('wrong code! expected 1 for uncaughtException'); process.exit(99); } }); throw new Error('ok'); } cases.push({ func: exitWithOneOnUncaught, result: 1, error: /^Error: ok$/, }); function changeCodeInsideExit() { process.exitCode = 95; process.on('exit', (code) => { assert.strictEqual(process.exitCode, 95); assert.strictEqual(code, 95); process.exitCode = 99; }); } cases.push({ func: changeCodeInsideExit, result: 99 }); function zeroExitWithUncaughtHandler() { const noop = () => { }; process.on('exit', (code) => { process.off('uncaughtException', noop); assert.strictEqual(process.exitCode, undefined); assert.strictEqual(code, 0); }); process.on('uncaughtException', noop); throw new Error('ok'); } cases.push({ func: zeroExitWithUncaughtHandler, result: 0 }); function changeCodeInUncaughtHandler() { const modifyExitCode = () => { process.exitCode = 97; }; process.on('exit', (code) => { process.off('uncaughtException', modifyExitCode); assert.strictEqual(process.exitCode, 97); assert.strictEqual(code, 97); }); process.on('uncaughtException', modifyExitCode); throw new Error('ok'); } cases.push({ func: changeCodeInUncaughtHandler, result: 97 }); function changeCodeInExitWithUncaught() { process.on('exit', (code) => { assert.strictEqual(process.exitCode, 1); assert.strictEqual(code, 1); process.exitCode = 98; }); throw new Error('ok'); } cases.push({ func: changeCodeInExitWithUncaught, result: 98, error: /^Error: ok$/, }); function exitWithZeroInExitWithUncaught() { process.on('exit', (code) => { assert.strictEqual(process.exitCode, 1); assert.strictEqual(code, 1); process.exitCode = 0; }); throw new Error('ok'); } cases.push({ func: exitWithZeroInExitWithUncaught, result: 0, error: /^Error: ok$/, }); function exitWithThrowInUncaughtHandler() { process.on('uncaughtException', () => { throw new Error('ok'); }); throw new Error('bad'); } cases.push({ func: exitWithThrowInUncaughtHandler, result: isWorker ? 1 : 7, error: /^Error: ok$/, }); function exitWithUndefinedFatalException() { process._fatalException = undefined; throw new Error('ok'); } cases.push({ func: exitWithUndefinedFatalException, result: 6, }); return cases; } exports.getTestCases = getTestCases;