Files
orca/tests/e2e/orca-restart-navigation.unit.test.ts
T
OrcaWinandBrennan Benson 0b71f3bfba test(e2e): prove the terminal daemon survives a main-process crash on Windows (#7742) (#9311)
* test(e2e): prove the terminal daemon survives a main-process crash on Windows (#7742)

Add a win-crash-survival e2e harness (sibling to win-update-e2e) that
force-kills ONLY the packaged app's real Electron main (resolved via
app.evaluate -> process.pid, /F no /T) and asserts the detached
orca-terminal-daemon.exe plus its ConPTY shell survive with no pwsh
0xE9 FailFast, then that a relaunch re-adopts the SAME daemon and the
reattached UI binds to the SAME survivor shell (proved via a per-shell
env sentinel read back through the restored terminal).

This guards the #7742 fix (standalone relocated daemon that outlives
main death) against regression. A directional `--expect orphaned`
profile fails on a fixed build, keeping the survival assertions honest.

Windows-only; reuses win-update-e2e app-driver/daemon-process modules.

* test(e2e): harden Windows crash-survival proof

* test(ci): keep crash survival gate durable

* test(e2e): tolerate restart hydration navigation

* test(e2e): prove exact shell input after crash

* perf(ci): avoid crash harness installer rebuilds

* test(ci): harden crash survival evidence and cost

* test(e2e): fail closed on authoritative crash target

* test(e2e): fail closed on crash liveness evidence

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-07-19 11:27:29 -07:00

21 lines
677 B
TypeScript

import { describe, expect, it } from 'vitest'
import { readRestartRendererState } from './helpers/orca-restart'
describe('restart renderer state polling', () => {
it('treats document replacement as pending state', async () => {
await expect(
readRestartRendererState(async () => {
throw new Error('Execution context was destroyed, most likely because of a navigation.')
})
).resolves.toBeNull()
})
it('does not hide non-navigation renderer failures', async () => {
await expect(
readRestartRendererState(async () => {
throw new Error('fetchWorktrees failed')
})
).rejects.toThrow('fetchWorktrees failed')
})
})