fix: manager races, shutdown order, tool bounds

This commit is contained in:
smartass
2026-06-12 00:21:51 +05:00
parent 6bf2aa74ca
commit ae34ad1bc9
5 changed files with 115 additions and 30 deletions
+45 -3
View File
@@ -175,12 +175,54 @@ describe('createManager', () => {
const pending = manager.get('c')
const invalidated = manager.invalidate('c')
release()
await pending
await invalidated
// The first build is disposed by invalidate; the pending get loses
// ownership and retries, resolving to a freshly rebuilt driver.
expect((await pending).driver).toBe(drivers[1])
expect(drivers[0].disposed).toBe(true)
expect(tunnels[0].closed).toBe(true)
const rebuilt = await manager.get('c')
expect(rebuilt.driver).toBe(drivers[1])
})
it('get racing disposeAll does not return a disposed entry', async () => {
let release: () => void = () => {}
const gate = new Promise<void>((resolve) => {
release = resolve
})
const gatedTunnel = vi.fn(async (ssh: SshConfig, host: string, port: number) => {
await gate
return createTunnel(ssh, host, port)
})
resolved = { config: config(sshExtra()), source: 'store', hash: 'ssh1' }
const manager = createManager(registry, { createDriver, createTunnel: gatedTunnel })
const pending = manager.get('c')
const disposed = manager.disposeAll()
release()
await disposed
// The gated build is disposed; the pending get retries and returns a
// fresh entry that was never disposed.
const managed = await pending
expect(managed.driver).toBe(drivers[1])
expect(drivers[0].disposed).toBe(true)
expect(drivers[1].disposed).toBe(false)
})
it('closes the tunnel when createDriver throws and a retry succeeds', async () => {
const throwingDriver = vi
.fn<(target: DriverTarget) => Driver>()
.mockImplementationOnce(() => {
throw new Error('driver boom')
})
.mockImplementation(createDriver)
resolved = { config: config(sshExtra()), source: 'store', hash: 'ssh1' }
const manager = createManager(registry, {
createDriver: throwingDriver,
createTunnel
})
await expect(manager.get('c')).rejects.toThrow('driver boom')
expect(tunnels[0].closed).toBe(true)
const retried = await manager.get('c')
expect(retried.driver).toBe(drivers[0])
expect(tunnels[1].closed).toBe(false)
})
it('disposeAll disposes everything', async () => {