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, []); });