






















@@ -0,0 +1,78 @@
1+import fs from "node:fs";
2+import os from "node:os";
3+import path from "node:path";
4+import { afterEach, describe, expect, it, vi } from "vitest";
5+import { readLogTail, waitForLog } from "../../scripts/e2e/telegram-user-crabbox-proof.ts";
6+7+const tempDirs: string[] = [];
8+9+function makeTempDir(): string {
10+const dir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-telegram-proof-"));
11+tempDirs.push(dir);
12+return dir;
13+}
14+15+afterEach(() => {
16+vi.restoreAllMocks();
17+for (const dir of tempDirs.splice(0)) {
18+fs.rmSync(dir, { force: true, recursive: true });
19+}
20+});
21+22+describe("telegram user Crabbox proof log polling", () => {
23+it("reads only the requested log tail", () => {
24+const logPath = path.join(makeTempDir(), "gateway.log");
25+fs.writeFileSync(logPath, `${"old\n".repeat(2000)}ready\n`, "utf8");
26+27+const tail = readLogTail(logPath, 32);
28+29+expect(tail).toContain("ready");
30+expect(tail.length).toBeLessThanOrEqual(32);
31+expect(tail).not.toContain("old\nold\nold\nold\nold\nold\nold\nold\nold");
32+});
33+34+it("honors short reads when a log shrinks during tailing", () => {
35+vi.spyOn(fs, "statSync").mockReturnValue({
36+isFile: () => true,
37+size: 64,
38+} as fs.Stats);
39+vi.spyOn(fs, "openSync").mockReturnValue(123 as never);
40+vi.spyOn(fs, "closeSync").mockImplementation(() => undefined);
41+vi.spyOn(fs, "readSync").mockImplementation((_fd, buffer) => {
42+if (!Buffer.isBuffer(buffer)) {
43+throw new Error("expected buffer read");
44+}
45+buffer.write("ready");
46+return 5;
47+});
48+49+expect(readLogTail("/tmp/truncated.log", 64)).toBe("ready");
50+});
51+52+it("does not reread the full log while waiting for readiness", async () => {
53+const logPath = path.join(makeTempDir(), "mock-openai.log");
54+fs.writeFileSync(logPath, `${"noise\n".repeat(2000)}mock-openai listening\n`, "utf8");
55+const readFileSync = vi.spyOn(fs, "readFileSync").mockImplementation(() => {
56+throw new Error("full log read");
57+});
58+59+await waitForLog(logPath, /mock-openai listening/u, "mock-openai", 100);
60+61+expect(readFileSync).not.toHaveBeenCalled();
62+});
63+64+it("reports only a bounded log tail on timeout", async () => {
65+const logPath = path.join(makeTempDir(), "gateway.log");
66+fs.writeFileSync(logPath, `old-secret\n${"x".repeat(300_000)}recent failure\n`, "utf8");
67+68+let message = "";
69+try {
70+await waitForLog(logPath, /\[gateway\] ready/u, "gateway", 0);
71+} catch (error) {
72+message = error instanceof Error ? error.message : String(error);
73+}
74+75+expect(message).toContain("recent failure");
76+expect(message).not.toContain("old-secret");
77+});
78+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。