From bdae83334c435b0d94bb80c90f4d046fa104f7ee Mon Sep 17 00:00:00 2001 From: can1357 Date: Wed, 29 Jul 2026 22:52:20 +0200 Subject: [PATCH] test(tui): cover stdout backlog guard wiring (cherry picked from commit f7996776d11efdfa835cef93a308a33f60ea604c) --- .../tui/test/output-backlog-guard.test.ts | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/tui/test/output-backlog-guard.test.ts b/packages/tui/test/output-backlog-guard.test.ts index 687cead27..9bd2450d7 100644 --- a/packages/tui/test/output-backlog-guard.test.ts +++ b/packages/tui/test/output-backlog-guard.test.ts @@ -1,5 +1,6 @@ -import { describe, expect, it } from "bun:test"; -import { OutputBacklogGuard } from "@oh-my-pi/pi-tui/terminal"; +import { describe, expect, it, vi } from "bun:test"; +import { OutputBacklogGuard, ProcessTerminal } from "@oh-my-pi/pi-tui/terminal"; +import { setTerminalHeadless } from "@oh-my-pi/pi-utils"; // Regression test for https://github.com/can1357/oh-my-pi/issues/6854 // @@ -53,3 +54,30 @@ describe("issue #6854: OutputBacklogGuard bounds a stalled stdout", () => { expect(guard.record(false, 1)).toBe(true); }); }); + +it("stops writing when the real terminal path crosses the backlog cap", () => { + const previousHeadless = setTerminalHeadless(false); + const isTTY = Object.getOwnPropertyDescriptor(process.stdout, "isTTY"); + let writes = 0; + const stdout = vi.spyOn(process.stdout, "write").mockImplementation(() => { + writes++; + return false; + }); + + try { + Object.defineProperty(process.stdout, "isTTY", { value: true, configurable: true }); + const terminal = new ProcessTerminal(); + const frame = "x".repeat(1024 * 1024); + for (let i = 0; i < 70; i++) terminal.write(frame); + + // The 65th MiB crosses the 64 MiB cap and marks the terminal dead; + // later frames must not reach stdout. + expect(writes).toBe(65); + process.stdout.emit("drain"); + } finally { + stdout.mockRestore(); + if (isTTY) Object.defineProperty(process.stdout, "isTTY", isTTY); + else Reflect.deleteProperty(process.stdout, "isTTY"); + setTerminalHeadless(previousHeadless); + } +});