






















@@ -47,6 +47,31 @@ async function createEmptyBundledPluginsDir(tempHome: string): Promise<string> {
4747return bundledPluginsDir;
4848}
494950+async function createGatewayConfigPath(tempHome: string): Promise<string> {
51+const configPath = path.join(tempHome, ".openclaw", "openclaw.json");
52+await fs.mkdir(path.dirname(configPath), { recursive: true });
53+return configPath;
54+}
55+56+async function removeGatewayTempHome(tempHome: string): Promise<void> {
57+await fs.rm(tempHome, {
58+recursive: true,
59+force: true,
60+maxRetries: 10,
61+retryDelay: 50,
62+});
63+}
64+65+async function startLoopbackTokenGateway(token: string) {
66+const port = await getFreeGatewayPort();
67+const server = await startGatewayServer(port, {
68+bind: "loopback",
69+auth: { mode: "token", token },
70+controlUiEnabled: false,
71+});
72+return { port, server };
73+}
74+5075async function writeWorkspacePlugin(params: {
5176workspaceDir: string;
5277id: string;
@@ -130,24 +155,19 @@ async function setupGatewayTempHome(params: { prefix: string; minimalGateway?: b
130155return { envSnapshot, tempHome, workspaceDir };
131156}
132157158+function resetGatewayTestState(): void {
159+clearRuntimeConfigSnapshot();
160+clearConfigCache();
161+clearSessionStoreCacheForTest();
162+resetAgentRunContextForTest();
163+clearAllBootstrapSnapshots();
164+clearGatewaySubagentRuntime();
165+}
166+133167describe("gateway e2e", () => {
134-beforeEach(() => {
135-clearRuntimeConfigSnapshot();
136-clearConfigCache();
137-clearSessionStoreCacheForTest();
138-resetAgentRunContextForTest();
139-clearAllBootstrapSnapshots();
140-clearGatewaySubagentRuntime();
141-});
168+beforeEach(resetGatewayTestState);
142169143-afterEach(() => {
144-clearRuntimeConfigSnapshot();
145-clearConfigCache();
146-clearSessionStoreCacheForTest();
147-resetAgentRunContextForTest();
148-clearAllBootstrapSnapshots();
149-clearGatewaySubagentRuntime();
150-});
170+afterEach(resetGatewayTestState);
151171152172beforeAll(async () => {
153173({ createConfigIO } = await import("../config/config.js"));
@@ -166,9 +186,7 @@ describe("gateway e2e", () => {
166186const token = nextGatewayId("test-token");
167187process.env.OPENCLAW_GATEWAY_TOKEN = token;
168188169-const configDir = path.join(tempHome, ".openclaw");
170-await fs.mkdir(configDir, { recursive: true });
171-const configPath = path.join(configDir, "openclaw.json");
189+const configPath = await createGatewayConfigPath(tempHome);
172190const mockProvider = buildMockOpenAiResponsesProvider(openaiBaseUrl);
173191174192const cfg = {
@@ -222,12 +240,7 @@ describe("gateway e2e", () => {
222240} finally {
223241await disconnectGatewayClient(client);
224242await server.close({ reason: "mock openai test complete" });
225-await fs.rm(tempHome, {
226-recursive: true,
227-force: true,
228-maxRetries: 10,
229-retryDelay: 50,
230-});
243+await removeGatewayTempHome(tempHome);
231244restore();
232245envSnapshot.restore();
233246}
@@ -264,9 +277,7 @@ module.exports = {
264277`.trimStart(),
265278});
266279267-const configDir = path.join(tempHome, ".openclaw");
268-await fs.mkdir(configDir, { recursive: true });
269-const configPath = path.join(configDir, "openclaw.json");
280+const configPath = await createGatewayConfigPath(tempHome);
270281const cfg = {
271282agents: {
272283defaults: { workspace: workspaceDir },
@@ -280,12 +291,7 @@ module.exports = {
280291await fs.writeFile(configPath, `${JSON.stringify(cfg, null, 2)}\n`);
281292process.env.OPENCLAW_CONFIG_PATH = configPath;
282293283-const port = await getFreeGatewayPort();
284-const server = await startGatewayServer(port, {
285-bind: "loopback",
286-auth: { mode: "token", token },
287-controlUiEnabled: false,
288-});
294+const { port, server } = await startLoopbackTokenGateway(token);
289295290296try {
291297const beforeCount = await readCounterWithRetry(registerCountPath);
@@ -314,12 +320,7 @@ module.exports = {
314320expect(afterCount).toBe(beforeCount);
315321} finally {
316322await server.close({ reason: "http tools workspace test complete" });
317-await fs.rm(tempHome, {
318-recursive: true,
319-force: true,
320-maxRetries: 10,
321-retryDelay: 50,
322-});
323+await removeGatewayTempHome(tempHome);
323324envSnapshot.restore();
324325}
325326},
@@ -329,38 +330,14 @@ module.exports = {
329330"runs wizard over ws and writes auth token config",
330331{ timeout: GATEWAY_E2E_TIMEOUT_MS },
331332async () => {
332-const envSnapshot = captureEnv([
333-"HOME",
334-"OPENCLAW_STATE_DIR",
335-"OPENCLAW_CONFIG_PATH",
336-"OPENCLAW_GATEWAY_TOKEN",
337-"OPENCLAW_SKIP_CHANNELS",
338-"OPENCLAW_SKIP_GMAIL_WATCHER",
339-"OPENCLAW_SKIP_CRON",
340-"OPENCLAW_SKIP_CANVAS_HOST",
341-"OPENCLAW_SKIP_BROWSER_CONTROL_SERVER",
342-"OPENCLAW_SKIP_PROVIDERS",
343-"OPENCLAW_BUNDLED_PLUGINS_DIR",
344-"OPENCLAW_DISABLE_BUNDLED_PLUGINS",
345-"OPENCLAW_TEST_MINIMAL_GATEWAY",
346-]);
347-348-process.env.OPENCLAW_SKIP_CHANNELS = "1";
349-process.env.OPENCLAW_SKIP_GMAIL_WATCHER = "1";
350-process.env.OPENCLAW_SKIP_CRON = "1";
351-process.env.OPENCLAW_SKIP_CANVAS_HOST = "1";
352-process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER = "1";
353-process.env.OPENCLAW_SKIP_PROVIDERS = "1";
354-process.env.OPENCLAW_TEST_MINIMAL_GATEWAY = "1";
333+const { envSnapshot, tempHome } = await setupGatewayTempHome({
334+prefix: "openclaw-wizard-home-",
335+minimalGateway: true,
336+});
355337delete process.env.OPENCLAW_GATEWAY_TOKEN;
356338357-const tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-wizard-home-"));
358-const configPath = path.join(tempHome, ".openclaw", "openclaw.json");
359-process.env.HOME = tempHome;
360-process.env.OPENCLAW_STATE_DIR = path.join(tempHome, ".openclaw");
339+const configPath = await createGatewayConfigPath(tempHome);
361340process.env.OPENCLAW_CONFIG_PATH = configPath;
362-process.env.OPENCLAW_BUNDLED_PLUGINS_DIR = await createEmptyBundledPluginsDir(tempHome);
363-process.env.OPENCLAW_DISABLE_BUNDLED_PLUGINS = "1";
364341clearRuntimeConfigSnapshot();
365342clearConfigCache();
366343@@ -465,12 +442,7 @@ module.exports = {
465442expect(resToken.ok).toBe(true);
466443} finally {
467444await server2.close({ reason: "wizard auth verify" });
468-await fs.rm(tempHome, {
469-recursive: true,
470-force: true,
471-maxRetries: 10,
472-retryDelay: 50,
473-});
445+await removeGatewayTempHome(tempHome);
474446envSnapshot.restore();
475447}
476448},
@@ -497,7 +469,7 @@ module.exports = {
497469]);
498470499471const tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-minimal-gateway-home-"));
500-const configPath = path.join(tempHome, ".openclaw", "openclaw.json");
472+const configPath = await createGatewayConfigPath(tempHome);
501473const bundledPluginsDir = path.join(tempHome, "openclaw-test-no-bundled-extensions");
502474process.env.HOME = tempHome;
503475process.env.OPENCLAW_STATE_DIR = path.join(tempHome, ".openclaw");
@@ -514,19 +486,13 @@ module.exports = {
514486515487const token = nextGatewayId("minimal-token");
516488process.env.OPENCLAW_GATEWAY_TOKEN = token;
517-await fs.mkdir(path.dirname(configPath), { recursive: true });
518489await fs.mkdir(bundledPluginsDir, { recursive: true });
519490await fs.writeFile(
520491configPath,
521492`${JSON.stringify({ gateway: { auth: { mode: "token", token } } }, null, 2)}\n`,
522493);
523494524-const port = await getFreeGatewayPort();
525-const server = await startGatewayServer(port, {
526-bind: "loopback",
527-auth: { mode: "token", token },
528-controlUiEnabled: false,
529-});
495+const { server } = await startLoopbackTokenGateway(token);
530496531497try {
532498const parsed = JSON.parse(await fs.readFile(configPath, "utf8")) as {
@@ -536,12 +502,7 @@ module.exports = {
536502expect(parsed.plugins?.entries?.discord).toBeUndefined();
537503} finally {
538504await server.close({ reason: "minimal gateway auto-enable verify" });
539-await fs.rm(tempHome, {
540-recursive: true,
541-force: true,
542-maxRetries: 10,
543-retryDelay: 50,
544-});
505+await removeGatewayTempHome(tempHome);
545506envSnapshot.restore();
546507}
547508},
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。