Skip to content

Commit dbd26e4

Browse files
authored
fix(test): reduce startup-heavy hotspot retention (#52381)
1 parent 26d400b commit dbd26e4

12 files changed

Lines changed: 383 additions & 215 deletions

extensions/feishu/index.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@ const registerFeishuWikiToolsMock = vi.hoisted(() => vi.fn());
77
const registerFeishuDriveToolsMock = vi.hoisted(() => vi.fn());
88
const registerFeishuPermToolsMock = vi.hoisted(() => vi.fn());
99
const registerFeishuBitableToolsMock = vi.hoisted(() => vi.fn());
10+
const feishuPluginMock = vi.hoisted(() => ({ id: "feishu-test-plugin" }));
1011
const setFeishuRuntimeMock = vi.hoisted(() => vi.fn());
1112
const registerFeishuSubagentHooksMock = vi.hoisted(() => vi.fn());
1213

14+
vi.mock("./src/channel.js", () => ({
15+
feishuPlugin: feishuPluginMock,
16+
}));
17+
1318
vi.mock("./src/docx.js", () => ({
1419
registerFeishuDocTools: registerFeishuDocToolsMock,
1520
}));
@@ -58,6 +63,7 @@ describe("feishu plugin register", () => {
5863

5964
expect(setFeishuRuntimeMock).toHaveBeenCalledWith(api.runtime);
6065
expect(registerChannel).toHaveBeenCalledTimes(1);
66+
expect(registerChannel).toHaveBeenCalledWith({ plugin: feishuPluginMock });
6167
expect(registerFeishuSubagentHooksMock).toHaveBeenCalledWith(api);
6268
expect(registerFeishuDocToolsMock).toHaveBeenCalledWith(api);
6369
expect(registerFeishuChatToolsMock).toHaveBeenCalledWith(api);

extensions/msteams/src/monitor.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Server } from "node:http";
33
import { createConnection, type AddressInfo } from "node:net";
44
import express from "express";
55
import { describe, expect, it } from "vitest";
6-
import { applyMSTeamsWebhookTimeouts } from "./monitor.js";
6+
import { applyMSTeamsWebhookTimeouts } from "./webhook-timeouts.js";
77

88
async function closeServer(server: Server): Promise<void> {
99
await new Promise<void>((resolve) => {

extensions/msteams/src/monitor.ts

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { Server } from "node:http";
21
import type { Request, Response } from "express";
32
import {
43
DEFAULT_WEBHOOK_MAX_BODY_BYTES,
@@ -21,6 +20,10 @@ import {
2120
import { getMSTeamsRuntime } from "./runtime.js";
2221
import { createMSTeamsAdapter, loadMSTeamsSdkWithAuth } from "./sdk.js";
2322
import { resolveMSTeamsCredentials } from "./token.js";
23+
import {
24+
applyMSTeamsWebhookTimeouts,
25+
type ApplyMSTeamsWebhookTimeoutsOpts,
26+
} from "./webhook-timeouts.js";
2427

2528
export type MonitorMSTeamsOpts = {
2629
cfg: OpenClawConfig;
@@ -36,32 +39,6 @@ export type MonitorMSTeamsResult = {
3639
};
3740

3841
const MSTEAMS_WEBHOOK_MAX_BODY_BYTES = DEFAULT_WEBHOOK_MAX_BODY_BYTES;
39-
const MSTEAMS_WEBHOOK_INACTIVITY_TIMEOUT_MS = 30_000;
40-
const MSTEAMS_WEBHOOK_REQUEST_TIMEOUT_MS = 30_000;
41-
const MSTEAMS_WEBHOOK_HEADERS_TIMEOUT_MS = 15_000;
42-
43-
export type ApplyMSTeamsWebhookTimeoutsOpts = {
44-
inactivityTimeoutMs?: number;
45-
requestTimeoutMs?: number;
46-
headersTimeoutMs?: number;
47-
};
48-
49-
export function applyMSTeamsWebhookTimeouts(
50-
httpServer: Server,
51-
opts?: ApplyMSTeamsWebhookTimeoutsOpts,
52-
): void {
53-
const inactivityTimeoutMs = opts?.inactivityTimeoutMs ?? MSTEAMS_WEBHOOK_INACTIVITY_TIMEOUT_MS;
54-
const requestTimeoutMs = opts?.requestTimeoutMs ?? MSTEAMS_WEBHOOK_REQUEST_TIMEOUT_MS;
55-
const headersTimeoutMs = Math.min(
56-
opts?.headersTimeoutMs ?? MSTEAMS_WEBHOOK_HEADERS_TIMEOUT_MS,
57-
requestTimeoutMs,
58-
);
59-
60-
httpServer.setTimeout(inactivityTimeoutMs);
61-
httpServer.requestTimeout = requestTimeoutMs;
62-
httpServer.headersTimeout = headersTimeoutMs;
63-
}
64-
6542
export async function monitorMSTeamsProvider(
6643
opts: MonitorMSTeamsOpts,
6744
): Promise<MonitorMSTeamsResult> {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { Server } from "node:http";
2+
3+
const MSTEAMS_WEBHOOK_INACTIVITY_TIMEOUT_MS = 30_000;
4+
const MSTEAMS_WEBHOOK_REQUEST_TIMEOUT_MS = 30_000;
5+
const MSTEAMS_WEBHOOK_HEADERS_TIMEOUT_MS = 15_000;
6+
7+
export type ApplyMSTeamsWebhookTimeoutsOpts = {
8+
inactivityTimeoutMs?: number;
9+
requestTimeoutMs?: number;
10+
headersTimeoutMs?: number;
11+
};
12+
13+
export function applyMSTeamsWebhookTimeouts(
14+
httpServer: Server,
15+
opts?: ApplyMSTeamsWebhookTimeoutsOpts,
16+
): void {
17+
const inactivityTimeoutMs = opts?.inactivityTimeoutMs ?? MSTEAMS_WEBHOOK_INACTIVITY_TIMEOUT_MS;
18+
const requestTimeoutMs = opts?.requestTimeoutMs ?? MSTEAMS_WEBHOOK_REQUEST_TIMEOUT_MS;
19+
const headersTimeoutMs = Math.min(
20+
opts?.headersTimeoutMs ?? MSTEAMS_WEBHOOK_HEADERS_TIMEOUT_MS,
21+
requestTimeoutMs,
22+
);
23+
24+
httpServer.setTimeout(inactivityTimeoutMs);
25+
httpServer.requestTimeout = requestTimeoutMs;
26+
httpServer.headersTimeout = headersTimeoutMs;
27+
}

scripts/test-parallel.mjs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ const unitBehaviorIsolatedFiles = existingUnitConfigFiles(behaviorManifest.unit.
5454
const unitSingletonIsolatedFiles = existingUnitConfigFiles(behaviorManifest.unit.singletonIsolated);
5555
const unitThreadSingletonFiles = existingUnitConfigFiles(behaviorManifest.unit.threadSingleton);
5656
const unitVmForkSingletonFiles = existingUnitConfigFiles(behaviorManifest.unit.vmForkSingleton);
57+
const extensionSingletonIsolatedFiles = existingFiles(
58+
behaviorManifest.extensions.singletonIsolated,
59+
);
5760
const unitBehaviorOverrideSet = new Set([
5861
...unitBehaviorIsolatedFiles,
5962
...unitSingletonIsolatedFiles,
@@ -440,6 +443,10 @@ const unitFastExcludedFileSet = new Set(unitFastExcludedFiles);
440443
const unitFastCandidateFiles = allKnownUnitFiles.filter(
441444
(file) => !unitFastExcludedFileSet.has(file),
442445
);
446+
const extensionSingletonExcludedFileSet = new Set(extensionSingletonIsolatedFiles);
447+
const extensionSharedCandidateFiles = allKnownTestFiles.filter(
448+
(file) => file.startsWith("extensions/") && !extensionSingletonExcludedFileSet.has(file),
449+
);
443450
const defaultUnitFastLaneCount = isCI && !isWindows ? 3 : 1;
444451
const unitFastLaneCount = Math.max(
445452
1,
@@ -516,6 +523,10 @@ const unitThreadEntries =
516523
},
517524
]
518525
: [];
526+
const extensionSingletonEntries = extensionSingletonIsolatedFiles.map((file) => ({
527+
name: `${path.basename(file, ".test.ts")}-extensions-isolated`,
528+
args: ["vitest", "run", "--config", "vitest.extensions.config.ts", "--pool=forks", file],
529+
}));
519530
const baseRuns = [
520531
...(shouldSplitUnitRuns
521532
? [
@@ -583,6 +594,15 @@ const baseRuns = [
583594
? [
584595
{
585596
name: "extensions",
597+
env:
598+
extensionSharedCandidateFiles.length > 0
599+
? {
600+
OPENCLAW_VITEST_INCLUDE_FILE: writeTempJsonArtifact(
601+
"vitest-extensions-include",
602+
extensionSharedCandidateFiles,
603+
),
604+
}
605+
: undefined,
586606
args: [
587607
"vitest",
588608
"run",
@@ -591,6 +611,7 @@ const baseRuns = [
591611
...(useVmForks ? ["--pool=vmForks"] : []),
592612
],
593613
},
614+
...extensionSingletonEntries,
594615
]
595616
: []),
596617
...(includeGatewaySuite

scripts/test-runner-manifest.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export function loadTestRunnerBehavior() {
3131
const raw = tryReadJsonFile(behaviorManifestPath, {});
3232
const unit = raw.unit ?? {};
3333
const base = raw.base ?? {};
34+
const extensions = raw.extensions ?? {};
3435
return {
3536
base: {
3637
threadSingleton: normalizeManifestEntries(base.threadSingleton ?? []),
@@ -41,6 +42,9 @@ export function loadTestRunnerBehavior() {
4142
threadSingleton: normalizeManifestEntries(unit.threadSingleton ?? []),
4243
vmForkSingleton: normalizeManifestEntries(unit.vmForkSingleton ?? []),
4344
},
45+
extensions: {
46+
singletonIsolated: normalizeManifestEntries(extensions.singletonIsolated ?? []),
47+
},
4448
};
4549
}
4650

0 commit comments

Comments
 (0)