import { describe, expect, it } from "vite-plus/test"; import { INITIAL_WEBVIEW_CRASH_RECOVERY_STATE, planWebviewCrashRecovery, WEBVIEW_CRASH_RECOVERY_WINDOW_MS,} from "./webviewCrashRecovery"; describe("planWebviewCrashRecovery", () => { it("backs off and stops after a bounded number of rapid crashes", () => { const first = planWebviewCrashRecovery(INITIAL_WEBVIEW_CRASH_RECOVERY_STATE, 1_000); expect(first).not.toBeNull(); expect(first?.delayMs).toBe(250); const second = planWebviewCrashRecovery(first!.state, 1_100); expect(second).not.toBeNull(); expect(second?.delayMs).toBe(500); const third = planWebviewCrashRecovery(second!.state, 1_200); expect(third).not.toBeNull(); expect(third?.delayMs).toBe(1_000); expect(planWebviewCrashRecovery(third!.state, 1_300)).toBeNull(); }); it("allows recovery again after the crash window expires", () => { const first = planWebviewCrashRecovery(INITIAL_WEBVIEW_CRASH_RECOVERY_STATE, 1_000)!; const second = planWebviewCrashRecovery(first.state, 1_100)!; const third = planWebviewCrashRecovery(second.state, 1_200)!; expect(planWebviewCrashRecovery(third.state, 1_000 + WEBVIEW_CRASH_RECOVERY_WINDOW_MS)).toEqual( { delayMs: 250, state: { attempts: 1, windowStartedAt: 1_000 + WEBVIEW_CRASH_RECOVERY_WINDOW_MS, }, }, ); });});
import { describe, expect, it } from "vite-plus/test";
import {
INITIAL_WEBVIEW_CRASH_RECOVERY_STATE,
planWebviewCrashRecovery,
WEBVIEW_CRASH_RECOVERY_WINDOW_MS,
} from "./webviewCrashRecovery";
describe("planWebviewCrashRecovery", () => {
it("backs off and stops after a bounded number of rapid crashes", () => {
const first = planWebviewCrashRecovery(INITIAL_WEBVIEW_CRASH_RECOVERY_STATE, 1_000);
expect(first).not.toBeNull();
expect(first?.delayMs).toBe(250);
const second = planWebviewCrashRecovery(first!.state, 1_100);
expect(second).not.toBeNull();
expect(second?.delayMs).toBe(500);
const third = planWebviewCrashRecovery(second!.state, 1_200);
expect(third).not.toBeNull();
expect(third?.delayMs).toBe(1_000);
expect(planWebviewCrashRecovery(third!.state, 1_300)).toBeNull();
});
it("allows recovery again after the crash window expires", () => {
const first = planWebviewCrashRecovery(INITIAL_WEBVIEW_CRASH_RECOVERY_STATE, 1_000)!;
const second = planWebviewCrashRecovery(first.state, 1_100)!;
const third = planWebviewCrashRecovery(second.state, 1_200)!;
expect(planWebviewCrashRecovery(third.state, 1_000 + WEBVIEW_CRASH_RECOVERY_WINDOW_MS)).toEqual(
{
delayMs: 250,
state: {
attempts: 1,
windowStartedAt: 1_000 + WEBVIEW_CRASH_RECOVERY_WINDOW_MS,
},
},
);
});
});