@@ -47,6 +47,31 @@ async function createEmptyBundledPluginsDir(tempHome: string): Promise<string> {
4747 return bundledPluginsDir ;
4848}
4949
50+ 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 : {
5176 workspaceDir : string ;
5277 id : string ;
@@ -130,24 +155,19 @@ async function setupGatewayTempHome(params: { prefix: string; minimalGateway?: b
130155 return { envSnapshot, tempHome, workspaceDir } ;
131156}
132157
158+ 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 ) ;
142169
143- afterEach ( ( ) => {
144- clearRuntimeConfigSnapshot ( ) ;
145- clearConfigCache ( ) ;
146- clearSessionStoreCacheForTest ( ) ;
147- resetAgentRunContextForTest ( ) ;
148- clearAllBootstrapSnapshots ( ) ;
149- clearGatewaySubagentRuntime ( ) ;
150- } ) ;
170+ afterEach ( resetGatewayTestState ) ;
151171
152172 beforeAll ( async ( ) => {
153173 ( { createConfigIO } = await import ( "../config/config.js" ) ) ;
@@ -166,9 +186,7 @@ describe("gateway e2e", () => {
166186 const token = nextGatewayId ( "test-token" ) ;
167187 process . env . OPENCLAW_GATEWAY_TOKEN = token ;
168188
169- 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 ) ;
172190 const mockProvider = buildMockOpenAiResponsesProvider ( openaiBaseUrl ) ;
173191
174192 const cfg = {
@@ -222,12 +240,7 @@ describe("gateway e2e", () => {
222240 } finally {
223241 await disconnectGatewayClient ( client ) ;
224242 await 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 ) ;
231244 restore ( ) ;
232245 envSnapshot . restore ( ) ;
233246 }
@@ -264,9 +277,7 @@ module.exports = {
264277` . trimStart ( ) ,
265278 } ) ;
266279
267- 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 ) ;
270281 const cfg = {
271282 agents : {
272283 defaults : { workspace : workspaceDir } ,
@@ -280,12 +291,7 @@ module.exports = {
280291 await fs . writeFile ( configPath , `${ JSON . stringify ( cfg , null , 2 ) } \n` ) ;
281292 process . env . OPENCLAW_CONFIG_PATH = configPath ;
282293
283- 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 ) ;
289295
290296 try {
291297 const beforeCount = await readCounterWithRetry ( registerCountPath ) ;
@@ -314,12 +320,7 @@ module.exports = {
314320 expect ( afterCount ) . toBe ( beforeCount ) ;
315321 } finally {
316322 await 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 ) ;
323324 envSnapshot . 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 } ,
331332 async ( ) => {
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+ } ) ;
355337 delete process . env . OPENCLAW_GATEWAY_TOKEN ;
356338
357- 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 ) ;
361340 process . env . OPENCLAW_CONFIG_PATH = configPath ;
362- process . env . OPENCLAW_BUNDLED_PLUGINS_DIR = await createEmptyBundledPluginsDir ( tempHome ) ;
363- process . env . OPENCLAW_DISABLE_BUNDLED_PLUGINS = "1" ;
364341 clearRuntimeConfigSnapshot ( ) ;
365342 clearConfigCache ( ) ;
366343
@@ -465,12 +442,7 @@ module.exports = {
465442 expect ( resToken . ok ) . toBe ( true ) ;
466443 } finally {
467444 await 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 ) ;
474446 envSnapshot . restore ( ) ;
475447 }
476448 } ,
@@ -497,7 +469,7 @@ module.exports = {
497469 ] ) ;
498470
499471 const 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 ) ;
501473 const bundledPluginsDir = path . join ( tempHome , "openclaw-test-no-bundled-extensions" ) ;
502474 process . env . HOME = tempHome ;
503475 process . env . OPENCLAW_STATE_DIR = path . join ( tempHome , ".openclaw" ) ;
@@ -514,19 +486,13 @@ module.exports = {
514486
515487 const token = nextGatewayId ( "minimal-token" ) ;
516488 process . env . OPENCLAW_GATEWAY_TOKEN = token ;
517- await fs . mkdir ( path . dirname ( configPath ) , { recursive : true } ) ;
518489 await fs . mkdir ( bundledPluginsDir , { recursive : true } ) ;
519490 await fs . writeFile (
520491 configPath ,
521492 `${ JSON . stringify ( { gateway : { auth : { mode : "token" , token } } } , null , 2 ) } \n` ,
522493 ) ;
523494
524- 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 ) ;
530496
531497 try {
532498 const parsed = JSON . parse ( await fs . readFile ( configPath , "utf8" ) ) as {
@@ -536,12 +502,7 @@ module.exports = {
536502 expect ( parsed . plugins ?. entries ?. discord ) . toBeUndefined ( ) ;
537503 } finally {
538504 await 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 ) ;
545506 envSnapshot . restore ( ) ;
546507 }
547508 } ,
0 commit comments