1820 unmodified lines
Expand all
});
it("reclaims a dead failed resident so a fresh create can reopen its session", async () => {
const worker = {
descriptor: { workerId: "failed-resident", pid: 42, lifecycle: "failed" as const },
descriptor: {
workerId: "failed-resident",
pid: 42,
lifecycle: "failed" as const,
ownerClientId: "disconnected-client",
},
intentionalStop: false,
};
const workers = new Map([[worker.descriptor.workerId, worker]]);
const recoverUncertainWorkerOperations = vi.fn(async () => {});
1879 unmodified lines
Expand all
kill.mockRestore();
rmSync(root, { recursive: true, force: true });
}
});
it("removes proven-dead failed registrations before update preparation", async () => {
const worker = {
descriptor: {
workerId: "dead-owned-worker",
pid: 42,
lifecycle: "failed" as const,
ownerClientId: "disconnected-client",
rootActiveSessionId: "root",
},
client: undefined,
recovery: undefined,
};
const workers = new Map([[worker.descriptor.workerId, worker]]);
const reclaimStaleWorkerRegistration = vi.fn(async () => {
workers.delete(worker.descriptor.workerId);
return true;
});
const validateAndPersistUpdateManifest = vi.fn();
const supervisor = Object.assign(Object.create(DaemonSupervisor.prototype), {
workers,
reclaimStaleWorkerRegistration,
validateAndPersistUpdateManifest,
}) as { prepareUpdateRestartFenced(deadline: number): Promise<{ sessions: unknown[] }> };
await expect(supervisor.prepareUpdateRestartFenced(Date.now() + 1000)).resolves.toMatchObject({ sessions: [] });
expect(reclaimStaleWorkerRegistration).toHaveBeenCalledWith(worker);
expect(validateAndPersistUpdateManifest).toHaveBeenCalledOnce();
});
it.each([
{ name: "malformed data", data: undefined, error: /invalid update manifest/ },
{
name: "missing root disposition",
224 unmodified lines
Expand all