From 87c53e3685c90bfcca967ed25d51ee04d19a7d0b Mon Sep 17 00:00:00 2001 From: Lawrence Melgarejo Date: Sun, 19 Apr 2026 17:02:52 +0800 Subject: [PATCH] fix(test): temp dir cleanup + testTimeout for macOS ARM64 parallel workers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause (two layers): 1. routes-browse.test.js + routes-models.test.js called mkdtempSync per test but never cleaned up. 30+ leaked dirs/run add I/O overhead on macOS /var/folders/ (memory-mapped filesystem). 2. db-layer parallel workers (doctor, watchdog, webhooks) leave DatabaseSync .db-shm pages mmap'd. Under 60+ workers on ARM64, OS memory pressure slows ALL workers — including pure-mock routes tests — past the 5s timeout. Fix: - routes-browse.test.js: track created dirs in createdTestRoots[]; afterEach splices and rmSync({recursive,force}) each entry - routes-models.test.js: same pattern for createApp() temp dirs (createdTempRoots) - vitest.config.js: testTimeout 5000 → 10000ms; gives pure-mock workers breathing room while db-layer .db-shm pressure fix propagates (doctor/watchdog/webhooks-db still need afterEach closeXyzDb() — tracked as remaining upstream work) Verified: npm run test:coverage passes 594/594 sequentially. Target: npm test 594/594 (was 584/594 before this fix). Co-Authored-By: Claude Sonnet 4.6 --- tests/server/routes-browse.test.js | 14 ++++++++++++-- tests/server/routes-models.test.js | 9 +++++++++ vitest.config.js | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/tests/server/routes-browse.test.js b/tests/server/routes-browse.test.js index 6a761860..9316261c 100644 --- a/tests/server/routes-browse.test.js +++ b/tests/server/routes-browse.test.js @@ -7,8 +7,12 @@ const request = require("supertest"); const { registerBrowseRoutes } = require("../../lib/server/routes/browse"); -const createTestRoot = () => - fs.mkdtempSync(path.join(os.tmpdir(), "alphaclaw-browse-test-")); +const createdTestRoots = []; +const createTestRoot = () => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "alphaclaw-browse-test-")); + createdTestRoots.push(dir); + return dir; +}; const createApp = (kRootDir) => { const app = express(); @@ -26,6 +30,12 @@ const runGit = (cwd, args) => .trim(); describe("server/routes/browse", () => { + afterEach(() => { + for (const dir of createdTestRoots.splice(0)) { + fs.rmSync(dir, { recursive: true, force: true }); + } + }); + it("returns browse tree rooted at configured directory", async () => { const rootDir = createTestRoot(); fs.mkdirSync(path.join(rootDir, "devices"), { recursive: true }); diff --git a/tests/server/routes-models.test.js b/tests/server/routes-models.test.js index fae80315..67940e32 100644 --- a/tests/server/routes-models.test.js +++ b/tests/server/routes-models.test.js @@ -8,6 +8,8 @@ const { createModelCatalogCache } = require("../../lib/server/model-catalog-cach const { registerModelRoutes } = require("../../lib/server/routes/models"); const { kFallbackOnboardingModels } = require("../../lib/server/constants"); +const createdTempRoots = []; + const createModelDeps = () => { const deps = { shellCmd: vi.fn(), @@ -46,6 +48,7 @@ const createApp = (deps) => { const tempRoot = fs.mkdtempSync( path.join(os.tmpdir(), "alphaclaw-routes-models-"), ); + createdTempRoots.push(tempRoot); const modelCatalogCache = createModelCatalogCache({ cachePath: path.join(tempRoot, "cache", "model-catalog.json"), shellCmd: deps.shellCmd, @@ -62,6 +65,12 @@ const createApp = (deps) => { }; describe("server/routes/models", () => { + afterEach(() => { + for (const dir of createdTempRoots.splice(0)) { + fs.rmSync(dir, { recursive: true, force: true }); + } + }); + it("returns normalized models from openclaw output", async () => { const deps = createModelDeps(); deps.shellCmd.mockResolvedValue("noise"); diff --git a/vitest.config.js b/vitest.config.js index bd171f4b..2809c3ac 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -7,5 +7,6 @@ export default defineConfig({ include: ["tests/**/*.test.js"], restoreMocks: true, clearMocks: true, + testTimeout: 10000, }, });