From da1ec45505dcd219808903354b0b08cdf1a53e3a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 13 Mar 2026 19:15:58 +0000 Subject: [PATCH] refactor: share plugin temp dir helpers --- src/plugins/discovery.test.ts | 34 +++++++------------------ src/plugins/manifest-registry.test.ts | 20 +++------------ src/plugins/test-helpers/fs-fixtures.ts | 33 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 42 deletions(-) create mode 100644 src/plugins/test-helpers/fs-fixtures.ts diff --git a/src/plugins/discovery.test.ts b/src/plugins/discovery.test.ts index 400094c1fef..3b10146d28f 100644 --- a/src/plugins/discovery.test.ts +++ b/src/plugins/discovery.test.ts @@ -1,32 +1,22 @@ -import { randomUUID } from "node:crypto"; import fs from "node:fs"; -import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, describe, expect, it } from "vitest"; import { clearPluginDiscoveryCache, discoverOpenClawPlugins } from "./discovery.js"; +import { + cleanupTrackedTempDirs, + makeTrackedTempDir, + mkdirSafeDir, +} from "./test-helpers/fs-fixtures.js"; const tempDirs: string[] = []; const previousUmask = process.umask(0o022); -function chmodSafeDir(dir: string) { - if (process.platform === "win32") { - return; - } - fs.chmodSync(dir, 0o755); -} - -function mkdirSafe(dir: string) { - fs.mkdirSync(dir, { recursive: true }); - chmodSafeDir(dir); -} - function makeTempDir() { - const dir = path.join(os.tmpdir(), `openclaw-plugins-${randomUUID()}`); - mkdirSafe(dir); - tempDirs.push(dir); - return dir; + return makeTrackedTempDir("openclaw-plugins", tempDirs); } +const mkdirSafe = mkdirSafeDir; + function buildDiscoveryEnv(stateDir: string): NodeJS.ProcessEnv { return { OPENCLAW_STATE_DIR: stateDir, @@ -66,13 +56,7 @@ function expectEscapesPackageDiagnostic(diagnostics: Array<{ message: string }>) afterEach(() => { clearPluginDiscoveryCache(); - for (const dir of tempDirs.splice(0)) { - try { - fs.rmSync(dir, { recursive: true, force: true }); - } catch { - // ignore cleanup failures - } - } + cleanupTrackedTempDirs(tempDirs); }); afterAll(() => { diff --git a/src/plugins/manifest-registry.test.ts b/src/plugins/manifest-registry.test.ts index bbf65d14e41..a948344cba8 100644 --- a/src/plugins/manifest-registry.test.ts +++ b/src/plugins/manifest-registry.test.ts @@ -1,6 +1,4 @@ -import { randomUUID } from "node:crypto"; import fs from "node:fs"; -import os from "node:os"; import path from "node:path"; import { afterAll, afterEach, describe, expect, it } from "vitest"; import type { PluginCandidate } from "./discovery.js"; @@ -8,6 +6,7 @@ import { clearPluginManifestRegistryCache, loadPluginManifestRegistry, } from "./manifest-registry.js"; +import { cleanupTrackedTempDirs, makeTrackedTempDir } from "./test-helpers/fs-fixtures.js"; const tempDirs: string[] = []; const previousUmask = process.umask(0o022); @@ -25,10 +24,7 @@ function mkdirSafe(dir: string) { } function makeTempDir() { - const dir = path.join(os.tmpdir(), `openclaw-manifest-registry-${randomUUID()}`); - mkdirSafe(dir); - tempDirs.push(dir); - return dir; + return makeTrackedTempDir("openclaw-manifest-registry", tempDirs); } function writeManifest(dir: string, manifest: Record) { @@ -133,17 +129,7 @@ function expectUnsafeWorkspaceManifestRejected(params: { afterEach(() => { clearPluginManifestRegistryCache(); - while (tempDirs.length > 0) { - const dir = tempDirs.pop(); - if (!dir) { - break; - } - try { - fs.rmSync(dir, { recursive: true, force: true }); - } catch { - // ignore cleanup failures - } - } + cleanupTrackedTempDirs(tempDirs); }); afterAll(() => { diff --git a/src/plugins/test-helpers/fs-fixtures.ts b/src/plugins/test-helpers/fs-fixtures.ts new file mode 100644 index 00000000000..ec6b88fa4e4 --- /dev/null +++ b/src/plugins/test-helpers/fs-fixtures.ts @@ -0,0 +1,33 @@ +import { randomUUID } from "node:crypto"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; + +function chmodSafeDir(dir: string) { + if (process.platform === "win32") { + return; + } + fs.chmodSync(dir, 0o755); +} + +export function mkdirSafeDir(dir: string) { + fs.mkdirSync(dir, { recursive: true }); + chmodSafeDir(dir); +} + +export function makeTrackedTempDir(prefix: string, trackedDirs: string[]) { + const dir = path.join(os.tmpdir(), `${prefix}-${randomUUID()}`); + mkdirSafeDir(dir); + trackedDirs.push(dir); + return dir; +} + +export function cleanupTrackedTempDirs(trackedDirs: string[]) { + for (const dir of trackedDirs.splice(0)) { + try { + fs.rmSync(dir, { recursive: true, force: true }); + } catch { + // ignore cleanup failures + } + } +}