fix(pi): harden release proof lifecycle
This commit is contained in:
66
tests/unit/pi-release-proof-cleanup.test.ts
Normal file
66
tests/unit/pi-release-proof-cleanup.test.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
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: 8,
|
||||
providerRequests: 8,
|
||||
processBudget: 8,
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user