Skip to content

Commit e8c8817

Browse files
committed
test(telegram): tighten spooled drain race proof
1 parent ad1d06c commit e8c8817

1 file changed

Lines changed: 44 additions & 12 deletions

File tree

extensions/telegram/src/polling-session.test.ts

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,7 @@ describe("TelegramPollingSession", () => {
967967
expect(handleUpdate).toHaveBeenCalledWith({ update_id: 42, message: { text: "hello" } }),
968968
);
969969
await vi.waitFor(async () => expect(await pendingUpdateIds(tempDir, "all")).toEqual([]));
970+
abort.abort();
970971
stopWorker?.();
971972
await runPromise;
972973
} finally {
@@ -979,17 +980,43 @@ describe("TelegramPollingSession", () => {
979980
it("drains worker-spooled updates that arrive during an active drain", async () => {
980981
const abort = new AbortController();
981982
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-telegram-spool-"));
983+
let releaseFirstClaim: (() => void) | undefined;
984+
let firstClaimStarted: (() => void) | undefined;
985+
const firstClaimGate = new Promise<void>((resolve) => {
986+
releaseFirstClaim = resolve;
987+
});
988+
const firstClaimStartedPromise = new Promise<void>((resolve) => {
989+
firstClaimStarted = resolve;
990+
});
991+
let blockedFirstClaim = false;
992+
setTelegramRuntime({
993+
state: {
994+
resolveStateDir: () => tempDir,
995+
openChannelIngressQueue: (
996+
options?: Omit<Parameters<typeof createChannelIngressQueue>[0], "channelId">,
997+
) => {
998+
const queue = createChannelIngressQueue({ ...options, channelId: "telegram" });
999+
return {
1000+
...queue,
1001+
claim: async (...args: Parameters<typeof queue.claim>) => {
1002+
if (args[0] === "0000000000000001" && !blockedFirstClaim) {
1003+
blockedFirstClaim = true;
1004+
firstClaimStarted?.();
1005+
await firstClaimGate;
1006+
}
1007+
return queue.claim(...args);
1008+
},
1009+
};
1010+
},
1011+
},
1012+
} as TelegramRuntime);
9821013

9831014
await writeTelegramSpooledUpdate({
9841015
spoolDir: tempDir,
9851016
update: { update_id: 1, message: { text: "pre-seeded" } },
9861017
});
9871018

988-
const handleUpdate = vi.fn(async (update) => {
989-
if (update.update_id === 1) {
990-
await new Promise<void>((resolve) => { setTimeout(resolve, 300); });
991-
}
992-
});
1019+
const handleUpdate = vi.fn(async () => undefined);
9931020

9941021
const bot = {
9951022
api: {
@@ -1033,13 +1060,8 @@ describe("TelegramPollingSession", () => {
10331060
});
10341061

10351062
const runPromise = session.runUntilAbort();
1036-
1037-
await vi.waitFor(() =>
1038-
expect(handleUpdate).toHaveBeenCalledWith({
1039-
update_id: 1,
1040-
message: { text: "pre-seeded" },
1041-
}),
1042-
);
1063+
await vi.waitFor(() => expect(onMessage).toBeDefined());
1064+
await firstClaimStartedPromise;
10431065

10441066
onMessage?.({
10451067
type: "update",
@@ -1052,17 +1074,27 @@ describe("TelegramPollingSession", () => {
10521074
expect(ackSpooledUpdate).toHaveBeenCalledWith("write-2", { ok: true, updateId: 2 }),
10531075
);
10541076
onMessage?.({ type: "spooled", updateId: 2, queued: 1 });
1077+
releaseFirstClaim?.();
1078+
releaseFirstClaim = undefined;
10551079

1080+
await vi.waitFor(() =>
1081+
expect(handleUpdate).toHaveBeenCalledWith({
1082+
update_id: 1,
1083+
message: { text: "pre-seeded" },
1084+
}),
1085+
);
10561086
await vi.waitFor(() =>
10571087
expect(handleUpdate).toHaveBeenCalledWith({
10581088
update_id: 2,
10591089
message: { text: "during-drain" },
10601090
}),
10611091
);
10621092
await vi.waitFor(async () => expect(await pendingUpdateIds(tempDir, "all")).toEqual([]));
1093+
abort.abort();
10631094
stopWorker?.();
10641095
await runPromise;
10651096
} finally {
1097+
releaseFirstClaim?.();
10661098
abort.abort();
10671099
stopWorker?.();
10681100
await fs.rm(tempDir, { recursive: true, force: true });

0 commit comments

Comments
 (0)