fix: manager races, shutdown order, tool bounds
This commit is contained in:
@@ -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 () => {
|
||||
|
||||
Reference in New Issue
Block a user