Merge pull request #8185 from deepseek-harness/fix/git-timeout-exit-status

test(plugin-manager): 核对 Git 超时后的实际退出状态
This commit is contained in:
Yichen Jiang authored and GitHub committed 2026-11-09 17:52:27 +08:00
commit 8f3df318d5
1 file changed
+20 -2
@@ -118,8 +118,14 @@ it('ends a silent proxy connection and its Git child at the connection deadline'
await transport.connected
const result = await running
expect(result?.kind).toBe('timeout')
// The result records the status the terminated Git is read as; only the streamed run reports no exit code.
expect(result).toMatchObject({ exitCode: 1, timedOut: true, argv: checkArgv('https://github.com/acme/plugin.git') })
// Git's termination status varies by platform; preserve the observed status, or the fallback when absent.
const childRun = vi.mocked(subprocess.execa).mock.results.at(-1)
if (childRun?.type !== 'return') throw new Error('Git probe did not return a child process')
const childResult = await childRun.value
expect(childResult.timedOut).toBe(true)
expect(result).toMatchObject({
exitCode: childResult.exitCode ?? 1, timedOut: true, argv: checkArgv('https://github.com/acme/plugin.git'),
})
expect(result!.output).toContain('connection to github.com timed out after 3000ms')
await transport.disconnected
expect(transport.sockets.size).toBe(0)
@@ -137,6 +143,18 @@ it('cancels a connected Git probe and closes its transport before the deadline',
expect(transport.sockets.size).toBe(0)
})
it.each([128, undefined])('reports a timeout while retaining Git exit status %s', async (exitCode) => {
const { check } = await fixture()
const run = vi.spyOn(subprocess, 'execa').mockResolvedValue({
failed: true, timedOut: true, exitCode,
} as Awaited<ReturnType<typeof subprocess.execa>>)
onTestFinished(() => { run.mockRestore() })
const result = await check('github:acme/plugin')
expect(result).toMatchObject({ exitCode: exitCode ?? 1, timedOut: true, kind: 'timeout' })
expect(result!.output).toContain('connection to github.com timed out after 3000ms')
expect(await readFile(result!.logPath, 'utf8')).toBe(result!.output)
})
it.each([undefined, 'Git could not start'])('retains a diagnostic when Git writes no stderr (%s)', async (shortMessage) => {
const { check } = await fixture()
const run = vi.spyOn(subprocess, 'execa').mockResolvedValue({ failed: true, shortMessage } as Awaited<ReturnType<typeof subprocess.execa>>)