Files
makelore/tests/unit/pi-release-proof-cleanup.test.ts

67 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { runPiReleasePressureCleanup } from '../../electron/coding-runtime/pi/release-proof-cleanup';
describe('PI release pressure cleanup', () => {
it('continues after an injected failure, reaches zero, and can be retried', async () => {
const counts = {
parentWorkers: 4,
childWorkers: 4,
liveProcessIds: 5,
providerRequests: 8,
processBudget: 4,
childPermits: 4,
dispatches: 4,
writeLeases: 4,
};
let failParentSettle = true;
const steps = [
{ name: 'provider.release', run: () => { counts.providerRequests = 0; } },
{
name: 'dispatches.settle',
run: () => {
counts.childWorkers = 0;
counts.childPermits = 0;
counts.dispatches = 0;
},
},
{
name: 'parents.settle',
run: () => {
if (failParentSettle) {
failParentSettle = false;
throw new Error('injected parent settle failure');
}
},
},
{
name: 'pool.shutdown',
run: () => {
counts.parentWorkers = 0;
counts.liveProcessIds = 0;
counts.processBudget = 0;
},
},
{ name: 'leases.release', run: () => { counts.writeLeases = 0; } },
];
await expect(runPiReleasePressureCleanup(steps))
.rejects.toThrow('PI release pressure cleanup failed: parents.settle');
expect(Object.values(counts)).toEqual([0, 0, 0, 0, 0, 0, 0, 0]);
await expect(runPiReleasePressureCleanup(steps)).resolves.toBeUndefined();
expect(Object.values(counts)).toEqual([0, 0, 0, 0, 0, 0, 0, 0]);
});
it('bounds a hanging step and still runs later cleanup', async () => {
let released = false;
await expect(runPiReleasePressureCleanup([
{ name: 'hang', run: async () => await new Promise(() => undefined) },
{ name: 'release', run: () => { released = true; } },
], { stepTimeoutMs: 10 })).rejects.toThrow(
'PI release pressure cleanup failed: hang',
);
expect(released).toBe(true);
});
});