67 lines
2.1 KiB
TypeScript
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: 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);
|
|
});
|
|
});
|