Files
looper/e2e/test_stress_random.ts
2026-06-06 17:46:52 +00:00

81 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { setupTest, startEngine, startClientInTmux, openCmdFifo, writeFifoCommand, wait, tmuxSendKeys, tmuxCapturePane, isProcessAlive, execSync, teardownTest } from './test_utils';
export async function testStressRandomUsage(): Promise<void> {
console.log("\nTest: STRESS RANDOM USAGE (10,000 keys, stability check)");
setupTest();
const engine = await startEngine();
await startClientInTmux();
openCmdFifo();
await wait(500);
// Preadd channels for more variety
for (let i = 0; i < 7; i++) {
writeFifoCommand("add");
await wait(100);
}
const KEY_ACTIONS = ['h','j','k','l','t','d','s','S','a','A','r','b','u'];
const TOTAL = 5000;
const KEY_DELAY_MS = 20;
const CHECK_INTERVAL = 500;
console.log(` Starting stress loop: ${TOTAL} keys at ~20 keys/second...`);
let keysSent = 0;
const startTime = Date.now();
for (let i = 0; i < TOTAL; i++) {
const key = KEY_ACTIONS[Math.floor(Math.random() * KEY_ACTIONS.length)];
tmuxSendKeys("looper", "0", key);
await wait(KEY_DELAY_MS);
keysSent++;
if (keysSent % CHECK_INTERVAL === 0) {
// Wait a little for TUI to settle
await wait(500);
// Check engine alive
if (engine.pid && !isProcessAlive(engine.pid)) {
console.log(` FAIL: Engine died at key ${keysSent}`);
try {
const stderr = execSync("tail -20 /tmp/engine_stderr.log", { encoding: "utf-8" }).trim();
console.log(" Engine stderr:", stderr);
} catch {}
teardownTest();
throw new Error("Engine crash during stress test");
}
// Wait a little more for TUI to settle and pane to be captured fully
await wait(1000);
// Retry pane capture up to 5 times with small delays if it doesn't contain "Selected:"
let pane = "";
for (let retry = 0; retry < 5; retry++) {
pane = tmuxCapturePane("looper", "0");
if (pane && pane.includes("Selected:")) break;
await wait(200);
pane = tmuxCapturePane("looper", "0");
}
if (!pane || !pane.includes("Selected:")) {
console.log(` FAIL: TUI pane appears corrupted at key ${keysSent}`);
console.log(" Pane:\n" + (pane ? pane.slice(0, 1000) : "(empty)"));
teardownTest();
throw new Error("TUI corruption during stress test");
}
}
}
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
console.log(` Stress loop finished in ${elapsed}s`);
await wait(500);
if (engine.pid && !isProcessAlive(engine.pid)) {
console.log(" FAIL: Engine died after test");
teardownTest();
throw new Error("Engine crash");
}
console.log(" PASS: Stress test completed (no crash or corruption)");
engine.kill();
teardownTest();
}