mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 04:52:43 +00:00
perf(test): reduce gateway reload waits and trim duplicate invoke coverage
This commit is contained in:
@@ -4,6 +4,16 @@
|
||||
*/
|
||||
import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
|
||||
|
||||
function createDeferred<T = void>() {
|
||||
let resolve!: (value: T | PromiseLike<T>) => void;
|
||||
let reject!: (reason?: unknown) => void;
|
||||
const promise = new Promise<T>((res, rej) => {
|
||||
resolve = res;
|
||||
reject = rej;
|
||||
});
|
||||
return { promise, resolve, reject };
|
||||
}
|
||||
|
||||
describe("real scenario: config change during message processing", () => {
|
||||
let replyErrors: string[] = [];
|
||||
|
||||
@@ -26,8 +36,10 @@ describe("real scenario: config change during message processing", () => {
|
||||
|
||||
let rpcConnected = true;
|
||||
const deliveredReplies: string[] = [];
|
||||
const deliveryStarted = createDeferred();
|
||||
const allowDelivery = createDeferred();
|
||||
|
||||
// Create dispatcher with slow delivery (simulates real network delay)
|
||||
// Hold delivery open so restart checks run while reply is in-flight.
|
||||
const dispatcher = createReplyDispatcher({
|
||||
deliver: async (payload) => {
|
||||
if (!rpcConnected) {
|
||||
@@ -35,8 +47,8 @@ describe("real scenario: config change during message processing", () => {
|
||||
replyErrors.push(error);
|
||||
throw new Error(error);
|
||||
}
|
||||
// Slow delivery — restart checks will run during this window
|
||||
await new Promise((resolve) => setTimeout(resolve, 150));
|
||||
deliveryStarted.resolve();
|
||||
await allowDelivery.promise;
|
||||
deliveredReplies.push(payload.text ?? "");
|
||||
},
|
||||
onError: () => {
|
||||
@@ -49,6 +61,7 @@ describe("real scenario: config change during message processing", () => {
|
||||
// keeping pending > 0 is the in-flight delivery itself.
|
||||
dispatcher.sendFinalReply({ text: "Configuration updated!" });
|
||||
dispatcher.markComplete();
|
||||
await deliveryStarted.promise;
|
||||
|
||||
// At this point: markComplete flagged, delivery is in flight.
|
||||
// pending > 0 because the in-flight delivery keeps it alive.
|
||||
@@ -59,7 +72,7 @@ describe("real scenario: config change during message processing", () => {
|
||||
// If the tracking is broken, pending would be 0 and we'd restart.
|
||||
let restartTriggered = false;
|
||||
for (let i = 0; i < 3; i++) {
|
||||
await new Promise((resolve) => setTimeout(resolve, 25));
|
||||
await Promise.resolve();
|
||||
const pending = getTotalPendingReplies();
|
||||
if (pending === 0) {
|
||||
restartTriggered = true;
|
||||
@@ -68,6 +81,7 @@ describe("real scenario: config change during message processing", () => {
|
||||
}
|
||||
}
|
||||
|
||||
allowDelivery.resolve();
|
||||
// Wait for delivery to complete
|
||||
await dispatcher.waitForIdle();
|
||||
|
||||
@@ -83,10 +97,11 @@ describe("real scenario: config change during message processing", () => {
|
||||
it("should keep pending > 0 until reply is actually enqueued", async () => {
|
||||
const { createReplyDispatcher } = await import("../auto-reply/reply/reply-dispatcher.js");
|
||||
const { getTotalPendingReplies } = await import("../auto-reply/reply/dispatcher-registry.js");
|
||||
const allowDelivery = createDeferred();
|
||||
|
||||
const dispatcher = createReplyDispatcher({
|
||||
deliver: async (_payload) => {
|
||||
await new Promise((resolve) => setTimeout(resolve, 10));
|
||||
await allowDelivery.promise;
|
||||
},
|
||||
});
|
||||
|
||||
@@ -94,7 +109,7 @@ describe("real scenario: config change during message processing", () => {
|
||||
expect(getTotalPendingReplies()).toBe(1);
|
||||
|
||||
// Simulate command processing delay BEFORE reply is enqueued
|
||||
await new Promise((resolve) => setTimeout(resolve, 20));
|
||||
await Promise.resolve();
|
||||
|
||||
// During this delay, pending should STILL be 1 (reservation active)
|
||||
expect(getTotalPendingReplies()).toBe(1);
|
||||
@@ -112,6 +127,7 @@ describe("real scenario: config change during message processing", () => {
|
||||
const pendingAfterMarkComplete = getTotalPendingReplies();
|
||||
expect(pendingAfterMarkComplete).toBeGreaterThan(0);
|
||||
|
||||
allowDelivery.resolve();
|
||||
// Wait for reply to send
|
||||
await dispatcher.waitForIdle();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user