48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { handleUnexpectedChildExit } from './dev-process-lifecycle.mjs';
|
|
|
|
function invokeExit({ code, signal, stopping = false }) {
|
|
const shutdownCodes = [];
|
|
const messages = [];
|
|
const handled = handleUnexpectedChildExit({
|
|
label: 'portal',
|
|
code,
|
|
signal,
|
|
stopping,
|
|
shutdown: (shutdownCode) => shutdownCodes.push(shutdownCode),
|
|
log: (message) => messages.push(message),
|
|
});
|
|
return { handled, shutdownCodes, messages };
|
|
}
|
|
|
|
test('clean child exit shuts down the remaining dev stack as a failure', () => {
|
|
const result = invokeExit({ code: 0, signal: null });
|
|
|
|
assert.equal(result.handled, true);
|
|
assert.deepEqual(result.shutdownCodes, [1]);
|
|
assert.match(result.messages[0], /code 0/);
|
|
});
|
|
|
|
test('signal exit shuts down the remaining dev stack as a failure', () => {
|
|
const result = invokeExit({ code: null, signal: 'SIGKILL' });
|
|
|
|
assert.equal(result.handled, true);
|
|
assert.deepEqual(result.shutdownCodes, [1]);
|
|
assert.match(result.messages[0], /signal SIGKILL/);
|
|
});
|
|
|
|
test('non-zero child exit preserves its failure code', () => {
|
|
const result = invokeExit({ code: 7, signal: null });
|
|
|
|
assert.deepEqual(result.shutdownCodes, [7]);
|
|
});
|
|
|
|
test('child exits during an intentional shutdown are ignored', () => {
|
|
const result = invokeExit({ code: 0, signal: null, stopping: true });
|
|
|
|
assert.equal(result.handled, false);
|
|
assert.deepEqual(result.shutdownCodes, []);
|
|
assert.deepEqual(result.messages, []);
|
|
});
|