diff --git a/tests/_setup/isolateDataDir.ts b/tests/_setup/isolateDataDir.ts index 528930d7c2..b1add14b89 100644 --- a/tests/_setup/isolateDataDir.ts +++ b/tests/_setup/isolateDataDir.ts @@ -33,7 +33,7 @@ if (!process.env.DATA_DIR) { // Best-effort cleanup so a long suite run does not leak hundreds of temp DBs. process.on("exit", () => { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore — the OS reaps its temp dir eventually. } diff --git a/tests/e2e/system-failover.test.ts b/tests/e2e/system-failover.test.ts index 5141fadb7f..175deab5b5 100644 --- a/tests/e2e/system-failover.test.ts +++ b/tests/e2e/system-failover.test.ts @@ -366,7 +366,7 @@ test.after(async () => { await serverA.stop(); await serverB.stop(); core.closeDbInstance(); - await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("primary healthy: request routes to Server A only", async () => { diff --git a/tests/integration/_chatPipelineHarness.ts b/tests/integration/_chatPipelineHarness.ts index 3eb7c2fb72..c154255914 100644 --- a/tests/integration/_chatPipelineHarness.ts +++ b/tests/integration/_chatPipelineHarness.ts @@ -286,7 +286,7 @@ export async function createChatPipelineHarness(prefix) { clearSkillState(); await new Promise((resolve) => setTimeout(resolve, 20)); core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(testDataDir, { recursive: true }); initTranslators(); } @@ -300,7 +300,7 @@ export async function createChatPipelineHarness(prefix) { clearSkillState(); resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } async function seedConnection(provider: string, overrides: SeedConnectionOverrides = {}) { diff --git a/tests/integration/agent-bridge-bypass-flow.test.ts b/tests/integration/agent-bridge-bypass-flow.test.ts index 9abe58e3b5..c1bfa08b64 100644 --- a/tests/integration/agent-bridge-bypass-flow.test.ts +++ b/tests/integration/agent-bridge-bypass-flow.test.ts @@ -24,7 +24,7 @@ const DEFAULT_PATTERNS = [".bank.", ".gov.", "okta.com", "auth0.com"]; function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(() => { }); test.after(() => { - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch { /* noop */ } + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } }); // ── POST patterns ────────────────────────────────────────────────────────── diff --git a/tests/integration/agent-bridge-cert-flow.test.ts b/tests/integration/agent-bridge-cert-flow.test.ts index ee26b9fade..111e4d3179 100644 --- a/tests/integration/agent-bridge-cert-flow.test.ts +++ b/tests/integration/agent-bridge-cert-flow.test.ts @@ -30,7 +30,7 @@ function certFilePath() { } function resetCertDir() { - fs.rmSync(certDir(), { recursive: true, force: true }); + fs.rmSync(certDir(), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(certDir(), { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { }); test.after(() => { - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch { /* noop */ } + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } }); // ── GET /cert ───────────────────────────────────────────────────────────── diff --git a/tests/integration/agent-bridge-mappings.test.ts b/tests/integration/agent-bridge-mappings.test.ts index 0dec4bb1e4..684fe083f3 100644 --- a/tests/integration/agent-bridge-mappings.test.ts +++ b/tests/integration/agent-bridge-mappings.test.ts @@ -24,7 +24,7 @@ const mappingsRoute = await import( function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(() => { }); test.after(() => { - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch { /* noop */ } + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } }); // ── GET (empty) ──────────────────────────────────────────────────────────── diff --git a/tests/integration/agent-bridge-routes.test.ts b/tests/integration/agent-bridge-routes.test.ts index 21b59b20c7..d4f18138ac 100644 --- a/tests/integration/agent-bridge-routes.test.ts +++ b/tests/integration/agent-bridge-routes.test.ts @@ -39,7 +39,7 @@ const routeGuard = await import("../../src/server/authz/routeGuard.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.beforeEach(() => { test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } diff --git a/tests/integration/all-statuses-route.test.ts b/tests/integration/all-statuses-route.test.ts index 858b09e993..4c3924020c 100644 --- a/tests/integration/all-statuses-route.test.ts +++ b/tests/integration/all-statuses-route.test.ts @@ -39,7 +39,7 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Auth tests ──────────────────────────────────────────────────────────────── @@ -288,6 +288,6 @@ test("grok-build status uses GROK_HOME and returns its managed endpoint", async } finally { if (original === undefined) delete process.env.GROK_HOME; else process.env.GROK_HOME = original; - fs.rmSync(grokHome, { recursive: true, force: true }); + fs.rmSync(grokHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts b/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts index e2d5b402b5..32cbae5108 100644 --- a/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts +++ b/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts @@ -32,7 +32,7 @@ const { clearAntigravityProjectCache } = await import( test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/integration/api-keys.test.ts b/tests/integration/api-keys.test.ts index 0dfc6c3371..51e667e1bd 100644 --- a/tests/integration/api-keys.test.ts +++ b/tests/integration/api-keys.test.ts @@ -25,7 +25,7 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("API keys routes require management auth when login protection is enabled", async () => { diff --git a/tests/integration/api-routes-critical.test.ts b/tests/integration/api-routes-critical.test.ts index 10534d2808..7f04c9245b 100644 --- a/tests/integration/api-routes-critical.test.ts +++ b/tests/integration/api-routes-critical.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { delete process.env.ENABLE_SOCKS5_PROXY; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -59,7 +59,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("critical routes: v1 management proxies covers auth, lookup, where-used, patch, and delete branches", async () => { diff --git a/tests/integration/audit-log-level-filter.test.ts b/tests/integration/audit-log-level-filter.test.ts index 2517da850d..d694fe44be 100644 --- a/tests/integration/audit-log-level-filter.test.ts +++ b/tests/integration/audit-log-level-filter.test.ts @@ -20,7 +20,7 @@ const auditRoute = await import("../../src/app/api/compliance/audit-log/route.ts function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** diff --git a/tests/integration/batch-e2e-rate-limit.test.ts b/tests/integration/batch-e2e-rate-limit.test.ts index beeaea7e62..3460efbf95 100644 --- a/tests/integration/batch-e2e-rate-limit.test.ts +++ b/tests/integration/batch-e2e-rate-limit.test.ts @@ -268,7 +268,7 @@ async function stopProcess(child: ReturnType) { async function removeDirWithRetry(dir: string) { for (let attempt = 0; attempt < 5; attempt++) { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error) { if (attempt === 4) throw error; diff --git a/tests/integration/chat-pipeline.test.ts b/tests/integration/chat-pipeline.test.ts index c17ce8eb6e..a7d441a9a5 100644 --- a/tests/integration/chat-pipeline.test.ts +++ b/tests/integration/chat-pipeline.test.ts @@ -373,7 +373,7 @@ async function resetStorage() { invalidateMemorySettingsCache(); await new Promise((resolve) => setTimeout(resolve, 20)); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); initTranslators(); } @@ -512,7 +512,7 @@ test.after(async () => { clearInflight(); resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("chat pipeline handles OpenAI passthrough with valid API key auth", async () => { diff --git a/tests/integration/chatcore-compression-integration.test.ts b/tests/integration/chatcore-compression-integration.test.ts index ab59dc0347..fd5038e711 100644 --- a/tests/integration/chatcore-compression-integration.test.ts +++ b/tests/integration/chatcore-compression-integration.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { readCacheDb.invalidateDbCache(); await new Promise((resolve) => setTimeout(resolve, 20)); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -40,7 +40,7 @@ test.after(async () => { globalThis.fetch = originalFetch; core.closeDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/integration/chatcore-context-window-boundary.test.ts b/tests/integration/chatcore-context-window-boundary.test.ts index 9d48704a6f..5d517e8337 100644 --- a/tests/integration/chatcore-context-window-boundary.test.ts +++ b/tests/integration/chatcore-context-window-boundary.test.ts @@ -21,7 +21,7 @@ test.after(async () => { globalThis.fetch = originalFetch; core.closeDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/integration/cli-settings-codewhale.test.ts b/tests/integration/cli-settings-codewhale.test.ts index 8a98ff547b..e26167be26 100644 --- a/tests/integration/cli-settings-codewhale.test.ts +++ b/tests/integration/cli-settings-codewhale.test.ts @@ -27,7 +27,7 @@ const { GET, POST, DELETE } = await import("../../src/app/api/cli-tools/codewhal async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -126,7 +126,7 @@ test("codewhale-settings POST: writes primary ~/.codewhale/config.toml for a fre } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -173,7 +173,7 @@ test("codewhale-settings POST: syncs an existing legacy ~/.deepseek/config.toml" } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -201,7 +201,7 @@ test("codewhale-settings GET: falls back to legacy ~/.deepseek/config.toml when } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -238,7 +238,7 @@ test("codewhale-settings DELETE: removes primary and legacy config files", async } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -272,7 +272,7 @@ test("codewhale-settings route.ts: does not call exec() or spawn() directly", () test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-deepseek-tui.test.ts b/tests/integration/cli-settings-deepseek-tui.test.ts index 7bd6b83944..73cb889874 100644 --- a/tests/integration/cli-settings-deepseek-tui.test.ts +++ b/tests/integration/cli-settings-deepseek-tui.test.ts @@ -25,7 +25,7 @@ const { GET, POST, DELETE } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -120,7 +120,7 @@ test("deepseek-tui-settings POST: writes config.toml with valid body", async () } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -152,7 +152,7 @@ test("deepseek-tui-settings DELETE: removes config file", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -186,7 +186,7 @@ test("deepseek-tui-settings route.ts: does not call exec() or spawn() directly", test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-forge.test.ts b/tests/integration/cli-settings-forge.test.ts index 1398b03544..973b76bed4 100644 --- a/tests/integration/cli-settings-forge.test.ts +++ b/tests/integration/cli-settings-forge.test.ts @@ -26,7 +26,7 @@ const { GET, POST, DELETE } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -126,7 +126,7 @@ test("forge-settings POST: writes config.toml with valid body", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -160,7 +160,7 @@ test("forge-settings DELETE: removes config file when it exists", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -194,7 +194,7 @@ test("forge-settings route.ts: does not call exec() or spawn() directly", () => test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-grok-build.test.ts b/tests/integration/cli-settings-grok-build.test.ts index 3353d3602a..8ab679d9c2 100644 --- a/tests/integration/cli-settings-grok-build.test.ts +++ b/tests/integration/cli-settings-grok-build.test.ts @@ -39,7 +39,7 @@ const { GET, POST, DELETE } = async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -163,7 +163,7 @@ test("grok-build-settings POST: writes [model.omniroute] section and preserves e } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -219,7 +219,7 @@ test("grok-build-settings DELETE: removes our section, preserves the rest, resto } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -237,7 +237,7 @@ test("grok-build-settings DELETE: no-op success when no config file exists", asy assert.equal(body.success, true); } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -289,7 +289,7 @@ test("grok-build-settings: honors GROK_HOME and rejects a relative value", async } finally { if (original === undefined) delete process.env.GROK_HOME; else process.env.GROK_HOME = original; - fs.rmSync(grokHome, { recursive: true, force: true }); + fs.rmSync(grokHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -313,7 +313,7 @@ test("grok-build-settings POST: returns 409 for an unowned omniroute slot", asyn } finally { if (original === undefined) delete process.env.GROK_HOME; else process.env.GROK_HOME = original; - fs.rmSync(grokHome, { recursive: true, force: true }); + fs.rmSync(grokHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -342,7 +342,7 @@ test("grok-build-settings POST: resolves keyId to an unmasked key", async () => } finally { if (original === undefined) delete process.env.GROK_HOME; else process.env.GROK_HOME = original; - fs.rmSync(grokHome, { recursive: true, force: true }); + fs.rmSync(grokHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -376,7 +376,7 @@ test("grok-build-settings route.ts: does not call exec() or spawn() directly", ( test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-jcode.test.ts b/tests/integration/cli-settings-jcode.test.ts index 25aaddb7ea..12b8495874 100644 --- a/tests/integration/cli-settings-jcode.test.ts +++ b/tests/integration/cli-settings-jcode.test.ts @@ -23,7 +23,7 @@ const { GET, POST, DELETE } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -118,7 +118,7 @@ test("jcode-settings POST: writes config.json with valid body", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -155,7 +155,7 @@ test("jcode-settings DELETE: removes OmniRoute fields from existing config", asy } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -189,7 +189,7 @@ test("jcode-settings route.ts: does not call exec() or spawn() directly", () => test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-letta.test.ts b/tests/integration/cli-settings-letta.test.ts index 881e8a32bf..3a66f2a9a5 100644 --- a/tests/integration/cli-settings-letta.test.ts +++ b/tests/integration/cli-settings-letta.test.ts @@ -40,7 +40,7 @@ function req(init?: RequestInit) { async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.afterEach(() => { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Test 1: GET without auth → 401 ────────────────────────────────────────── @@ -189,7 +189,7 @@ test("letta-settings: error responses do not leak stack traces", async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-omp.test.ts b/tests/integration/cli-settings-omp.test.ts index 54ae67f3a1..c07715ff4f 100644 --- a/tests/integration/cli-settings-omp.test.ts +++ b/tests/integration/cli-settings-omp.test.ts @@ -59,7 +59,7 @@ function seedOmpDb() { async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -77,7 +77,7 @@ test.beforeEach(async () => { test.afterEach(() => { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Test 1: GET without auth → 401 ────────────────────────────────────────── @@ -190,7 +190,7 @@ test("omp-settings: error responses do not leak stack traces", async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-pi.test.ts b/tests/integration/cli-settings-pi.test.ts index 92faea9b0a..1556047618 100644 --- a/tests/integration/cli-settings-pi.test.ts +++ b/tests/integration/cli-settings-pi.test.ts @@ -23,7 +23,7 @@ const { GET, POST, DELETE } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -118,7 +118,7 @@ test("pi-settings POST: writes config.json with valid body", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -155,7 +155,7 @@ test("pi-settings DELETE: removes OmniRoute fields from existing config", async } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -189,7 +189,7 @@ test("pi-settings route.ts: does not call exec() or spawn() directly", () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/cli-settings-smelt.test.ts b/tests/integration/cli-settings-smelt.test.ts index 7689fb58da..d71995c505 100644 --- a/tests/integration/cli-settings-smelt.test.ts +++ b/tests/integration/cli-settings-smelt.test.ts @@ -23,7 +23,7 @@ const { GET, POST, DELETE } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -118,7 +118,7 @@ test("smelt-settings POST: writes config.json with valid body", async () => { } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -155,7 +155,7 @@ test("smelt-settings DELETE: removes OmniRoute fields from existing config", asy } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -189,7 +189,7 @@ test("smelt-settings route.ts: does not call exec() or spawn() directly", () => test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/integration/codex-account-pool-restart-http.test.ts b/tests/integration/codex-account-pool-restart-http.test.ts index 66018cc93f..2787c8d293 100644 --- a/tests/integration/codex-account-pool-restart-http.test.ts +++ b/tests/integration/codex-account-pool-restart-http.test.ts @@ -44,6 +44,6 @@ test("Codex Spark cooldown survives a fresh process without creating child conne assert.equal(after.connectionId, before.connectionId); assert.deepEqual(after.upstreamModels, ["gpt-5.5"]); } finally { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/integration/codex-chat-reasoning-http-e2e.test.ts b/tests/integration/codex-chat-reasoning-http-e2e.test.ts index 051b5ba235..28bea94534 100644 --- a/tests/integration/codex-chat-reasoning-http-e2e.test.ts +++ b/tests/integration/codex-chat-reasoning-http-e2e.test.ts @@ -305,6 +305,6 @@ test("chat completions streams Codex Responses reasoning through real route HTTP globalThis.fetch = originalFetch; if (routeServer) await closeServer(routeServer); core.closeDbInstance({ checkpointMode: null }); - await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/integration/combo-live/_liveHarness.ts b/tests/integration/combo-live/_liveHarness.ts index c415bc648b..013d797f57 100644 --- a/tests/integration/combo-live/_liveHarness.ts +++ b/tests/integration/combo-live/_liveHarness.ts @@ -146,12 +146,12 @@ export async function createLiveHarness(prefix: string): Promise { } } } catch (err: any) { - fs.rmSync(snapshotDir, { recursive: true, force: true }); + fs.rmSync(snapshotDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); throw new Error(`[liveHarness] Failed to fetch VPS secrets via ssh: ${err.message}`); } if (!storageEncryptionKey || !apiKeySecret) { - fs.rmSync(snapshotDir, { recursive: true, force: true }); + fs.rmSync(snapshotDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); throw new Error( "[liveHarness] Could not parse STORAGE_ENCRYPTION_KEY or API_KEY_SECRET from VPS .env" ); @@ -182,7 +182,7 @@ export async function createLiveHarness(prefix: string): Promise { { timeout: 60_000 } ); } catch (err: any) { - fs.rmSync(snapshotDir, { recursive: true, force: true }); + fs.rmSync(snapshotDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); throw new Error(`[liveHarness] Failed to scp production DB: ${err.message}`); } @@ -400,7 +400,7 @@ export async function createLiveHarness(prefix: string): Promise { resetAllCircuitBreakers(); core.resetDbInstance(); // Destroy the snapshot — targets only the temp dir, NEVER /root/.omniroute. - fs.rmSync(snapshotDir, { recursive: true, force: true }); + fs.rmSync(snapshotDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } // Populate the map eagerly so servedProvider (sync) works right after diff --git a/tests/integration/fingerprint-expansion.test.ts b/tests/integration/fingerprint-expansion.test.ts index 0bfed13cc5..70dc0cf7c8 100644 --- a/tests/integration/fingerprint-expansion.test.ts +++ b/tests/integration/fingerprint-expansion.test.ts @@ -280,7 +280,7 @@ test.after(async () => { if (app) await stopProcess(app.child); await upstream.stop(); core.closeDbInstance(); - await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ────────────────────────────────────────────────────────────────── diff --git a/tests/integration/heap-growth.test.ts b/tests/integration/heap-growth.test.ts index d541a9e9a2..9c23eef9e5 100644 --- a/tests/integration/heap-growth.test.ts +++ b/tests/integration/heap-growth.test.ts @@ -14,7 +14,7 @@ const { createSSEStream } = await import("../../open-sse/utils/stream.ts"); test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/integration/llama-cpp-provider.test.ts b/tests/integration/llama-cpp-provider.test.ts index 7c1cf517d1..2d96e91a5c 100644 --- a/tests/integration/llama-cpp-provider.test.ts +++ b/tests/integration/llama-cpp-provider.test.ts @@ -88,7 +88,7 @@ test.afterEach(() => { clearInflight(); resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); diff --git a/tests/integration/memory-embedding-providers.test.ts b/tests/integration/memory-embedding-providers.test.ts index 1481f0bad9..4b6a0f3ea3 100644 --- a/tests/integration/memory-embedding-providers.test.ts +++ b/tests/integration/memory-embedding-providers.test.ts @@ -31,7 +31,7 @@ const { GET } = embeddingProvidersRoute; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/memory-engine-status.test.ts b/tests/integration/memory-engine-status.test.ts index e40079628a..f862c58540 100644 --- a/tests/integration/memory-engine-status.test.ts +++ b/tests/integration/memory-engine-status.test.ts @@ -31,7 +31,7 @@ const { GET } = engineStatusRoute; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/memory-reindex.test.ts b/tests/integration/memory-reindex.test.ts index 6f11dc6083..4f3d1baa13 100644 --- a/tests/integration/memory-reindex.test.ts +++ b/tests/integration/memory-reindex.test.ts @@ -34,7 +34,7 @@ const { POST } = reindexRoute; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -66,7 +66,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/memory-retrieve-preview.test.ts b/tests/integration/memory-retrieve-preview.test.ts index 3a403ff4d4..d3220ca6b6 100644 --- a/tests/integration/memory-retrieve-preview.test.ts +++ b/tests/integration/memory-retrieve-preview.test.ts @@ -33,7 +33,7 @@ const { POST } = retrieveRoute; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/memory-route-put.test.ts b/tests/integration/memory-route-put.test.ts index 8ab591ac8e..3d952cb002 100644 --- a/tests/integration/memory-route-put.test.ts +++ b/tests/integration/memory-route-put.test.ts @@ -33,7 +33,7 @@ const { createMemory, getMemory } = memoryStore; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -69,7 +69,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/memory-summarize.test.ts b/tests/integration/memory-summarize.test.ts index 6771ca4719..a6bd547c77 100644 --- a/tests/integration/memory-summarize.test.ts +++ b/tests/integration/memory-summarize.test.ts @@ -33,7 +33,7 @@ const { POST } = summarizeRoute; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -75,7 +75,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Tests ── diff --git a/tests/integration/model-catalog-responsiveness-9199.test.ts b/tests/integration/model-catalog-responsiveness-9199.test.ts index 89c0cd5750..19608b1d3c 100644 --- a/tests/integration/model-catalog-responsiveness-9199.test.ts +++ b/tests/integration/model-catalog-responsiveness-9199.test.ts @@ -19,7 +19,7 @@ const healthRoute = await import("../../src/app/api/health/ping/route.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); modelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -30,7 +30,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test( diff --git a/tests/integration/opencode-config-startup.test.ts b/tests/integration/opencode-config-startup.test.ts index 09161d8186..b0bbb3f76b 100644 --- a/tests/integration/opencode-config-startup.test.ts +++ b/tests/integration/opencode-config-startup.test.ts @@ -23,7 +23,7 @@ after(() => { globalThis.fetch = originalFetch; if (originalHome === undefined) delete process.env.HOME; else process.env.HOME = originalHome; - fs.rmSync(testHome, { recursive: true, force: true }); + fs.rmSync(testHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function runOpencode(binary: string, args: string[]) { diff --git a/tests/integration/performance-regression.test.ts b/tests/integration/performance-regression.test.ts index 87f80215d9..641e869f97 100644 --- a/tests/integration/performance-regression.test.ts +++ b/tests/integration/performance-regression.test.ts @@ -226,7 +226,7 @@ describe("Performance: memory API route handler (1000 records)", () => { db.prepare("DELETE FROM memories WHERE api_key_id = ?").run(TEST_API_KEY_ID); // Final cleanup: reset DB instance and remove temp dir core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it(`should handle GET /api/memory?limit=50 in <${THRESHOLD_API_ROUTE_MS}ms`, async () => { diff --git a/tests/integration/playground-improve-prompt.test.ts b/tests/integration/playground-improve-prompt.test.ts index aaa67d67cc..071a229636 100644 --- a/tests/integration/playground-improve-prompt.test.ts +++ b/tests/integration/playground-improve-prompt.test.ts @@ -61,7 +61,7 @@ function postRequest(body: unknown): Request { // ─── Cleanup ───────────────────────────────────────────────────────────────── test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── OPTIONS ───────────────────────────────────────────────────────────────── diff --git a/tests/integration/playground-presets-crud.test.ts b/tests/integration/playground-presets-crud.test.ts index 655fdfdc53..a2e73196c4 100644 --- a/tests/integration/playground-presets-crud.test.ts +++ b/tests/integration/playground-presets-crud.test.ts @@ -86,7 +86,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── OPTIONS ───────────────────────────────────────────────────────────────── diff --git a/tests/integration/playground-presets-zod.test.ts b/tests/integration/playground-presets-zod.test.ts index 3150eaed15..df64a2c696 100644 --- a/tests/integration/playground-presets-zod.test.ts +++ b/tests/integration/playground-presets-zod.test.ts @@ -83,7 +83,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── POST validation ───────────────────────────────────────────────────────── diff --git a/tests/integration/plugins-lifecycle.test.ts b/tests/integration/plugins-lifecycle.test.ts index 7e3fe91e61..2c1a47f301 100644 --- a/tests/integration/plugins-lifecycle.test.ts +++ b/tests/integration/plugins-lifecycle.test.ts @@ -57,7 +57,7 @@ function writeTestPlugin(opts?: { name?: string; onRequest?: boolean; enabledByD // ── Helpers ── function cleanupDir(dir: string) { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } // Track temp source dirs for cleanup @@ -65,7 +65,7 @@ const activeSourceDirs: string[] = []; function cleanupSourceDirs() { for (const dir of activeSourceDirs) { - try { fs.rmSync(dir, { recursive: true, force: true }); } catch {} + try { fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeSourceDirs.length = 0; } diff --git a/tests/integration/provider-journey.contract.test.ts b/tests/integration/provider-journey.contract.test.ts index b346708551..a15aeca0d4 100644 --- a/tests/integration/provider-journey.contract.test.ts +++ b/tests/integration/provider-journey.contract.test.ts @@ -118,7 +118,7 @@ async function fetchCatalog( test.before(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // requireLogin + requireAuthForModels ON so the API-key surface is gated. await localDb.updateSettings({ requireLogin: true, requireAuthForModels: true, password: "" }); @@ -127,7 +127,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.describe("provider journey — in-process contract (#8330)", () => { diff --git a/tests/integration/proxy-registry-flow.test.ts b/tests/integration/proxy-registry-flow.test.ts index 4de8f0b1a2..6a33c22732 100644 --- a/tests/integration/proxy-registry-flow.test.ts +++ b/tests/integration/proxy-registry-flow.test.ts @@ -23,13 +23,13 @@ const proxyLogger = await import("../../src/lib/proxyLogger.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("integration: proxy create with inline assignment is atomic and clears legacy config", async () => { diff --git a/tests/integration/qdrant-routes.test.ts b/tests/integration/qdrant-routes.test.ts index 34444154d5..451074ffea 100644 --- a/tests/integration/qdrant-routes.test.ts +++ b/tests/integration/qdrant-routes.test.ts @@ -45,7 +45,7 @@ const asNextRequest = (req: Request) => req as unknown as import("next/server"). async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // #5597 follow-up: the memory-settings cache is a module-level singleton that // survives per-test DB resets — bust it so each test starts from a clean read. @@ -88,7 +88,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Settings GET ── diff --git a/tests/integration/quota-plans-crud.test.ts b/tests/integration/quota-plans-crud.test.ts index c580c3613d..c61e52e705 100644 --- a/tests/integration/quota-plans-crud.test.ts +++ b/tests/integration/quota-plans-crud.test.ts @@ -35,7 +35,7 @@ async function enableManagementAuth() { function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/integration/quota-pool-delete-combo-cleanup.test.ts b/tests/integration/quota-pool-delete-combo-cleanup.test.ts index e9d6b2d966..e09f923c48 100644 --- a/tests/integration/quota-pool-delete-combo-cleanup.test.ts +++ b/tests/integration/quota-pool-delete-combo-cleanup.test.ts @@ -36,7 +36,7 @@ type Db = { function resetDb() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -95,7 +95,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("DELETE pool waits for scoped quota-combo cleanup before returning 204", async () => { diff --git a/tests/integration/quota-pool-usage-provider-resolution.test.ts b/tests/integration/quota-pool-usage-provider-resolution.test.ts index c45784cce5..533ddb642f 100644 --- a/tests/integration/quota-pool-usage-provider-resolution.test.ts +++ b/tests/integration/quota-pool-usage-provider-resolution.test.ts @@ -35,7 +35,7 @@ const usageRoute = await import("../../src/app/api/quota/pools/[id]/usage/route. function resetDb() { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -46,7 +46,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /usage surfaces catalog dimensions for a catalog-only pool (provider resolved from connection)", async () => { diff --git a/tests/integration/quota-pools-crud.test.ts b/tests/integration/quota-pools-crud.test.ts index dad624cece..da3ca75a15 100644 --- a/tests/integration/quota-pools-crud.test.ts +++ b/tests/integration/quota-pools-crud.test.ts @@ -38,7 +38,7 @@ async function enableManagementAuth() { function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/integration/quota-pools-usage.test.ts b/tests/integration/quota-pools-usage.test.ts index 08a8471830..6f792fce7a 100644 --- a/tests/integration/quota-pools-usage.test.ts +++ b/tests/integration/quota-pools-usage.test.ts @@ -42,7 +42,7 @@ async function enableManagementAuth() { function resetDb() { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/quota/pools/[id]/usage without auth → 401", async () => { diff --git a/tests/integration/quota-preview.test.ts b/tests/integration/quota-preview.test.ts index 2afd58547a..0f583af5ed 100644 --- a/tests/integration/quota-preview.test.ts +++ b/tests/integration/quota-preview.test.ts @@ -40,7 +40,7 @@ async function enableManagementAuth() { function resetDb() { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/quota/preview without auth → 401", async () => { diff --git a/tests/integration/quota-routes-error-sanitization.test.ts b/tests/integration/quota-routes-error-sanitization.test.ts index b786b65898..7af2cb7169 100644 --- a/tests/integration/quota-routes-error-sanitization.test.ts +++ b/tests/integration/quota-routes-error-sanitization.test.ts @@ -42,7 +42,7 @@ const settingsRoute = await import("../../src/app/api/settings/quota-store/route function resetDb() { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -96,7 +96,7 @@ test.after(() => { core.resetDbInstance(); resetQuotaStoreSingleton(); delete process.env.QUOTA_STORE_REDIS_URL; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/integration/quota-store-settings.test.ts b/tests/integration/quota-store-settings.test.ts index bcf2e6bc75..613cca9dd2 100644 --- a/tests/integration/quota-store-settings.test.ts +++ b/tests/integration/quota-store-settings.test.ts @@ -41,7 +41,7 @@ function resetDb() { resetQuotaStoreSingleton(); delete process.env.QUOTA_STORE_REDIS_URL; delete process.env.INITIAL_PASSWORD; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); resetQuotaStoreSingleton(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/integration/resilience-http-e2e.test.ts b/tests/integration/resilience-http-e2e.test.ts index 6f94fc02f6..c3d0b65566 100644 --- a/tests/integration/resilience-http-e2e.test.ts +++ b/tests/integration/resilience-http-e2e.test.ts @@ -547,7 +547,7 @@ test.after(async () => { } await relay.stop(); core.closeDbInstance(); - await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fsp.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("resilience API only exposes configuration, not runtime breaker state", async () => { diff --git a/tests/integration/search-providers-catalog.test.ts b/tests/integration/search-providers-catalog.test.ts index 58b2c2fc2f..66e64b4a42 100644 --- a/tests/integration/search-providers-catalog.test.ts +++ b/tests/integration/search-providers-catalog.test.ts @@ -102,7 +102,7 @@ async function seedRateLimitedConnection(provider: string) { /** Reset DB state between tests. */ async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -116,7 +116,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/integration/test-model-compression-off-6240.test.ts b/tests/integration/test-model-compression-off-6240.test.ts index 7934050342..c4bb43cd2e 100644 --- a/tests/integration/test-model-compression-off-6240.test.ts +++ b/tests/integration/test-model-compression-off-6240.test.ts @@ -37,7 +37,7 @@ async function resetStorage() { readCacheDb.invalidateDbCache(); await new Promise((resolve) => setTimeout(resolve, 20)); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.after(async () => { globalThis.fetch = originalFetch; core.closeDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/integration/traffic-inspector-capture-modes.test.ts b/tests/integration/traffic-inspector-capture-modes.test.ts index bf9b46c7a2..bf00540965 100644 --- a/tests/integration/traffic-inspector-capture-modes.test.ts +++ b/tests/integration/traffic-inspector-capture-modes.test.ts @@ -55,7 +55,7 @@ test.after(() => { handle.stop().catch(() => {/* ignore */}); setHttpProxyHandle(null); } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── GET /capture-modes ────────────────────────────────────────────────────── diff --git a/tests/integration/traffic-inspector-error-sanitization.test.ts b/tests/integration/traffic-inspector-error-sanitization.test.ts index fd076bd3ca..185c4db2be 100644 --- a/tests/integration/traffic-inspector-error-sanitization.test.ts +++ b/tests/integration/traffic-inspector-error-sanitization.test.ts @@ -72,7 +72,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("requests: invalid profile param does not leak stack", async () => { diff --git a/tests/integration/traffic-inspector-hosts.test.ts b/tests/integration/traffic-inspector-hosts.test.ts index 234eb8be61..33aec56787 100644 --- a/tests/integration/traffic-inspector-hosts.test.ts +++ b/tests/integration/traffic-inspector-hosts.test.ts @@ -27,14 +27,14 @@ const hostDetailRoute = await import( test.beforeEach(async () => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Re-init DB with fresh migrations await import("../../src/lib/db/core.ts").then((m) => m.getDbInstance()); }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /hosts: returns empty list initially", async () => { diff --git a/tests/integration/traffic-inspector-internal-ingest.test.ts b/tests/integration/traffic-inspector-internal-ingest.test.ts index 3cf2ef1048..35a386e202 100644 --- a/tests/integration/traffic-inspector-internal-ingest.test.ts +++ b/tests/integration/traffic-inspector-internal-ingest.test.ts @@ -66,7 +66,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("ingest: POST without Authorization header → 403", async () => { diff --git a/tests/integration/traffic-inspector-localonly.test.ts b/tests/integration/traffic-inspector-localonly.test.ts index 0fc352b51d..55691fd1e5 100644 --- a/tests/integration/traffic-inspector-localonly.test.ts +++ b/tests/integration/traffic-inspector-localonly.test.ts @@ -19,7 +19,7 @@ const { isLocalOnlyPath, isLoopbackHost } = await import( ); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── isLocalOnlyPath assertions ────────────────────────────────────────────── diff --git a/tests/integration/traffic-inspector-requests.test.ts b/tests/integration/traffic-inspector-requests.test.ts index 9f894c441f..db6261fbf5 100644 --- a/tests/integration/traffic-inspector-requests.test.ts +++ b/tests/integration/traffic-inspector-requests.test.ts @@ -57,7 +57,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /requests: returns empty list when buffer is empty", async () => { diff --git a/tests/integration/traffic-inspector-session-requests.test.ts b/tests/integration/traffic-inspector-session-requests.test.ts index d0b9bcb14e..3ddbf23129 100644 --- a/tests/integration/traffic-inspector-session-requests.test.ts +++ b/tests/integration/traffic-inspector-session-requests.test.ts @@ -17,7 +17,7 @@ const { resetDbInstance, getDbInstance } = await import("../../src/lib/db/core.t async function resetStorage() { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); getDbInstance(); } @@ -61,7 +61,7 @@ test.beforeEach(async () => { test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("POST /sessions/[id]/requests: seq increments 1, 2, 3", async () => { diff --git a/tests/integration/traffic-inspector-sessions.test.ts b/tests/integration/traffic-inspector-sessions.test.ts index 3687b170b8..922b0cf2b4 100644 --- a/tests/integration/traffic-inspector-sessions.test.ts +++ b/tests/integration/traffic-inspector-sessions.test.ts @@ -18,7 +18,7 @@ const { resetDbInstance, getDbInstance } = await import("../../src/lib/db/core.t async function resetStorage() { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Re-initialize db getDbInstance(); @@ -40,7 +40,7 @@ test.beforeEach(async () => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("POST /sessions: creates a session", async () => { diff --git a/tests/integration/traffic-inspector-ws.test.ts b/tests/integration/traffic-inspector-ws.test.ts index 8bd12cad5c..12ac7728bc 100644 --- a/tests/integration/traffic-inspector-ws.test.ts +++ b/tests/integration/traffic-inspector-ws.test.ts @@ -33,7 +33,7 @@ function makeRequest(upgrade = "websocket", clientKey = "dGhlIHNhbXBsZSBub25jZQ= } test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("ws/route: rejects non-WebSocket GET with 426", async () => { diff --git a/tests/integration/v1-models-swr-response-flush-8728.test.ts b/tests/integration/v1-models-swr-response-flush-8728.test.ts index 60aa72c894..e876244bbb 100644 --- a/tests/integration/v1-models-swr-response-flush-8728.test.ts +++ b/tests/integration/v1-models-swr-response-flush-8728.test.ts @@ -81,7 +81,7 @@ function productionShapedSynchronousRefresh() { } test.after(() => { - fs.rmSync(CACHE_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(CACHE_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the /v1/models route wires Next after() as its response-flush-safe scheduler", () => { @@ -152,7 +152,7 @@ test("an external client receives the stale body before synchronous refresh fini } catch (error) { if ((error as NodeJS.ErrnoException).code === "EPERM") { t.skip("sandbox does not permit opening HTTP listener sockets"); - fs.rmSync(socketDir, { recursive: true, force: true }); + fs.rmSync(socketDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } throw error; @@ -177,7 +177,7 @@ test("an external client receives the stale body before synchronous refresh fini ); } finally { await close(server); - fs.rmSync(socketDir, { recursive: true, force: true }); + fs.rmSync(socketDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); catalogCache.__resetCatalogBuilderRunsForTest(); } }); diff --git a/tests/integration/video-bridge-sampler-ffmpeg.test.ts b/tests/integration/video-bridge-sampler-ffmpeg.test.ts index c33bb770d9..ccbc60b16c 100644 --- a/tests/integration/video-bridge-sampler-ffmpeg.test.ts +++ b/tests/integration/video-bridge-sampler-ffmpeg.test.ts @@ -112,7 +112,7 @@ test( { skip: REAL_FFMPEG_SKIP }, async (context) => { const directory = await mkdtemp(join(tmpdir(), "omniroute-video-sampler-fixtures-")); - context.after(async () => rm(directory, { force: true, recursive: true })); + context.after(async () => rm(directory, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 })); const rapidCuts = await createRapidEdgeCutFixture(directory); await context.test("rapid cuts near both ends retain coverage within the cap", async () => { diff --git a/tests/unit/10017-sse-control-lines-leak-openai-clients.test.ts b/tests/unit/10017-sse-control-lines-leak-openai-clients.test.ts index 8e3e4f9495..0b30b58cfa 100644 --- a/tests/unit/10017-sse-control-lines-leak-openai-clients.test.ts +++ b/tests/unit/10017-sse-control-lines-leak-openai-clients.test.ts @@ -49,7 +49,7 @@ async function readTransformed(chunks: string[], options: object): Promise { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/10085-compatible-generic-vs-uuid-credential.test.ts b/tests/unit/10085-compatible-generic-vs-uuid-credential.test.ts index cf1a72ad7e..5bb697f88d 100644 --- a/tests/unit/10085-compatible-generic-vs-uuid-credential.test.ts +++ b/tests/unit/10085-compatible-generic-vs-uuid-credential.test.ts @@ -33,13 +33,13 @@ const NODE_B_ID = `openai-compatible-chat-558d982b-0000-4000-8000-000000000000`; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function seedNode() { diff --git a/tests/unit/10197-openrouter-image-edits-route.test.ts b/tests/unit/10197-openrouter-image-edits-route.test.ts index a99846ef3a..4f62ffc771 100644 --- a/tests/unit/10197-openrouter-image-edits-route.test.ts +++ b/tests/unit/10197-openrouter-image-edits-route.test.ts @@ -37,7 +37,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -68,7 +68,7 @@ test.after(() => { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10197 v1 image edit POST forwards built-in openrouter edits to the unified Image API", async () => { diff --git a/tests/unit/10313-catalog-cache-key-hashing.test.ts b/tests/unit/10313-catalog-cache-key-hashing.test.ts index 265fed1150..14aba00dc1 100644 --- a/tests/unit/10313-catalog-cache-key-hashing.test.ts +++ b/tests/unit/10313-catalog-cache-key-hashing.test.ts @@ -18,7 +18,7 @@ const SECRET = "sk-live-PROBE-10313-SUPER-SECRET-TOKEN"; test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); }); @@ -26,7 +26,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function captureMapKeys(): { keys: string[]; restore: () => void } { diff --git a/tests/unit/10347-embed-402-cooldown.test.ts b/tests/unit/10347-embed-402-cooldown.test.ts index ddb98259ba..77ede6174f 100644 --- a/tests/unit/10347-embed-402-cooldown.test.ts +++ b/tests/unit/10347-embed-402-cooldown.test.ts @@ -27,7 +27,7 @@ const { handleEmbedding } = await import("../../open-sse/handlers/embeddings.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function readConnectionRow(connId: string) { diff --git a/tests/unit/7993-noauth-proxy-routing.test.ts b/tests/unit/7993-noauth-proxy-routing.test.ts index 89e7b01777..8ef6740d1e 100644 --- a/tests/unit/7993-noauth-proxy-routing.test.ts +++ b/tests/unit/7993-noauth-proxy-routing.test.ts @@ -71,7 +71,7 @@ test.before(async () => { test.after(() => { proxyServer?.close(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7993 getProviderCredentials('opencode-zen') hydrates the proxy saved under the sibling 'opencode' connection", async () => { diff --git a/tests/unit/8200-perplexity-web-401-cooldown.test.ts b/tests/unit/8200-perplexity-web-401-cooldown.test.ts index d98b22351b..ee65e5b817 100644 --- a/tests/unit/8200-perplexity-web-401-cooldown.test.ts +++ b/tests/unit/8200-perplexity-web-401-cooldown.test.ts @@ -20,13 +20,13 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("BUG #8200: single perplexity-web 401 (cookie expiry) does not terminal-expire the only connection", async () => { diff --git a/tests/unit/8326-compatible-id-regex.test.ts b/tests/unit/8326-compatible-id-regex.test.ts index 35901f861b..ef197c8b92 100644 --- a/tests/unit/8326-compatible-id-regex.test.ts +++ b/tests/unit/8326-compatible-id-regex.test.ts @@ -50,7 +50,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const UUID = "02669115-2545-4896-b003-cb4dac09d441"; diff --git a/tests/unit/8327-models-owned-by-prefix.test.ts b/tests/unit/8327-models-owned-by-prefix.test.ts index 464845dc90..d7d564a373 100644 --- a/tests/unit/8327-models-owned-by-prefix.test.ts +++ b/tests/unit/8327-models-owned-by-prefix.test.ts @@ -39,7 +39,7 @@ const CONFIGURED_PREFIX = "pix4k-talk"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8327: synced models on a compatible provider node expose the configured prefix as owned_by, not the raw UUID", async () => { diff --git a/tests/unit/8332-combo-vision-fallback.test.ts b/tests/unit/8332-combo-vision-fallback.test.ts index 2e04b8194c..3b7e266d06 100644 --- a/tests/unit/8332-combo-vision-fallback.test.ts +++ b/tests/unit/8332-combo-vision-fallback.test.ts @@ -96,7 +96,7 @@ test.after(() => { clearModelsDevCapabilities(); settingsDb.clearAllLKGP(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/8336-audit-loopback-login.test.ts b/tests/unit/8336-audit-loopback-login.test.ts index 2159bac0ba..038311cf1b 100644 --- a/tests/unit/8336-audit-loopback-login.test.ts +++ b/tests/unit/8336-audit-loopback-login.test.ts @@ -36,7 +36,7 @@ const originalGetCookieStore = loginRoute.authRouteInternals.getCookieStore; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.INITIAL_PASSWORD = "correct-secret-8336"; } @@ -52,7 +52,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; } else { diff --git a/tests/unit/8374-plugins-status-optional.test.ts b/tests/unit/8374-plugins-status-optional.test.ts index f5936b7e87..5c5bae11d5 100644 --- a/tests/unit/8374-plugins-status-optional.test.ts +++ b/tests/unit/8374-plugins-status-optional.test.ts @@ -44,7 +44,7 @@ before(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/8385-perkey-proxy-global-toggle.test.ts b/tests/unit/8385-perkey-proxy-global-toggle.test.ts index 84a0226ca8..264518c8e7 100644 --- a/tests/unit/8385-perkey-proxy-global-toggle.test.ts +++ b/tests/unit/8385-perkey-proxy-global-toggle.test.ts @@ -27,13 +27,13 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("issue #8385: global perKeyProxyEnabled=false must override a connection's per_key_proxy_enabled=1", async () => { diff --git a/tests/unit/8388-compression-detail-persist.test.ts b/tests/unit/8388-compression-detail-persist.test.ts index c65d29ba95..85f16cc96d 100644 --- a/tests/unit/8388-compression-detail-persist.test.ts +++ b/tests/unit/8388-compression-detail-persist.test.ts @@ -28,7 +28,7 @@ const { getCompressionSettings, updateCompressionSettings } = await import( test.after(() => { resetDbInstance(); - fs.rmSync(tmpDataDir, { recursive: true, force: true }); + fs.rmSync(tmpDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8388: PUT body carrying ccr detail (minChars/retrievalRampFactor) is ACCEPTED by the schema", () => { diff --git a/tests/unit/8395-plugin-hooks-fire.test.ts b/tests/unit/8395-plugin-hooks-fire.test.ts index 2d91d3611e..3147f41225 100644 --- a/tests/unit/8395-plugin-hooks-fire.test.ts +++ b/tests/unit/8395-plugin-hooks-fire.test.ts @@ -26,7 +26,7 @@ test( t.after(async () => { loaded?.cleanup(); - await rm(pluginDir, { recursive: true, force: true }); + await rm(pluginDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); await writeFile( diff --git a/tests/unit/8431-multiwindow-quota-eviction.test.ts b/tests/unit/8431-multiwindow-quota-eviction.test.ts index ebe0767a50..82ea18c25b 100644 --- a/tests/unit/8431-multiwindow-quota-eviction.test.ts +++ b/tests/unit/8431-multiwindow-quota-eviction.test.ts @@ -35,7 +35,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const COLD_WINDOWS = ["Bonus Pack 1", "Bonus Pack 2", "Bonus Pack 3", "Bonus Pack 4", "Weekly", "Daily"]; diff --git a/tests/unit/8488-capability-filter-fail-closed.test.ts b/tests/unit/8488-capability-filter-fail-closed.test.ts index 691353e792..3372fb4f8d 100644 --- a/tests/unit/8488-capability-filter-fail-closed.test.ts +++ b/tests/unit/8488-capability-filter-fail-closed.test.ts @@ -67,13 +67,13 @@ const log = { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8488 filter: some tool-capable targets kept (unchanged)", () => { diff --git a/tests/unit/8510-adobe-firefly-edits-route.test.ts b/tests/unit/8510-adobe-firefly-edits-route.test.ts index 5e80cad4d4..1d755cf1ca 100644 --- a/tests/unit/8510-adobe-firefly-edits-route.test.ts +++ b/tests/unit/8510-adobe-firefly-edits-route.test.ts @@ -38,7 +38,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -86,7 +86,7 @@ test.after(() => { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8510 v1 image edit POST uploads Adobe Firefly reference images and dispatches referenceBlobs", async () => { diff --git a/tests/unit/8779-agy-prefix-credential-lookup.test.ts b/tests/unit/8779-agy-prefix-credential-lookup.test.ts index 446f1e708b..0a9ddb81d5 100644 --- a/tests/unit/8779-agy-prefix-credential-lookup.test.ts +++ b/tests/unit/8779-agy-prefix-credential-lookup.test.ts @@ -33,7 +33,7 @@ const model = await import("../../open-sse/services/model.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ async function seedOnly(provider: string) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the agy/ prefix still canonicalizes to antigravity (#8013 unchanged)", () => { diff --git a/tests/unit/8958-alias-backed-node-prefix.test.ts b/tests/unit/8958-alias-backed-node-prefix.test.ts index f823d7dd62..1ec37506f7 100644 --- a/tests/unit/8958-alias-backed-node-prefix.test.ts +++ b/tests/unit/8958-alias-backed-node-prefix.test.ts @@ -38,7 +38,7 @@ const MODEL_ID = "opc/big-pickle"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -85,7 +85,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8958: alias-backed model on a compatible node is not duplicated under the raw UUID prefix (alias mode)", async () => { diff --git a/tests/unit/9034-alias-backed-prefix-id-repro.test.ts b/tests/unit/9034-alias-backed-prefix-id-repro.test.ts index 76188b69bd..6089adc1a6 100644 --- a/tests/unit/9034-alias-backed-prefix-id-repro.test.ts +++ b/tests/unit/9034-alias-backed-prefix-id-repro.test.ts @@ -45,7 +45,7 @@ const MODEL_NAME = "kimi-k2"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -61,7 +61,7 @@ test.before(async () => { test.after(async () => { if (core) core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9034: alias-backed model id must use the configured prefix, not the raw provider-node UUID", async () => { diff --git a/tests/unit/9134-repro-audio-combo-rejection.test.ts b/tests/unit/9134-repro-audio-combo-rejection.test.ts index cdf26933cd..ebcdd80ebf 100644 --- a/tests/unit/9134-repro-audio-combo-rejection.test.ts +++ b/tests/unit/9134-repro-audio-combo-rejection.test.ts @@ -22,7 +22,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Minimal but structurally valid WAV so nothing rejects the upload shape. */ diff --git a/tests/unit/9147-catalog-eventloop-yield.test.ts b/tests/unit/9147-catalog-eventloop-yield.test.ts index 91068f367e..a5102eebc6 100644 --- a/tests/unit/9147-catalog-eventloop-yield.test.ts +++ b/tests/unit/9147-catalog-eventloop-yield.test.ts @@ -18,7 +18,7 @@ const MODELS_PER_CONNECTION = 12; // ~720 synced models total async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9147 — catalog build at catalog-scale must not pin the event loop for a long stretch", async (t) => { diff --git a/tests/unit/9201-search-proxy-bypass.test.ts b/tests/unit/9201-search-proxy-bypass.test.ts index 48fcff4858..98440bd35d 100644 --- a/tests/unit/9201-search-proxy-bypass.test.ts +++ b/tests/unit/9201-search-proxy-bypass.test.ts @@ -66,7 +66,7 @@ test.after(async () => { searchRegistry.SEARCH_PROVIDERS["serper-search"].baseUrl = originalSerperBaseUrl; await new Promise((resolve) => proxyServer.close(() => resolve())); core.resetDbInstance(); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function installProxyResponseCounter() { diff --git a/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts b/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts index aad652d005..263876d22c 100644 --- a/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts +++ b/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { core.resetDbInstance(); for (let attempt = 0; attempt < 10; attempt++) { try { - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); break; } catch (error: unknown) { const code = (error as { code?: string } | undefined)?.code; @@ -34,7 +34,7 @@ test.beforeEach(async () => { }); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function setupConnectionWithAssignment() { diff --git a/tests/unit/_mocks/settings.ts b/tests/unit/_mocks/settings.ts index 2ccd31da52..d3d249f1fb 100644 --- a/tests/unit/_mocks/settings.ts +++ b/tests/unit/_mocks/settings.ts @@ -46,11 +46,11 @@ export function setupSettingsFixture(slug: string): SettingsFixture { const runtime = await import("../../../src/lib/config/runtimeSettings.ts"); core.resetDbInstance(); runtime.resetRuntimeSettingsStateForTests(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(testDataDir, { recursive: true }); }, cleanup() { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }, }; activeFixture = fixture; diff --git a/tests/unit/a2a-auth-timing-safe.test.ts b/tests/unit/a2a-auth-timing-safe.test.ts index 57ecbb4995..3e14c90cb8 100644 --- a/tests/unit/a2a-auth-timing-safe.test.ts +++ b/tests/unit/a2a-auth-timing-safe.test.ts @@ -34,14 +34,14 @@ function makeJsonRpcRequest(token?: string): NextRequest { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.OMNIROUTE_API_KEY = API_KEY; }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/a2a-enabled-route.test.ts b/tests/unit/a2a-enabled-route.test.ts index 2c52cdf9ac..a5a6a44111 100644 --- a/tests/unit/a2a-enabled-route.test.ts +++ b/tests/unit/a2a-enabled-route.test.ts @@ -19,7 +19,7 @@ const a2aRoute = await import("../../src/app/a2a/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/a2a-route-require-api-key.test.ts b/tests/unit/a2a-route-require-api-key.test.ts index 4fec1a55c8..592aeec9dd 100644 --- a/tests/unit/a2a-route-require-api-key.test.ts +++ b/tests/unit/a2a-route-require-api-key.test.ts @@ -24,7 +24,7 @@ const ORIGINAL_A2A_KEY = process.env.OMNIROUTE_API_KEY; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_REQUIRE === undefined) delete process.env.REQUIRE_API_KEY; else process.env.REQUIRE_API_KEY = ORIGINAL_REQUIRE; if (ORIGINAL_A2A_KEY === undefined) delete process.env.OMNIROUTE_API_KEY; diff --git a/tests/unit/a2a-task-owner-idor.test.ts b/tests/unit/a2a-task-owner-idor.test.ts index 365744ed33..aaa35142c8 100644 --- a/tests/unit/a2a-task-owner-idor.test.ts +++ b/tests/unit/a2a-task-owner-idor.test.ts @@ -35,7 +35,7 @@ const ORIGINAL_REQUIRE = process.env.REQUIRE_API_KEY; after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_REQUIRE === undefined) delete process.env.REQUIRE_API_KEY; else process.env.REQUIRE_API_KEY = ORIGINAL_REQUIRE; }); diff --git a/tests/unit/a2a-v1-compat-10839.test.ts b/tests/unit/a2a-v1-compat-10839.test.ts index 7aeea86542..6df10dbbc9 100644 --- a/tests/unit/a2a-v1-compat-10839.test.ts +++ b/tests/unit/a2a-v1-compat-10839.test.ts @@ -37,14 +37,14 @@ function makeJsonRpcRequest(body: unknown): NextRequest { test.beforeEach(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ a2aEnabled: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10839: v1.0 SendMessage is aliased to message/send and reshapes the response", async () => { diff --git a/tests/unit/access-tokens-db.test.ts b/tests/unit/access-tokens-db.test.ts index 9593b51613..d0d6c4c890 100644 --- a/tests/unit/access-tokens-db.test.ts +++ b/tests/unit/access-tokens-db.test.ts @@ -18,7 +18,7 @@ test.after(() => { core.resetDbInstance(); } catch {} try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/account-concurrency-cap.test.ts b/tests/unit/account-concurrency-cap.test.ts index 425f27b565..0179f93350 100644 --- a/tests/unit/account-concurrency-cap.test.ts +++ b/tests/unit/account-concurrency-cap.test.ts @@ -31,7 +31,7 @@ function getConnectionId(connection: NonNullable): string { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ beforeEach(async () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("maxConcurrent DB round-trip", () => { diff --git a/tests/unit/account-fallback-service.test.ts b/tests/unit/account-fallback-service.test.ts index 266179ec7a..d28075545a 100644 --- a/tests/unit/account-fallback-service.test.ts +++ b/tests/unit/account-fallback-service.test.ts @@ -1617,7 +1617,7 @@ test("isAccountDeactivated matches a custom signal after setCustomBannedSignals" async function resetStorage10460() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR_10460, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR_10460, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR_10460, { recursive: true }); } @@ -1634,7 +1634,7 @@ async function seedConn10460(provider: string): Promise { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR_10460, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR_10460, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10460: model-unsupported 400 returns shouldFallback:false (no account cooldown)", async () => { diff --git a/tests/unit/acp-agents-route.test.ts b/tests/unit/acp-agents-route.test.ts index 2d3065a9a8..a64a2f0f9d 100644 --- a/tests/unit/acp-agents-route.test.ts +++ b/tests/unit/acp-agents-route.test.ts @@ -18,7 +18,7 @@ const ORIGINAL_JWT_SECRET = process.env.JWT_SECRET; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; delete process.env.JWT_SECRET; @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/active-request-stream-chunks-lifecycle.test.ts b/tests/unit/active-request-stream-chunks-lifecycle.test.ts index 95547d8e61..35fd1cbc2d 100644 --- a/tests/unit/active-request-stream-chunks-lifecycle.test.ts +++ b/tests/unit/active-request-stream-chunks-lifecycle.test.ts @@ -18,7 +18,7 @@ const stripChunkTs = (chunk: string): string => chunk.replace(/^\[\d{2}:\d{2}:\d test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Helper: Simulates /api/logs/[id] API route logic ────────────────────── diff --git a/tests/unit/admin-audit-events.test.ts b/tests/unit/admin-audit-events.test.ts index b8aa06710b..d521d2a0d4 100644 --- a/tests/unit/admin-audit-events.test.ts +++ b/tests/unit/admin-audit-events.test.ts @@ -24,7 +24,7 @@ const originalGetLogoutCookieStore = logoutRoute.logoutRouteInternals.getCookieS function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("auth login/logout routes emit structured audit events with ip and request id", async () => { diff --git a/tests/unit/agent-bridge-cert-regenerate-force-10467.test.ts b/tests/unit/agent-bridge-cert-regenerate-force-10467.test.ts index fc600982c6..b8af604efc 100644 --- a/tests/unit/agent-bridge-cert-regenerate-force-10467.test.ts +++ b/tests/unit/agent-bridge-cert-regenerate-force-10467.test.ts @@ -23,7 +23,7 @@ async function withTempDataDir(fn: (dir: string) => Promise): Promise { } finally { if (previous === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = previous; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/agent-bridge-config-portability.test.ts b/tests/unit/agent-bridge-config-portability.test.ts index 8a01a90167..c2bffbfded 100644 --- a/tests/unit/agent-bridge-config-portability.test.ts +++ b/tests/unit/agent-bridge-config-portability.test.ts @@ -22,7 +22,7 @@ async function resetStorage() { core.resetDbInstance(); for (let attempt = 0; attempt < 10; attempt++) { try { - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); break; } catch (error: unknown) { const code = (error as { code?: string } | null)?.code; @@ -39,7 +39,7 @@ test.beforeEach(async () => { }); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("AgentBridgeConfigSchema accepts a well-formed config", () => { diff --git a/tests/unit/agent-bridge-mappings-sync-8656.test.ts b/tests/unit/agent-bridge-mappings-sync-8656.test.ts index 7d98ef82b4..ce477ef33e 100644 --- a/tests/unit/agent-bridge-mappings-sync-8656.test.ts +++ b/tests/unit/agent-bridge-mappings-sync-8656.test.ts @@ -25,7 +25,7 @@ const { getMitmAlias } = await import("../../src/lib/db/models/mitmAlias.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(() => { test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } diff --git a/tests/unit/agent-bridge-server-route-dynamic-import.test.ts b/tests/unit/agent-bridge-server-route-dynamic-import.test.ts index a207fd890a..0970e0e902 100644 --- a/tests/unit/agent-bridge-server-route-dynamic-import.test.ts +++ b/tests/unit/agent-bridge-server-route-dynamic-import.test.ts @@ -20,14 +20,14 @@ const serverRoute = await import("../../src/app/api/tools/agent-bridge/server/ro function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(() => resetDb()); test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } diff --git a/tests/unit/agent-bridge-state-full-payload-8656.test.ts b/tests/unit/agent-bridge-state-full-payload-8656.test.ts index c53bc040c0..885248f16e 100644 --- a/tests/unit/agent-bridge-state-full-payload-8656.test.ts +++ b/tests/unit/agent-bridge-state-full-payload-8656.test.ts @@ -30,7 +30,7 @@ const { replaceUserBypassPatterns } = await import("../../src/lib/db/agentBridge function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -40,7 +40,7 @@ test.beforeEach(() => { test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } diff --git a/tests/unit/agentSkills-cliRegistryParser.test.ts b/tests/unit/agentSkills-cliRegistryParser.test.ts index 0e18080e70..1990c591d6 100644 --- a/tests/unit/agentSkills-cliRegistryParser.test.ts +++ b/tests/unit/agentSkills-cliRegistryParser.test.ts @@ -29,7 +29,7 @@ function withFixtureCli(files: Record): { cleanup: () => void } return { cleanup() { process.chdir(originalCwd); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }, }; } @@ -315,7 +315,7 @@ test("parseCliRegistry() throws if commands directory is missing", () => { ); } finally { process.chdir(originalCwd); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/agentSkills-generator.test.ts b/tests/unit/agentSkills-generator.test.ts index 9391af4a7f..66360b34ce 100644 --- a/tests/unit/agentSkills-generator.test.ts +++ b/tests/unit/agentSkills-generator.test.ts @@ -30,7 +30,7 @@ function mkTmpDir(): string { /** Cleanup a tmp directory. */ function rmTmpDir(dir: string): void { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/agentSkills-openapiParser.test.ts b/tests/unit/agentSkills-openapiParser.test.ts index a3273dbce8..c5988644dc 100644 --- a/tests/unit/agentSkills-openapiParser.test.ts +++ b/tests/unit/agentSkills-openapiParser.test.ts @@ -28,7 +28,7 @@ function withFixtureOpenapi(yamlContent: string): { cleanup: () => void } { return { cleanup() { process.chdir(originalCwd); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }, }; } @@ -191,7 +191,7 @@ test("parseOpenapi() throws if openapi.yaml is missing", () => { ); } finally { process.chdir(originalCwd); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/agentSkills-routes.test.ts b/tests/unit/agentSkills-routes.test.ts index d2eaa5fbb8..18ab884fbc 100644 --- a/tests/unit/agentSkills-routes.test.ts +++ b/tests/unit/agentSkills-routes.test.ts @@ -46,7 +46,7 @@ const generateRoute = await import("../../src/app/api/agent-skills/generate/rout async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -76,7 +76,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts b/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts index 16802be699..df463a1cdb 100644 --- a/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts +++ b/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts @@ -38,7 +38,7 @@ test("generateCert() issues a cert whose SAN list covers all 4 antigravity hosts t.after(() => { if (previousDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = previousDataDir; - fs.rmSync(tmpDataDir, { recursive: true, force: true }); + fs.rmSync(tmpDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Fresh module instance so it re-reads process.env.DATA_DIR via resolveMitmDataDir(). diff --git a/tests/unit/agentbridge-mitm-router-key-6403.test.ts b/tests/unit/agentbridge-mitm-router-key-6403.test.ts index 593ce713ba..2821c0cb5d 100644 --- a/tests/unit/agentbridge-mitm-router-key-6403.test.ts +++ b/tests/unit/agentbridge-mitm-router-key-6403.test.ts @@ -33,7 +33,7 @@ const { resolveRouterApiKey } = await import( function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ test.beforeEach(() => { test.after(() => { delete process.env.ROUTER_API_KEY; try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* noop */ } diff --git a/tests/unit/agentrouter-chatcore-protocols.test.ts b/tests/unit/agentrouter-chatcore-protocols.test.ts index ece0f7c5f5..27c40bb8c5 100644 --- a/tests/unit/agentrouter-chatcore-protocols.test.ts +++ b/tests/unit/agentrouter-chatcore-protocols.test.ts @@ -38,14 +38,14 @@ test.afterEach(async () => { globalThis.fetch = originalFetch; await flushAsyncSideEffects(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("AgentRouter Responses requests automatically use the native Responses protocol", async () => { diff --git a/tests/unit/agentrouter-lock-scope-10334.test.ts b/tests/unit/agentrouter-lock-scope-10334.test.ts index 1205ec5cd2..2736aa1ee8 100644 --- a/tests/unit/agentrouter-lock-scope-10334.test.ts +++ b/tests/unit/agentrouter-lock-scope-10334.test.ts @@ -31,7 +31,7 @@ const MODEL_ACCESS_DENIED_403 = '{"error":{"message":"无权访问模型 claude- async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ async function seedConnection( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("agentrouter 429 account quota exhausted -> connection cooldown, never terminal", async () => { diff --git a/tests/unit/agnes-provider.test.ts b/tests/unit/agnes-provider.test.ts index 8d4bdc52e0..bc15ab9e8c 100644 --- a/tests/unit/agnes-provider.test.ts +++ b/tests/unit/agnes-provider.test.ts @@ -24,7 +24,7 @@ const dbCore = await import("../../src/lib/db/core.ts"); test.after(() => { dbCore.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const AGNES_CHAT_URL = "https://apihub.agnes-ai.com/v1/chat/completions"; diff --git a/tests/unit/aihorde-optional-api-key.test.ts b/tests/unit/aihorde-optional-api-key.test.ts index 9a69669860..cdede1c226 100644 --- a/tests/unit/aihorde-optional-api-key.test.ts +++ b/tests/unit/aihorde-optional-api-key.test.ts @@ -20,7 +20,7 @@ const { isManagedProviderConnectionId } = await import("../../src/lib/providers/ test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("aihorde treats a registered key as optional, not required", () => { diff --git a/tests/unit/airforce-v1-double-prefix-5899.test.ts b/tests/unit/airforce-v1-double-prefix-5899.test.ts index 288fbd0d03..2daf282311 100644 --- a/tests/unit/airforce-v1-double-prefix-5899.test.ts +++ b/tests/unit/airforce-v1-double-prefix-5899.test.ts @@ -23,7 +23,7 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5899 openai gateway baseUrl ending in /v1/chat/completions never probes /v1/v1/models", async () => { diff --git a/tests/unit/alibaba-free-tier-allowlist.test.ts b/tests/unit/alibaba-free-tier-allowlist.test.ts index df468d82e5..e7e95c0ae2 100644 --- a/tests/unit/alibaba-free-tier-allowlist.test.ts +++ b/tests/unit/alibaba-free-tier-allowlist.test.ts @@ -58,7 +58,7 @@ function withAllowlistPack( if (previousPath) process.env.ALIBABA_FREE_TIER_ALLOWLIST_PATH = previousPath; else delete process.env.ALIBABA_FREE_TIER_ALLOWLIST_PATH; resetAlibabaFreeTierAllowlistCache(); - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/antigravity-429-quota-cooldown.test.ts b/tests/unit/antigravity-429-quota-cooldown.test.ts index eaf0a6e09b..6c51c03eae 100644 --- a/tests/unit/antigravity-429-quota-cooldown.test.ts +++ b/tests/unit/antigravity-429-quota-cooldown.test.ts @@ -30,7 +30,7 @@ import { markConnectionQuotaExhausted } from "../../open-sse/executors/antigravi test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Engine contract (regression guard) ─────────────────────────────────────── diff --git a/tests/unit/antigravity-client-identity-paths.test.ts b/tests/unit/antigravity-client-identity-paths.test.ts index 8801750201..9ce32df8a5 100644 --- a/tests/unit/antigravity-client-identity-paths.test.ts +++ b/tests/unit/antigravity-client-identity-paths.test.ts @@ -32,7 +32,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("executor token refresh uses the selected CLI identity", async () => { diff --git a/tests/unit/antigravity-local-usage-fallback-3821.test.ts b/tests/unit/antigravity-local-usage-fallback-3821.test.ts index 38c5f1464d..23ba88bfef 100644 --- a/tests/unit/antigravity-local-usage-fallback-3821.test.ts +++ b/tests/unit/antigravity-local-usage-fallback-3821.test.ts @@ -30,7 +30,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Antigravity fetchAvailableModels(used=0) → localUsageHistory when usage_history has rows", async () => { diff --git a/tests/unit/antigravity-missing-project-autodisable.test.ts b/tests/unit/antigravity-missing-project-autodisable.test.ts index aff0172790..2633ca72c3 100644 --- a/tests/unit/antigravity-missing-project-autodisable.test.ts +++ b/tests/unit/antigravity-missing-project-autodisable.test.ts @@ -34,7 +34,7 @@ const { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/antigravity-mitm-model-resolution.test.ts b/tests/unit/antigravity-mitm-model-resolution.test.ts index 86a06718a2..8facfe6262 100644 --- a/tests/unit/antigravity-mitm-model-resolution.test.ts +++ b/tests/unit/antigravity-mitm-model-resolution.test.ts @@ -17,7 +17,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // #3144: the executor resolves the upstream model through the dynamic MITM alias diff --git a/tests/unit/antigravity-project-persistence.test.ts b/tests/unit/antigravity-project-persistence.test.ts index 1dd30c712f..c0e20d86f1 100644 --- a/tests/unit/antigravity-project-persistence.test.ts +++ b/tests/unit/antigravity-project-persistence.test.ts @@ -28,7 +28,7 @@ const { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/antigravity-quota-host-8965.test.ts b/tests/unit/antigravity-quota-host-8965.test.ts index a383292d85..bf3067c8fb 100644 --- a/tests/unit/antigravity-quota-host-8965.test.ts +++ b/tests/unit/antigravity-quota-host-8965.test.ts @@ -32,7 +32,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const RESET_IN_2_HOURS = new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString(); diff --git a/tests/unit/antigravity-quota-skipping.test.ts b/tests/unit/antigravity-quota-skipping.test.ts index f23a43883a..6f585bb3bc 100644 --- a/tests/unit/antigravity-quota-skipping.test.ts +++ b/tests/unit/antigravity-quota-skipping.test.ts @@ -12,7 +12,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("isQuotaExhaustedForRequest isolates Claude and Gemini quota families for antigravity & agy", () => { diff --git a/tests/unit/antigravity-weekly-quota-4017.test.ts b/tests/unit/antigravity-weekly-quota-4017.test.ts index ee29b1c52d..3a33142229 100644 --- a/tests/unit/antigravity-weekly-quota-4017.test.ts +++ b/tests/unit/antigravity-weekly-quota-4017.test.ts @@ -33,7 +33,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const RESET_IN_3_DAYS = new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(); diff --git a/tests/unit/api-auth.test.ts b/tests/unit/api-auth.test.ts index dd4f874f3b..a472e6db4d 100644 --- a/tests/unit/api-auth.test.ts +++ b/tests/unit/api-auth.test.ts @@ -24,7 +24,7 @@ const ORIGINAL_INITIAL_PASSWORD = process.env.INITIAL_PASSWORD; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; @@ -48,7 +48,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT_SECRET === undefined) { delete process.env.JWT_SECRET; diff --git a/tests/unit/api-key-compression-enabled-2101.test.ts b/tests/unit/api-key-compression-enabled-2101.test.ts index ddef25de9f..05145738f4 100644 --- a/tests/unit/api-key-compression-enabled-2101.test.ts +++ b/tests/unit/api-key-compression-enabled-2101.test.ts @@ -15,7 +15,7 @@ const { updateKeyPermissionsSchema } = await import("../../src/shared/validation async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("API key prompt compression defaults on and round-trips an explicit opt-out", async () => { diff --git a/tests/unit/api-key-lifecycle.test.ts b/tests/unit/api-key-lifecycle.test.ts index 126856b56e..5cb73eb767 100644 --- a/tests/unit/api-key-lifecycle.test.ts +++ b/tests/unit/api-key-lifecycle.test.ts @@ -17,7 +17,7 @@ const ORIGINAL_ROUTER_API_KEY = process.env.ROUTER_API_KEY; function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.OMNIROUTE_API_KEY; delete process.env.ROUTER_API_KEY; @@ -28,7 +28,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_OMNIROUTE_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY; else process.env.OMNIROUTE_API_KEY = ORIGINAL_OMNIROUTE_API_KEY; if (ORIGINAL_ROUTER_API_KEY === undefined) delete process.env.ROUTER_API_KEY; diff --git a/tests/unit/api-key-policy-noauth-allowed-connections.test.ts b/tests/unit/api-key-policy-noauth-allowed-connections.test.ts index 73040c648f..a2c7935726 100644 --- a/tests/unit/api-key-policy-noauth-allowed-connections.test.ts +++ b/tests/unit/api-key-policy-noauth-allowed-connections.test.ts @@ -25,7 +25,7 @@ const RESTRICTED_CONNECTION_UUID = "00000000-0000-4000-8000-000000000001"; test.after(() => { coreDb.resetDbInstance(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); test("#9057 LAYER1: restricted key gets NO synthetic credentials for noauth provider felo", async () => { diff --git a/tests/unit/api-key-policy.test.ts b/tests/unit/api-key-policy.test.ts index 63cf63be7b..eff769271f 100644 --- a/tests/unit/api-key-policy.test.ts +++ b/tests/unit/api-key-policy.test.ts @@ -48,7 +48,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -129,7 +129,7 @@ test.after(async () => { apiKeysDb.resetApiKeyState(); costRules.resetCostData(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Replicate the isWithinSchedule logic for pure unit testing ─────────────── diff --git a/tests/unit/api-key-regeneration.test.ts b/tests/unit/api-key-regeneration.test.ts index a492424498..920a835902 100644 --- a/tests/unit/api-key-regeneration.test.ts +++ b/tests/unit/api-key-regeneration.test.ts @@ -15,7 +15,7 @@ function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("regenerateApiKey creates a new key and invalidates the old one", async () => { diff --git a/tests/unit/api-key-reveal-route.test.ts b/tests/unit/api-key-reveal-route.test.ts index 34be3d41ad..0c34f02bfb 100644 --- a/tests/unit/api-key-reveal-route.test.ts +++ b/tests/unit/api-key-reveal-route.test.ts @@ -21,7 +21,7 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.after(async () => { delete process.env.ALLOW_API_KEY_REVEAL; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/keys stays masked even when reveal is enabled", async () => { diff --git a/tests/unit/api-key-usage-limits.test.ts b/tests/unit/api-key-usage-limits.test.ts index 5a3c277887..7221cc883c 100644 --- a/tests/unit/api-key-usage-limits.test.ts +++ b/tests/unit/api-key-usage-limits.test.ts @@ -20,7 +20,7 @@ async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); usageHistory.clearPendingRequests(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("API key USD usage limits persist and default off", async () => { diff --git a/tests/unit/api-keys-create-no-hang-6570.test.ts b/tests/unit/api-keys-create-no-hang-6570.test.ts index 7ba196ea48..3a5d5bd536 100644 --- a/tests/unit/api-keys-create-no-hang-6570.test.ts +++ b/tests/unit/api-keys-create-no-hang-6570.test.ts @@ -34,7 +34,7 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); core.resetDbInstance(); }); diff --git a/tests/unit/api-malformed-json-400.test.ts b/tests/unit/api-malformed-json-400.test.ts index 1b0cce21c1..a4cbb58999 100644 --- a/tests/unit/api-malformed-json-400.test.ts +++ b/tests/unit/api-malformed-json-400.test.ts @@ -65,7 +65,7 @@ function jsonRequest(url: string, body: unknown, method = "POST"): Request { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/api-manager-provider-permissions.test.ts b/tests/unit/api-manager-provider-permissions.test.ts index 5169219a24..4df4b7adbf 100644 --- a/tests/unit/api-manager-provider-permissions.test.ts +++ b/tests/unit/api-manager-provider-permissions.test.ts @@ -45,7 +45,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { @@ -63,7 +63,7 @@ test.after(async () => { apiKeys.resetApiKeyState(); core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } @@ -258,7 +258,7 @@ test("R2/R5: JSON import preserves explicit restricted + empty and infers legacy test("R2/R5: startup db.json migration preserves explicit restricted-empty mode", async () => { apiKeys.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); fs.writeFileSync( path.join(TEST_DATA_DIR, "db.json"), diff --git a/tests/unit/api-models-hide-paid-6328.test.ts b/tests/unit/api-models-hide-paid-6328.test.ts index f2e509c864..6e4e4a0fbc 100644 --- a/tests/unit/api-models-hide-paid-6328.test.ts +++ b/tests/unit/api-models-hide-paid-6328.test.ts @@ -32,7 +32,7 @@ async function fetchModels(): Promise< test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best-effort */ } diff --git a/tests/unit/api-models-v1-models-mismatch-10615.test.ts b/tests/unit/api-models-v1-models-mismatch-10615.test.ts index b6a241844a..f41976e346 100644 --- a/tests/unit/api-models-v1-models-mismatch-10615.test.ts +++ b/tests/unit/api-models-v1-models-mismatch-10615.test.ts @@ -16,7 +16,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/api/auto-combo-candidates-route-7819.test.ts b/tests/unit/api/auto-combo-candidates-route-7819.test.ts index bc5c8df474..0588558e82 100644 --- a/tests/unit/api/auto-combo-candidates-route-7819.test.ts +++ b/tests/unit/api/auto-combo-candidates-route-7819.test.ts @@ -30,7 +30,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7819: GET /candidates for the base 'auto' channel returns 200 with a candidates array", async () => { diff --git a/tests/unit/api/cli-tools/apply-container-guard.test.ts b/tests/unit/api/cli-tools/apply-container-guard.test.ts index 5ef03013b8..74cceb6ae4 100644 --- a/tests/unit/api/cli-tools/apply-container-guard.test.ts +++ b/tests/unit/api/cli-tools/apply-container-guard.test.ts @@ -89,8 +89,8 @@ describe("POST /api/cli-tools/apply — container guard", () => { after(() => { catalogServer?.close(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); - fs.rmSync(TEST_XDG_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(TEST_XDG_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; if (originalXdg === undefined) delete process.env.XDG_CONFIG_HOME; diff --git a/tests/unit/api/cli-tools/detect.test.ts b/tests/unit/api/cli-tools/detect.test.ts index 25b4905d68..b2835ecdb1 100644 --- a/tests/unit/api/cli-tools/detect.test.ts +++ b/tests/unit/api/cli-tools/detect.test.ts @@ -28,7 +28,7 @@ describe("GET /api/cli-tools/detect", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/api/compression-engines-route.test.ts b/tests/unit/api/compression-engines-route.test.ts index 4ad921252e..ef7a88283b 100644 --- a/tests/unit/api/compression-engines-route.test.ts +++ b/tests/unit/api/compression-engines-route.test.ts @@ -31,7 +31,7 @@ const enginesRoute = await import("../../../src/app/api/compression/engines/rout async function setupAuth(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -53,7 +53,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── tests ──────────────────────────────────────────────────────────────────── diff --git a/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts b/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts index 409ba2077d..1374b8f6cd 100644 --- a/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts +++ b/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts @@ -46,7 +46,7 @@ const CAVEMAN_TRIGGER = async function setupAuth(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -68,7 +68,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── tests ──────────────────────────────────────────────────────────────────── diff --git a/tests/unit/api/compression-preview-engine.test.ts b/tests/unit/api/compression-preview-engine.test.ts index 847939fbd5..026eb118d3 100644 --- a/tests/unit/api/compression-preview-engine.test.ts +++ b/tests/unit/api/compression-preview-engine.test.ts @@ -31,7 +31,7 @@ const previewRoute = await import("../../../src/app/api/compression/preview/rout async function setupAuth(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -71,7 +71,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── tests ──────────────────────────────────────────────────────────────────── diff --git a/tests/unit/api/compression/compression-api.test.ts b/tests/unit/api/compression/compression-api.test.ts index 85f735d564..80c77154da 100644 --- a/tests/unit/api/compression/compression-api.test.ts +++ b/tests/unit/api/compression/compression-api.test.ts @@ -140,13 +140,13 @@ function makeRequest(method: string, body?: unknown): Request { describe("settings/compression route — engines + activeComboId", () => { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/api/compression/rtk-learn-discover-routes.test.ts b/tests/unit/api/compression/rtk-learn-discover-routes.test.ts index 42b3cd30c5..47e93c8511 100644 --- a/tests/unit/api/compression/rtk-learn-discover-routes.test.ts +++ b/tests/unit/api/compression/rtk-learn-discover-routes.test.ts @@ -45,12 +45,12 @@ function get(url: string): Request { } test.beforeEach(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_INITIAL_PASSWORD !== undefined) diff --git a/tests/unit/api/compression/rtk-toml-import-route.test.ts b/tests/unit/api/compression/rtk-toml-import-route.test.ts index 959e43453a..c09dc4f4c3 100644 --- a/tests/unit/api/compression/rtk-toml-import-route.test.ts +++ b/tests/unit/api/compression/rtk-toml-import-route.test.ts @@ -29,7 +29,7 @@ expected = "kept" async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -47,7 +47,7 @@ test.beforeEach(reset); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_INITIAL_PASSWORD === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/api/context-analytics-engine-route.test.ts b/tests/unit/api/context-analytics-engine-route.test.ts index ef583ddcc2..a26f4337bf 100644 --- a/tests/unit/api/context-analytics-engine-route.test.ts +++ b/tests/unit/api/context-analytics-engine-route.test.ts @@ -31,7 +31,7 @@ const engineRoute = await import("../../../src/app/api/context/analytics/engine/ async function setupAuth(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -53,7 +53,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── tests ──────────────────────────────────────────────────────────────────── diff --git a/tests/unit/api/context-combos-default-route.test.ts b/tests/unit/api/context-combos-default-route.test.ts index c5b0da6af3..eb85d4f5fa 100644 --- a/tests/unit/api/context-combos-default-route.test.ts +++ b/tests/unit/api/context-combos-default-route.test.ts @@ -36,7 +36,7 @@ const defaultRoute = await import("../../../src/app/api/context/combos/default/r async function setupAuth(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -58,7 +58,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── tests ──────────────────────────────────────────────────────────────────── diff --git a/tests/unit/api/discovery-routes.test.ts b/tests/unit/api/discovery-routes.test.ts index 99dc8dddcc..ee40cb5757 100644 --- a/tests/unit/api/discovery-routes.test.ts +++ b/tests/unit/api/discovery-routes.test.ts @@ -38,7 +38,7 @@ before(async () => { after(() => { core.resetDbInstance(); - if (tmpDataDir) rmSync(tmpDataDir, { recursive: true, force: true }); + if (tmpDataDir) rmSync(tmpDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("discovery API routes", () => { diff --git a/tests/unit/api/free-proxies-list-route.test.ts b/tests/unit/api/free-proxies-list-route.test.ts index 334148de5b..d3664c5217 100644 --- a/tests/unit/api/free-proxies-list-route.test.ts +++ b/tests/unit/api/free-proxies-list-route.test.ts @@ -19,7 +19,7 @@ const ORIGINAL_INITIAL_PASSWORD = process.env.INITIAL_PASSWORD; async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ function make(host: string, quality: number, latency: number): FreeProxyItem { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) delete process.env.INITIAL_PASSWORD; else process.env.INITIAL_PASSWORD = ORIGINAL_INITIAL_PASSWORD; }); diff --git a/tests/unit/api/free-proxies-route.test.ts b/tests/unit/api/free-proxies-route.test.ts index 77f3c034ee..85555bcfbb 100644 --- a/tests/unit/api/free-proxies-route.test.ts +++ b/tests/unit/api/free-proxies-route.test.ts @@ -19,7 +19,7 @@ const ORIGINAL_INITIAL_PASSWORD = process.env.INITIAL_PASSWORD; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) delete process.env.INITIAL_PASSWORD; else process.env.INITIAL_PASSWORD = ORIGINAL_INITIAL_PASSWORD; }); diff --git a/tests/unit/api/jobs.test.ts b/tests/unit/api/jobs.test.ts index 53ff2b1474..f135810d0c 100644 --- a/tests/unit/api/jobs.test.ts +++ b/tests/unit/api/jobs.test.ts @@ -29,7 +29,7 @@ function resetAll() { } __resetJobRegistry(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function params(id: string) { diff --git a/tests/unit/api/providers-import-route-6836.test.ts b/tests/unit/api/providers-import-route-6836.test.ts index 48c0cb6977..bbc791e336 100644 --- a/tests/unit/api/providers-import-route-6836.test.ts +++ b/tests/unit/api/providers-import-route-6836.test.ts @@ -26,13 +26,13 @@ type ImportRouteResponse = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function postImport(body: unknown) { diff --git a/tests/unit/api/proxies-repair-relay.test.ts b/tests/unit/api/proxies-repair-relay.test.ts index 39d89ab6c4..f6645c0d64 100644 --- a/tests/unit/api/proxies-repair-relay.test.ts +++ b/tests/unit/api/proxies-repair-relay.test.ts @@ -20,7 +20,7 @@ const repairRelayRoute = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -30,7 +30,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_KEY === undefined) delete process.env.STORAGE_ENCRYPTION_KEY; else process.env.STORAGE_ENCRYPTION_KEY = ORIGINAL_KEY; }); diff --git a/tests/unit/api/services/9router-models.test.ts b/tests/unit/api/services/9router-models.test.ts index a71df4d2eb..2956f9bc45 100644 --- a/tests/unit/api/services/9router-models.test.ts +++ b/tests/unit/api/services/9router-models.test.ts @@ -28,7 +28,7 @@ const originalFetch = globalThis.fetch; function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/api/services/9router-provider-expose.test.ts b/tests/unit/api/services/9router-provider-expose.test.ts index bd51066aac..737f6357be 100644 --- a/tests/unit/api/services/9router-provider-expose.test.ts +++ b/tests/unit/api/services/9router-provider-expose.test.ts @@ -23,7 +23,7 @@ const { POST } = await import("../../../../src/app/api/services/9router/provider function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/api/services/9router-status-reveal.test.ts b/tests/unit/api/services/9router-status-reveal.test.ts index ad66f63050..8d4927ed8f 100644 --- a/tests/unit/api/services/9router-status-reveal.test.ts +++ b/tests/unit/api/services/9router-status-reveal.test.ts @@ -46,7 +46,7 @@ function makeRequest(url: string, headers?: Record): Request { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("GET /api/services/9router/status", () => { diff --git a/tests/unit/api/services/cliproxy-accounts.test.ts b/tests/unit/api/services/cliproxy-accounts.test.ts index d282b7d11c..5cd20e25b9 100644 --- a/tests/unit/api/services/cliproxy-accounts.test.ts +++ b/tests/unit/api/services/cliproxy-accounts.test.ts @@ -22,7 +22,7 @@ before(async () => { after(() => { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("requires OmniRoute management authentication", async () => { diff --git a/tests/unit/api/services/cliproxy-provider-expose.test.ts b/tests/unit/api/services/cliproxy-provider-expose.test.ts index 3376c532df..ade24ad231 100644 --- a/tests/unit/api/services/cliproxy-provider-expose.test.ts +++ b/tests/unit/api/services/cliproxy-provider-expose.test.ts @@ -22,7 +22,7 @@ const { POST } = await import("../../../../src/app/api/services/cliproxy/provide function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts b/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts index 26028cf697..44339f3d54 100644 --- a/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts +++ b/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts @@ -35,7 +35,7 @@ const { createWebhook } = await import("../../../../src/lib/db/webhooks.ts"); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function jsonRequest(url: string, method: string, body: unknown): Request { diff --git a/tests/unit/apikey-connection-health-check.test.ts b/tests/unit/apikey-connection-health-check.test.ts index 572e10b161..87d3152342 100644 --- a/tests/unit/apikey-connection-health-check.test.ts +++ b/tests/unit/apikey-connection-health-check.test.ts @@ -29,7 +29,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -45,7 +45,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("API-key-only gemini connection is NOT marked expired by health check", async () => { diff --git a/tests/unit/apikey-policy-default-rate-limits.test.ts b/tests/unit/apikey-policy-default-rate-limits.test.ts index 75c276e7f7..d0cbd6b371 100644 --- a/tests/unit/apikey-policy-default-rate-limits.test.ts +++ b/tests/unit/apikey-policy-default-rate-limits.test.ts @@ -20,7 +20,7 @@ const LEGACY_DEFAULT = [ test.after(async () => { const coreDb = await import("../../src/lib/db/core.ts"); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/apikeypolicy-disable-non-public.test.ts b/tests/unit/apikeypolicy-disable-non-public.test.ts index 04a7ff9981..61a19ccaa3 100644 --- a/tests/unit/apikeypolicy-disable-non-public.test.ts +++ b/tests/unit/apikeypolicy-disable-non-public.test.ts @@ -45,7 +45,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -109,7 +109,7 @@ test.beforeEach(async () => { test.after(async () => { apiKeysDb.resetApiKeyState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/apikeypolicy-quota-only.test.ts b/tests/unit/apikeypolicy-quota-only.test.ts index 3c2641cb10..64387b7a01 100644 --- a/tests/unit/apikeypolicy-quota-only.test.ts +++ b/tests/unit/apikeypolicy-quota-only.test.ts @@ -49,7 +49,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -91,7 +91,7 @@ test.beforeEach(async () => { test.after(async () => { apiKeysDb.resetApiKeyState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/apikeys-allowed-quotas.test.ts b/tests/unit/apikeys-allowed-quotas.test.ts index 2f42565c40..9010aeda6b 100644 --- a/tests/unit/apikeys-allowed-quotas.test.ts +++ b/tests/unit/apikeys-allowed-quotas.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("allowedQuotas round-trips: create with pool IDs and read them back via getApiKeyMetadata", async () => { diff --git a/tests/unit/apikeys-disable-non-public.test.ts b/tests/unit/apikeys-disable-non-public.test.ts index e757eb0734..17fefed33f 100644 --- a/tests/unit/apikeys-disable-non-public.test.ts +++ b/tests/unit/apikeys-disable-non-public.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("disableNonPublicModels: set to true via updateApiKeyPermissions, read back via getApiKeyMetadata", async () => { diff --git a/tests/unit/apikeys-usage-command.test.ts b/tests/unit/apikeys-usage-command.test.ts index 479e9f6424..fe733d8213 100644 --- a/tests/unit/apikeys-usage-command.test.ts +++ b/tests/unit/apikeys-usage-command.test.ts @@ -14,7 +14,7 @@ const apiKeysDb = await import("../../src/lib/db/apiKeys.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("allowUsageCommand defaults to false for new API keys", async () => { diff --git a/tests/unit/assemble-standalone-onnxruntime-native-asset.test.ts b/tests/unit/assemble-standalone-onnxruntime-native-asset.test.ts index d39beb8127..63e623eb3b 100644 --- a/tests/unit/assemble-standalone-onnxruntime-native-asset.test.ts +++ b/tests/unit/assemble-standalone-onnxruntime-native-asset.test.ts @@ -60,6 +60,6 @@ test("syncStandaloneNativeAssets copies onnxruntime-node's libonnxruntime.so.1 i ); assert.ok(existsSync(destSo), "libonnxruntime.so.1 must be copied into the standalone bundle"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/attempt-logging-early-keepalive-merge.test.ts b/tests/unit/attempt-logging-early-keepalive-merge.test.ts index da9ef6fbfe..2c346b4e22 100644 --- a/tests/unit/attempt-logging-early-keepalive-merge.test.ts +++ b/tests/unit/attempt-logging-early-keepalive-merge.test.ts @@ -63,7 +63,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("bytes recorded before persistAttemptLogs are prepended into pipeline.streamChunks.client", async () => { diff --git a/tests/unit/audio-transcriptions-combo-resolution.test.ts b/tests/unit/audio-transcriptions-combo-resolution.test.ts index 15d7bfe4ea..84daa5a331 100644 --- a/tests/unit/audio-transcriptions-combo-resolution.test.ts +++ b/tests/unit/audio-transcriptions-combo-resolution.test.ts @@ -29,7 +29,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Minimal but structurally valid WAV so nothing rejects the upload shape. */ diff --git a/tests/unit/auggie-executor.test.ts b/tests/unit/auggie-executor.test.ts index b44c3ec94f..cf8bc07d31 100644 --- a/tests/unit/auggie-executor.test.ts +++ b/tests/unit/auggie-executor.test.ts @@ -39,7 +39,7 @@ async function readSseEvents(response: Response): Promise { - fs.rmSync(TMP_DIR, { recursive: true, force: true }); + fs.rmSync(TMP_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── buildAuggiePrompt ──────────────────────────────────────────────────── diff --git a/tests/unit/auth-anonymous-fallback-toggle.test.ts b/tests/unit/auth-anonymous-fallback-toggle.test.ts index 6795a24c97..9382f01645 100644 --- a/tests/unit/auth-anonymous-fallback-toggle.test.ts +++ b/tests/unit/auth-anonymous-fallback-toggle.test.ts @@ -33,7 +33,7 @@ const { updateSettings } = await import("../../src/lib/db/settings.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Set the opt-out list; pass null to remove the key entirely (absent setting). */ diff --git a/tests/unit/auth-antigravity-account-retry-v2.test.ts b/tests/unit/auth-antigravity-account-retry-v2.test.ts index 59aa1e3e71..e87f05eba8 100644 --- a/tests/unit/auth-antigravity-account-retry-v2.test.ts +++ b/tests/unit/auth-antigravity-account-retry-v2.test.ts @@ -23,13 +23,13 @@ function connectionId(connection: unknown): string { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("round-robin same-model retry treats multi-exclude as fallback LRU and skips all excluded accounts", async () => { diff --git a/tests/unit/auth-clear-account-error.test.ts b/tests/unit/auth-clear-account-error.test.ts index a303da4e7e..6bfd0b0dda 100644 --- a/tests/unit/auth-clear-account-error.test.ts +++ b/tests/unit/auth-clear-account-error.test.ts @@ -13,13 +13,13 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("clearAccountError clears stale provider error metadata after recovery", async () => { diff --git a/tests/unit/auth-clear-provider-routes.test.ts b/tests/unit/auth-clear-provider-routes.test.ts index a81b13c17d..ba536cc466 100644 --- a/tests/unit/auth-clear-provider-routes.test.ts +++ b/tests/unit/auth-clear-provider-routes.test.ts @@ -33,7 +33,7 @@ async function withEnv(name, value, fn) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -60,7 +60,7 @@ async function readConnection(id) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("moderations route clears stale provider error metadata on success", async () => { diff --git a/tests/unit/auth-disable-cooling-2997.test.ts b/tests/unit/auth-disable-cooling-2997.test.ts index 8c5dc95a57..30a6023903 100644 --- a/tests/unit/auth-disable-cooling-2997.test.ts +++ b/tests/unit/auth-disable-cooling-2997.test.ts @@ -13,13 +13,13 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // #2997 — Test 1: a recoverable error on a connection flagged disableCooling diff --git a/tests/unit/auth-login-route.test.ts b/tests/unit/auth-login-route.test.ts index b44f54a3fc..e309cafc56 100644 --- a/tests/unit/auth-login-route.test.ts +++ b/tests/unit/auth-login-route.test.ts @@ -19,7 +19,7 @@ const originalGetCookieStore = loginRoute.authRouteInternals.getCookieStore; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -37,7 +37,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; } else { diff --git a/tests/unit/auth-noauth-fallback-loop-3061.test.ts b/tests/unit/auth-noauth-fallback-loop-3061.test.ts index d640ffb1e2..68a70842af 100644 --- a/tests/unit/auth-noauth-fallback-loop-3061.test.ts +++ b/tests/unit/auth-noauth-fallback-loop-3061.test.ts @@ -31,7 +31,7 @@ const { getProviderCredentials } = await import("../../src/sse/services/auth.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Happy path preserved: first selection (nothing excluded) still works ── diff --git a/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts b/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts index 177989419d..83e589b7c9 100644 --- a/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts +++ b/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts @@ -22,7 +22,7 @@ const SUBSCRIPTION_403 = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ async function seedOllamaCloud() { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("per-model subscription 403 locks only the paid model, connection stays active", async () => { diff --git a/tests/unit/auth-opencode-zen-noauth-fallback.test.ts b/tests/unit/auth-opencode-zen-noauth-fallback.test.ts index 218e186bcb..8d747949f3 100644 --- a/tests/unit/auth-opencode-zen-noauth-fallback.test.ts +++ b/tests/unit/auth-opencode-zen-noauth-fallback.test.ts @@ -23,7 +23,7 @@ const { createProviderConnection } = await import("../../src/lib/db/providers.ts test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2962 opencode-zen with no connection falls back to anonymous no-auth credentials", async () => { diff --git a/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts b/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts index fe252cdf4a..3766604816 100644 --- a/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts +++ b/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts @@ -38,7 +38,7 @@ const INVALID_BEARER = "Bearer sk-invalid-key-that-does-not-exist-7785"; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function embeddingsRequest(): Request { diff --git a/tests/unit/auth-terminal-status.test.ts b/tests/unit/auth-terminal-status.test.ts index 28e36217c6..6be5ae2473 100644 --- a/tests/unit/auth-terminal-status.test.ts +++ b/tests/unit/auth-terminal-status.test.ts @@ -14,13 +14,13 @@ const accountFallback = await import("../../open-sse/services/accountFallback.ts async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getProviderCredentials skips credits_exhausted connections", async () => { diff --git a/tests/unit/authz/client-api-policy-fallback.test.ts b/tests/unit/authz/client-api-policy-fallback.test.ts index ddb7e34935..e749456eb8 100644 --- a/tests/unit/authz/client-api-policy-fallback.test.ts +++ b/tests/unit/authz/client-api-policy-fallback.test.ts @@ -65,7 +65,7 @@ test.after(() => { } catch { /* ignore */ } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/authz/client-api-policy.test.ts b/tests/unit/authz/client-api-policy.test.ts index 95613bad15..68cf3b0a25 100644 --- a/tests/unit/authz/client-api-policy.test.ts +++ b/tests/unit/authz/client-api-policy.test.ts @@ -21,7 +21,7 @@ const ORIGINAL_REQUIRE_API_KEY = process.env.REQUIRE_API_KEY; function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.OMNIROUTE_API_KEY; delete process.env.ROUTER_API_KEY; @@ -34,7 +34,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_OMNIROUTE_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY; else process.env.OMNIROUTE_API_KEY = ORIGINAL_OMNIROUTE_API_KEY; if (ORIGINAL_ROUTER_API_KEY === undefined) delete process.env.ROUTER_API_KEY; diff --git a/tests/unit/authz/ip-filter-enforcement-6131.test.ts b/tests/unit/authz/ip-filter-enforcement-6131.test.ts index da55ff11ff..d68ce86f7c 100644 --- a/tests/unit/authz/ip-filter-enforcement-6131.test.ts +++ b/tests/unit/authz/ip-filter-enforcement-6131.test.ts @@ -22,14 +22,14 @@ const ORIGINAL_STAMP_TOKEN = process.env.OMNIROUTE_PEER_STAMP_TOKEN; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_STAMP_TOKEN === undefined) delete process.env.OMNIROUTE_PEER_STAMP_TOKEN; else process.env.OMNIROUTE_PEER_STAMP_TOKEN = ORIGINAL_STAMP_TOKEN; }); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); ipFilter.resetIPFilter(); delete process.env.OMNIROUTE_PEER_STAMP_TOKEN; diff --git a/tests/unit/authz/management-policy.test.ts b/tests/unit/authz/management-policy.test.ts index 2e0e69a558..6e8feda318 100644 --- a/tests/unit/authz/management-policy.test.ts +++ b/tests/unit/authz/management-policy.test.ts @@ -24,7 +24,7 @@ const ORIGINAL_INITIAL = process.env.INITIAL_PASSWORD; function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; @@ -35,7 +35,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = ORIGINAL_JWT; if (ORIGINAL_INITIAL === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/authz/pipeline.test.ts b/tests/unit/authz/pipeline.test.ts index 6f6469e804..d89b152219 100644 --- a/tests/unit/authz/pipeline.test.ts +++ b/tests/unit/authz/pipeline.test.ts @@ -30,7 +30,7 @@ const ORIGINAL_OMNIROUTE_PEER_STAMP_TOKEN = process.env.OMNIROUTE_PEER_STAMP_TOK function resetEnvironment() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.JWT_SECRET = "pipeline-jwt-secret"; process.env.INITIAL_PASSWORD = "pipeline-initial-password"; @@ -67,7 +67,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = ORIGINAL_JWT; if (ORIGINAL_INITIAL === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/authz/probe-9033-repro.test.ts b/tests/unit/authz/probe-9033-repro.test.ts index 29e44ebde8..5582180dba 100644 --- a/tests/unit/authz/probe-9033-repro.test.ts +++ b/tests/unit/authz/probe-9033-repro.test.ts @@ -28,14 +28,14 @@ const ORIGINAL_STAMP_TOKEN = process.env.OMNIROUTE_PEER_STAMP_TOKEN; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_STAMP_TOKEN === undefined) delete process.env.OMNIROUTE_PEER_STAMP_TOKEN; else process.env.OMNIROUTE_PEER_STAMP_TOKEN = ORIGINAL_STAMP_TOKEN; }); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); ipFilter.resetIPFilter(); delete process.env.OMNIROUTE_PEER_STAMP_TOKEN; diff --git a/tests/unit/auto-candidate-overrides-7819.test.ts b/tests/unit/auto-candidate-overrides-7819.test.ts index 50b21f2839..3b5ce76b59 100644 --- a/tests/unit/auto-candidate-overrides-7819.test.ts +++ b/tests/unit/auto-candidate-overrides-7819.test.ts @@ -19,7 +19,7 @@ const overridesDb = await import("../../src/lib/db/autoCandidateOverrides.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/auto-candidate-overrides-regression-7819.test.ts b/tests/unit/auto-candidate-overrides-regression-7819.test.ts index ca1ba0c5ce..f36dc7a2e4 100644 --- a/tests/unit/auto-candidate-overrides-regression-7819.test.ts +++ b/tests/unit/auto-candidate-overrides-regression-7819.test.ts @@ -28,7 +28,7 @@ const virtualFactory = await import("../../open-sse/services/autoCombo/virtualFa async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/auto-combo-context-advertising.test.ts b/tests/unit/auto-combo-context-advertising.test.ts index 9e324c1766..cdac54d0a5 100644 --- a/tests/unit/auto-combo-context-advertising.test.ts +++ b/tests/unit/auto-combo-context-advertising.test.ts @@ -44,7 +44,7 @@ const combosAutoRoute = await import("../../src/app/api/combos/auto/route.ts"); test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/auto-combo-credentialed-model-pool.test.ts b/tests/unit/auto-combo-credentialed-model-pool.test.ts index fb39b0d7c5..daea5e672e 100644 --- a/tests/unit/auto-combo-credentialed-model-pool.test.ts +++ b/tests/unit/auto-combo-credentialed-model-pool.test.ts @@ -25,7 +25,7 @@ type LogicalCandidate = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/auto-combo-hidden-models-4558.test.ts b/tests/unit/auto-combo-hidden-models-4558.test.ts index 29439b2698..f66da030fd 100644 --- a/tests/unit/auto-combo-hidden-models-4558.test.ts +++ b/tests/unit/auto-combo-hidden-models-4558.test.ts @@ -42,7 +42,7 @@ before(() => { after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const PROVIDER = "openai"; diff --git a/tests/unit/auto-combos-enhanced-4235.test.ts b/tests/unit/auto-combos-enhanced-4235.test.ts index 262819c2d1..85a72992b8 100644 --- a/tests/unit/auto-combos-enhanced-4235.test.ts +++ b/tests/unit/auto-combos-enhanced-4235.test.ts @@ -24,7 +24,7 @@ const builtinCatalog = await import("../../open-sse/services/autoCombo/builtinCa function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4235 Phase A: README-advertised cheap/offline/smart are in the built-in catalog", () => { diff --git a/tests/unit/auto-combos-free-models-routes.test.ts b/tests/unit/auto-combos-free-models-routes.test.ts index ca7fa6772d..f32c081901 100644 --- a/tests/unit/auto-combos-free-models-routes.test.ts +++ b/tests/unit/auto-combos-free-models-routes.test.ts @@ -38,7 +38,7 @@ function makeRequest(url: string, apiKey?: string): Request { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/auto-combos-suffixes-4235.test.ts b/tests/unit/auto-combos-suffixes-4235.test.ts index 6a2eaad834..e09e7e9a46 100644 --- a/tests/unit/auto-combos-suffixes-4235.test.ts +++ b/tests/unit/auto-combos-suffixes-4235.test.ts @@ -22,14 +22,14 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(() => resetStorage()); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4235 parseAutoSuffix parses category and category:tier", () => { diff --git a/tests/unit/auto-custom-provider-5873.test.ts b/tests/unit/auto-custom-provider-5873.test.ts index 2dfbd9ae72..907bebd162 100644 --- a/tests/unit/auto-custom-provider-5873.test.ts +++ b/tests/unit/auto-custom-provider-5873.test.ts @@ -24,7 +24,7 @@ type VirtualComboResult = Awaited { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/auto-empty-pool-fastfail-6458.test.ts b/tests/unit/auto-empty-pool-fastfail-6458.test.ts index 4db304bab9..3c5e215144 100644 --- a/tests/unit/auto-empty-pool-fastfail-6458.test.ts +++ b/tests/unit/auto-empty-pool-fastfail-6458.test.ts @@ -19,7 +19,7 @@ const { resolveModelOrError } = await import("../../src/sse/handlers/chatHelpers test.beforeEach(() => core.resetDbInstance()); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6458 empty auto-combo pool returns a 503 instead of an empty combo", async () => { diff --git a/tests/unit/auto-keyless-custom-provider-11180.test.ts b/tests/unit/auto-keyless-custom-provider-11180.test.ts index c2e97e8158..c6070e4b0a 100644 --- a/tests/unit/auto-keyless-custom-provider-11180.test.ts +++ b/tests/unit/auto-keyless-custom-provider-11180.test.ts @@ -28,7 +28,7 @@ type VirtualComboResult = Awaited { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/auto-routing-analytics-db.test.ts b/tests/unit/auto-routing-analytics-db.test.ts index 8216f535f3..55dac3ed6d 100644 --- a/tests/unit/auto-routing-analytics-db.test.ts +++ b/tests/unit/auto-routing-analytics-db.test.ts @@ -17,7 +17,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/auto-update.test.ts b/tests/unit/auto-update.test.ts index 55112bae62..4b14e209e3 100644 --- a/tests/unit/auto-update.test.ts +++ b/tests/unit/auto-update.test.ts @@ -396,7 +396,7 @@ test("launchAutoUpdate returns validation failures and starts detached update sc assert.equal(spawnCalls[0].unrefCalled, true); assert.match(spawnCalls[0].args[1], /git cherry-pick --keep-redundant-commits 'abc123'/); } finally { - fs.rmSync(tempRoot, { recursive: true, force: true }); + fs.rmSync(tempRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -419,6 +419,6 @@ test("resolveProjectRoot walks up from start dir to nearest package.json or .git const lonelyResult = autoUpdate.resolveProjectRoot("/my-fallback", lonely); assert.equal(lonelyResult, "/my-fallback"); } finally { - fs.rmSync(tempRoot, { recursive: true, force: true }); + fs.rmSync(tempRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/autoCombo/provider-family-combos.test.ts b/tests/unit/autoCombo/provider-family-combos.test.ts index 45ff7eec94..bdb492e6a3 100644 --- a/tests/unit/autoCombo/provider-family-combos.test.ts +++ b/tests/unit/autoCombo/provider-family-combos.test.ts @@ -34,7 +34,7 @@ const builtinCatalog = await import("../../../open-sse/services/autoCombo/builti async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ beforeEach(async () => { afterAll(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/bai-provider.test.ts b/tests/unit/bai-provider.test.ts index 3669d53998..abb91d31e2 100644 --- a/tests/unit/bai-provider.test.ts +++ b/tests/unit/bai-provider.test.ts @@ -72,13 +72,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/batch-file-download.test.ts b/tests/unit/batch-file-download.test.ts index 00c5288a18..5cc891cb43 100644 --- a/tests/unit/batch-file-download.test.ts +++ b/tests/unit/batch-file-download.test.ts @@ -23,7 +23,7 @@ const fileContentRoute = await import("../../src/app/api/files/[id]/content/rout async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helper: create a real file in the DB ─────────────────────────────────── diff --git a/tests/unit/batch-processor.test.ts b/tests/unit/batch-processor.test.ts index b96df59ffb..243fa6f904 100644 --- a/tests/unit/batch-processor.test.ts +++ b/tests/unit/batch-processor.test.ts @@ -35,7 +35,7 @@ async function reset() { // Clean up the temp DB directory if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { await reset(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/bedrock-image-log-redaction-7297.test.ts b/tests/unit/bedrock-image-log-redaction-7297.test.ts index 074301e233..ad1b89942a 100644 --- a/tests/unit/bedrock-image-log-redaction-7297.test.ts +++ b/tests/unit/bedrock-image-log-redaction-7297.test.ts @@ -14,7 +14,7 @@ const bedrockExecutor = await import("../../open-sse/executors/bedrock.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function bedrockConverseBodyWithImages(nImages: number, imageBytes: number) { diff --git a/tests/unit/binaryManager.test.ts b/tests/unit/binaryManager.test.ts index 4165a326c7..8009065c6a 100644 --- a/tests/unit/binaryManager.test.ts +++ b/tests/unit/binaryManager.test.ts @@ -11,13 +11,13 @@ process.env.DATA_DIR = tmpDir; afterEach(() => { const binDir = path.join(tmpDir, "bin"); try { - if (fs.existsSync(binDir)) fs.rmSync(binDir, { recursive: true, force: true }); + if (fs.existsSync(binDir)) fs.rmSync(binDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); after(() => { process.env.DATA_DIR = originalDataDir; - if (fs.existsSync(tmpDir)) fs.rmSync(tmpDir, { recursive: true, force: true }); + if (fs.existsSync(tmpDir)) fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("binaryManager", () => { diff --git a/tests/unit/bootstrap-env.test.ts b/tests/unit/bootstrap-env.test.ts index cc997c6e2a..f72a5d9b83 100644 --- a/tests/unit/bootstrap-env.test.ts +++ b/tests/unit/bootstrap-env.test.ts @@ -48,7 +48,7 @@ function withTempEnv(fn) { for (const [key, value] of Object.entries(originalEnv)) { process.env[key] = value; } - fs.rmSync(tempRoot, { recursive: true, force: true }); + fs.rmSync(tempRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/bug-9204-agy-provider-alias-credentials.test.ts b/tests/unit/bug-9204-agy-provider-alias-credentials.test.ts index e45d020e66..88157b06cf 100644 --- a/tests/unit/bug-9204-agy-provider-alias-credentials.test.ts +++ b/tests/unit/bug-9204-agy-provider-alias-credentials.test.ts @@ -16,7 +16,7 @@ const { getProviderCredentials } = await import("../../src/sse/services/auth.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9204: an Antigravity CLI login is eligible for an agy model request", async () => { diff --git a/tests/unit/bug-9204-agy-reimport-reactivates.test.ts b/tests/unit/bug-9204-agy-reimport-reactivates.test.ts index b57538663a..b9c6b1abe0 100644 --- a/tests/unit/bug-9204-agy-reimport-reactivates.test.ts +++ b/tests/unit/bug-9204-agy-reimport-reactivates.test.ts @@ -15,7 +15,7 @@ const { createConnectionFromAgyToken } = await import( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9204: reimporting an inactive Antigravity CLI account reactivates it", async () => { diff --git a/tests/unit/build-next-isolated-windows-home-2402.test.ts b/tests/unit/build-next-isolated-windows-home-2402.test.ts index 7c52ae7325..5c4e7cb714 100644 --- a/tests/unit/build-next-isolated-windows-home-2402.test.ts +++ b/tests/unit/build-next-isolated-windows-home-2402.test.ts @@ -88,6 +88,6 @@ test("ensureWindowsBuildProfileDirs creates the isolated AppData directories", a assert.equal(fsSync.existsSync(env.APPDATA), true); assert.equal(fsSync.existsSync(env.LOCALAPPDATA), true); } finally { - await fs.rm(tempDir, { recursive: true, force: true }); + await fs.rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build-next-isolated.test.ts b/tests/unit/build-next-isolated.test.ts index 13b2f8598c..90e77fa801 100644 --- a/tests/unit/build-next-isolated.test.ts +++ b/tests/unit/build-next-isolated.test.ts @@ -20,7 +20,7 @@ async function withTempDir(fn) { try { await fn(tempDir); } finally { - await fs.rm(tempDir, { recursive: true, force: true }); + await fs.rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build-sha-provenance-10427.test.ts b/tests/unit/build-sha-provenance-10427.test.ts index e7b3afb675..2b4c562338 100644 --- a/tests/unit/build-sha-provenance-10427.test.ts +++ b/tests/unit/build-sha-provenance-10427.test.ts @@ -92,7 +92,7 @@ test("P6: readBuildSha returns the trimmed sentinel, or empty when absent", asyn fs.writeFileSync(path.join(repo, "dist", "BUILD_SHA"), "e05ac345da\n"); assert.equal(readBuildSha(repo), "e05ac345da"); } finally { - fs.rmSync(repo, { recursive: true, force: true }); + fs.rmSync(repo, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/assemble-standalone.test.ts b/tests/unit/build/assemble-standalone.test.ts index 14a8de854b..5894c3d82b 100644 --- a/tests/unit/build/assemble-standalone.test.ts +++ b/tests/unit/build/assemble-standalone.test.ts @@ -96,7 +96,7 @@ test("assembleStandalone copies standalone + static + public + sidecars into out "static is NOT placed under a literal .next (would 404 against distDir server)" ); assert.ok(fs.existsSync(path.join(outDir, "public/logo.svg")), "public copied"); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("patchTurbopackChunks restores canonical external package names in a custom distDir", () => { @@ -116,7 +116,7 @@ test("patchTurbopackChunks restores canonical external package names in a custom assert.match(patched, /require\("ws"\)/); assert.match(patched, /require\("@ngrok\/ngrok"\)/); assert.doesNotMatch(patched, /-[0-9a-f]{16}/); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Drift guard: the async path (syncStandaloneNativeAssets / syncStandaloneExtraModules, @@ -173,7 +173,7 @@ test("async and sync sidecar copy paths produce identical bundle trees", async ( ]) { assert.ok(asyncTree.includes(sqlJsFile), `sql.js runtime file copied: ${sqlJsFile}`); } - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the TPROXY addon source is skipped gracefully when it was not built (non-Linux)", async () => { @@ -189,7 +189,7 @@ test("the TPROXY addon source is skipped gracefully when it was not built (non-L !fs.existsSync(path.join(out, "src/mitm/tproxy/native/build/Release/transparent.node")), "absent addon is simply not copied (graceful skip)" ); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression guard (#deploy 2026-07-11): server-ws.mjs gained an import of @@ -214,7 +214,7 @@ test("every relative import of standalone-server-ws.mjs is shipped into the bund `server-ws.mjs imports ./${imp} but EXTRA_MODULE_ENTRIES does not ship it — the bundle would crash at boot (ERR_MODULE_NOT_FOUND)` ); } - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression guard (deploy 2026-08-19): under heavy concurrent build I/O the bulk @@ -287,5 +287,5 @@ test("copy passes tolerate a dest that already resolves to src, or a stale-typed "sql.js content reachable through the pre-existing symlink" ); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/build/build-tool-runner-win-shim.test.ts b/tests/unit/build/build-tool-runner-win-shim.test.ts index ffc406bc4c..d1f3a06444 100644 --- a/tests/unit/build/build-tool-runner-win-shim.test.ts +++ b/tests/unit/build/build-tool-runner-win-shim.test.ts @@ -124,7 +124,7 @@ test("resolveLocalBinEntry reads the package's own bin map, never node_modules/. "the resolved entry must bypass the platform-specific .bin shim" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -145,7 +145,7 @@ test("resolveLocalBinEntry returns null for a missing package or a missing entry "an advertised entry that is not on disk must not be spawned" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -164,7 +164,7 @@ test("isNativeExecutable distinguishes an executable image from a JS shim", () = assert.equal(isNativeExecutable(pe), true); assert.equal(isNativeExecutable(join(root, "absent")), false, "a missing file is not native"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -186,7 +186,7 @@ test("runBuildTool actually runs esbuild from this repo's dependency tree", () = assert.match(readFileSync(dest, "utf8"), /42/, "esbuild produced the bundle"); } finally { - rmSync(out, { recursive: true, force: true }); + rmSync(out, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/check-bundle-size.test.ts b/tests/unit/build/check-bundle-size.test.ts index 35b9f63884..a6924ef6a0 100644 --- a/tests/unit/build/check-bundle-size.test.ts +++ b/tests/unit/build/check-bundle-size.test.ts @@ -196,7 +196,7 @@ function withTmpBundleBaseline(content: string | null, fn: (p: string) => void) try { fn(p); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build/check-secrets.test.ts b/tests/unit/build/check-secrets.test.ts index 9b5ce23f71..51987e8d43 100644 --- a/tests/unit/build/check-secrets.test.ts +++ b/tests/unit/build/check-secrets.test.ts @@ -298,7 +298,7 @@ function withTmpBaseline(content: string | null, fn: (p: string) => void) { try { fn(p); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build/check-test-runner-api.test.ts b/tests/unit/build/check-test-runner-api.test.ts index 37dd15a3d1..a938dc6d3f 100644 --- a/tests/unit/build/check-test-runner-api.test.ts +++ b/tests/unit/build/check-test-runner-api.test.ts @@ -21,7 +21,7 @@ test("flags a vitest-only-dir test that imports node:test", () => { assert.equal(bad.length, 1); assert.match(bad[0].file.replace(/\\/g, "/"), /autoCombo\/bad\.test\.ts$/); assert.match(bad[0].reason, /vitest-only/); - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("accepts a vitest-only-dir test that imports vitest", () => { @@ -31,7 +31,7 @@ test("accepts a vitest-only-dir test that imports vitest", () => { `import { describe, it } from "vitest";\ndescribe("x", () => it("y", () => {}));\n` ); assert.equal(findRunnerMismatches(root).length, 0); - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("flags node:test imports in the Vitest-only config roots", () => { @@ -52,5 +52,5 @@ test("flags node:test imports in the Vitest-only config roots", () => { } assert.equal(findRunnerMismatches(root).length, dirs.length); - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/build/check-vuln-ratchet.test.ts b/tests/unit/build/check-vuln-ratchet.test.ts index 11a8b66fbd..0d7728c852 100644 --- a/tests/unit/build/check-vuln-ratchet.test.ts +++ b/tests/unit/build/check-vuln-ratchet.test.ts @@ -358,7 +358,7 @@ function withTmpBaseline(content: string | null, fn: (p: string) => void) { try { fn(p); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build/check-workflows.test.ts b/tests/unit/build/check-workflows.test.ts index 3018b68600..fea3f3476e 100644 --- a/tests/unit/build/check-workflows.test.ts +++ b/tests/unit/build/check-workflows.test.ts @@ -179,7 +179,7 @@ test("collectWorkflowFiles: returns .yml files from directory", () => { assert.ok(files.some((f) => f.endsWith("deploy.yml"))); assert.ok(!files.some((f) => f.endsWith("README.md"))); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -194,7 +194,7 @@ test("collectWorkflowFiles: also collects .yaml extension", () => { assert.ok(files.some((f) => f.endsWith(".yaml"))); assert.ok(files.some((f) => f.endsWith(".yml"))); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -206,7 +206,7 @@ test("collectWorkflowFiles: returns absolute paths", () => { assert.equal(files.length, 1); assert.ok(path.isAbsolute(files[0])); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -216,7 +216,7 @@ test("collectWorkflowFiles: empty directory returns empty array", () => { const files = collectWorkflowFiles(dir); assert.deepEqual(files, []); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -282,7 +282,7 @@ function withTmpBaseline(content: string | null, fn: (p: string) => void) { try { fn(p); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build/colocate-standalone-esm-scope.test.ts b/tests/unit/build/colocate-standalone-esm-scope.test.ts index d31772d11a..0969dd4a24 100644 --- a/tests/unit/build/colocate-standalone-esm-scope.test.ts +++ b/tests/unit/build/colocate-standalone-esm-scope.test.ts @@ -35,7 +35,7 @@ test("writeEsmWorkerScopes writes a scoped type:module beside each worker", () = assert.equal(pkg.type, "module", `${dir} declares type:module`); } } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -57,7 +57,7 @@ test("writeEsmWorkerScopes never touches the standalone root package.json", () = "root package.json stays type-less so server.js is parsed as CommonJS" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -75,7 +75,7 @@ test("writeEsmWorkerScopes is no-clobber: it leaves an existing package.json int const pkg = JSON.parse(readFileSync(join(workerDir, "package.json"), "utf8")); assert.equal(pkg.version, "9.9.9", "the traced manifest is preserved verbatim"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -124,7 +124,7 @@ test("scoped layout runs a CJS server.js and an ESM worker.js side by side", () ); assert.ok(existsSync(join(workerDir, "package.json")), "worker scope package.json exists"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -141,6 +141,6 @@ test("colocate-standalone bundles the required compression worker", () => { assert.equal(existsSync(join(workerDir, "compressionWorker.js")), true); assert.equal(JSON.parse(readFileSync(join(workerDir, "package.json"), "utf8")).type, "module"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts b/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts index ab382c6a83..029a5f5ca5 100644 --- a/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts +++ b/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts @@ -62,6 +62,6 @@ test("MCP server bundle has no top-level static import of ioredis", () => { "expected the existing lazy dynamic import of ioredis to remain in the bundle" ); } finally { - rmSync(outDir, { recursive: true, force: true }); + rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/mcp-bundle-startup.test.ts b/tests/unit/build/mcp-bundle-startup.test.ts index a441631f9a..8ed6853f23 100644 --- a/tests/unit/build/mcp-bundle-startup.test.ts +++ b/tests/unit/build/mcp-bundle-startup.test.ts @@ -55,6 +55,6 @@ test("MCP server bundle imports successfully on Node 24", () => { }); }, "the generated MCP bundle must be importable by the supported Node runtime"); } finally { - rmSync(outDir, { recursive: true, force: true }); + rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/mitm-server-bundle-contents.test.ts b/tests/unit/build/mitm-server-bundle-contents.test.ts index 9253c23cbc..9bd14e27a5 100644 --- a/tests/unit/build/mitm-server-bundle-contents.test.ts +++ b/tests/unit/build/mitm-server-bundle-contents.test.ts @@ -31,7 +31,7 @@ test("EXTRA_MODULE_ENTRIES ships every relative require() of MITM server.cjs (#9 ); } } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -69,6 +69,6 @@ test("EXTRA_MODULE_ENTRIES ships every dynamic import() of MITM _internal shims ); } } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/optional-pack-installer.test.ts b/tests/unit/build/optional-pack-installer.test.ts index 2b6fdc69e9..5e7139511b 100644 --- a/tests/unit/build/optional-pack-installer.test.ts +++ b/tests/unit/build/optional-pack-installer.test.ts @@ -188,7 +188,7 @@ test("installPack accepts tarball payloads (the desktop release asset layout)", stdio: "pipe", }); assert.equal(tarred.status, 0, "fixture tarball creation must succeed"); - fs.rmSync(packDir, { recursive: true, force: true }); // only the tarball remains + fs.rmSync(packDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); // only the tarball remains const source = resolvePackSource(pack.name, sourceDir, dataDir); assert.equal(source.kind, "tarball"); diff --git a/tests/unit/build/repair-empty-external-package-dirs-nested.test.ts b/tests/unit/build/repair-empty-external-package-dirs-nested.test.ts index 50af15cadc..3cee6dd6f3 100644 --- a/tests/unit/build/repair-empty-external-package-dirs-nested.test.ts +++ b/tests/unit/build/repair-empty-external-package-dirs-nested.test.ts @@ -51,5 +51,5 @@ test("assembleStandalone repairs a hollow externalized package dir in the nested "hollow nested externalized package dir must be repaired with the real source package (index.js present)" ); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/build/should-promote-latest-5301.test.ts b/tests/unit/build/should-promote-latest-5301.test.ts index 61d6793ef8..84341be300 100644 --- a/tests/unit/build/should-promote-latest-5301.test.ts +++ b/tests/unit/build/should-promote-latest-5301.test.ts @@ -62,7 +62,7 @@ function shouldPromote(version: string, tags: string[]): string { }).trim(); } finally { closeSync(fd); - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/build/standalone-bundle.test.ts b/tests/unit/build/standalone-bundle.test.ts index 2444469202..1c8291e443 100644 --- a/tests/unit/build/standalone-bundle.test.ts +++ b/tests/unit/build/standalone-bundle.test.ts @@ -127,9 +127,9 @@ test("pack → restore roundtrip restores the tree byte-for-byte", async () => { ); } } finally { - fs.rmSync(src, { recursive: true, force: true }); - fs.rmSync(path.dirname(out), { recursive: true, force: true }); - fs.rmSync(dst, { recursive: true, force: true }); + fs.rmSync(src, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(path.dirname(out), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(dst, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -144,8 +144,8 @@ test("packing is byte-deterministic across runs", async () => { await runPack({ dir: src, out: b }); assert.equal(sha256File(a), sha256File(b), "two packs of the same tree must be identical"); } finally { - fs.rmSync(src, { recursive: true, force: true }); - fs.rmSync(outDir, { recursive: true, force: true }); + fs.rmSync(src, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -161,8 +161,8 @@ test("restore rejects a corrupted archive before extraction", async () => { fs.writeFileSync(out, raw); await assert.rejects(() => runRestore({ archive: out, dir: path.join(outDir, "dst") }), /sha/); } finally { - fs.rmSync(src, { recursive: true, force: true }); - fs.rmSync(outDir, { recursive: true, force: true }); + fs.rmSync(src, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -191,9 +191,9 @@ test("manifest verification flags modified and smuggled files in a restored tree `smuggled file detected: ${verdict.errors.join("; ")}` ); } finally { - fs.rmSync(src, { recursive: true, force: true }); - fs.rmSync(outDir, { recursive: true, force: true }); - fs.rmSync(dst, { recursive: true, force: true }); + fs.rmSync(src, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(dst, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -207,7 +207,7 @@ test("manifest verification rejects an unsupported manifest version", async () = assert.equal(verdict.ok, false); assert.match(verdict.errors[0] ?? "", /unsupported manifest version/); } finally { - fs.rmSync(dst, { recursive: true, force: true }); + fs.rmSync(dst, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -257,8 +257,8 @@ test("hydratePlatformNatives swaps install-machine-forked packages for this leg" "fsevents dropped on non-matching leg" ); } finally { - fs.rmSync(standalone, { recursive: true, force: true }); - fs.rmSync(source, { recursive: true, force: true }); + fs.rmSync(standalone, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(source, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -299,6 +299,6 @@ test("verifyBundledNatives asserts serviceability and honors the onnx darwin-x64 `darwin-x64 must pass via exemption: ${(exempted as { errors?: string[] }).errors?.join("; ")}` ); } finally { - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/build/sync-changelog-i18n.test.ts b/tests/unit/build/sync-changelog-i18n.test.ts index 14eb8247b0..cc00973b40 100644 --- a/tests/unit/build/sync-changelog-i18n.test.ts +++ b/tests/unit/build/sync-changelog-i18n.test.ts @@ -28,7 +28,7 @@ test("replaces the version section in every mirror with the root section", () => const fr = fs.readFileSync(path.join(root, "docs/i18n/fr/CHANGELOG.md"), "utf8"); assert.match(fr, /big new thing/); assert.doesNotMatch(fr, /_stub_/); - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("inserts the section when a mirror lacks it", () => { @@ -43,5 +43,5 @@ test("inserts the section when a mirror lacks it", () => { const fr = fs.readFileSync(path.join(root, "docs/i18n/fr/CHANGELOG.md"), "utf8"); assert.match(fr, /## \[9\.9\.9\]/); assert.match(fr, /big new thing/); - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts b/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts index 27927316e1..4a3b32b235 100644 --- a/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts +++ b/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts @@ -37,7 +37,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("bulk-add appends N+M connections and preserves the existing connection's state (the #2587 fix)", async () => { diff --git a/tests/unit/cache-config-route-8219.test.ts b/tests/unit/cache-config-route-8219.test.ts index 8fc0030972..4e71d4d0b2 100644 --- a/tests/unit/cache-config-route-8219.test.ts +++ b/tests/unit/cache-config-route-8219.test.ts @@ -21,7 +21,7 @@ const core = await import("../../src/lib/db/core.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/call-log-artifact-worker.test.ts b/tests/unit/call-log-artifact-worker.test.ts index 948a3fd110..84cd2c241a 100644 --- a/tests/unit/call-log-artifact-worker.test.ts +++ b/tests/unit/call-log-artifact-worker.test.ts @@ -12,7 +12,7 @@ const { writeCallArtifactAsync, closeCallLogArtifactWriter, resolveCallLogArtifa test.after(async () => { await closeCallLogArtifactWriter(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function buildArtifact(id: string) { @@ -120,7 +120,7 @@ test("worker resolution covers npm, standalone, source, and missing layouts", () } ); } finally { - fs.rmSync(layoutRoot, { recursive: true, force: true }); + fs.rmSync(layoutRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } const resolved = resolveCallLogArtifactWorker(); diff --git a/tests/unit/call-log-cap.test.ts b/tests/unit/call-log-cap.test.ts index e1cbd7e958..484ac0e92e 100644 --- a/tests/unit/call-log-cap.test.ts +++ b/tests/unit/call-log-cap.test.ts @@ -21,7 +21,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -88,7 +88,7 @@ test.beforeEach(async () => { test.after(() => { restorePipelineEnv(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("saveCallLog stores only summary metadata in SQLite and writes detailed artifact", async () => { diff --git a/tests/unit/call-log-file-rotation.test.ts b/tests/unit/call-log-file-rotation.test.ts index 06fe48aa11..4b5e30d3a6 100644 --- a/tests/unit/call-log-file-rotation.test.ts +++ b/tests/unit/call-log-file-rotation.test.ts @@ -33,7 +33,7 @@ async function resetTestDataDir() { if (/^storage\.sqlite(?:-shm|-wal)?$/i.test(entry)) { continue; } - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } const db = core.getDbInstance(); db.prepare("DELETE FROM call_logs").run(); @@ -121,7 +121,7 @@ test.after(async () => { test("call log file rotation honors both retention days and file count", () => { assert.ok(CALL_LOGS_DIR, "CALL_LOGS_DIR should resolve for test data dir"); - fs.rmSync(CALL_LOGS_DIR, { recursive: true, force: true }); + fs.rmSync(CALL_LOGS_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(CALL_LOGS_DIR, { recursive: true }); const now = Date.now(); @@ -235,7 +235,7 @@ test("rotateCallLogs swallows filesystem errors during cleanup", () => { test("cleanupOverflowCallLogFiles ignores rmSync failures for old artifacts", () => { assert.ok(CALL_LOGS_DIR, "CALL_LOGS_DIR should resolve for test data dir"); - fs.rmSync(CALL_LOGS_DIR, { recursive: true, force: true }); + fs.rmSync(CALL_LOGS_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(CALL_LOGS_DIR, { recursive: true }); const dayDir = path.join(CALL_LOGS_DIR, "2026-04-02"); diff --git a/tests/unit/call-log-oom-unbounded-5618.test.ts b/tests/unit/call-log-oom-unbounded-5618.test.ts index 49d52be057..d6551378f7 100644 --- a/tests/unit/call-log-oom-unbounded-5618.test.ts +++ b/tests/unit/call-log-oom-unbounded-5618.test.ts @@ -65,13 +65,13 @@ const unboundedSelectsOnCallLogs = (sqls: string[]) => test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5618 collectReferencedArtifacts pages with LIMIT and collects across pages — no unbounded .all()", () => { diff --git a/tests/unit/call-log-provider-display.test.ts b/tests/unit/call-log-provider-display.test.ts index 4b1e9ee4ce..e81a28d197 100644 --- a/tests/unit/call-log-provider-display.test.ts +++ b/tests/unit/call-log-provider-display.test.ts @@ -33,7 +33,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getCallLogs and getCallLogById expose providerDisplay from provider node name", async () => { diff --git a/tests/unit/call-log-save-drain.test.ts b/tests/unit/call-log-save-drain.test.ts index 6371d2785d..ba5c5b846c 100644 --- a/tests/unit/call-log-save-drain.test.ts +++ b/tests/unit/call-log-save-drain.test.ts @@ -17,7 +17,7 @@ const artifactWriter = await import("../../src/lib/usage/callLogArtifactWriter.t test.after(async () => { await artifactWriter.closeCallLogArtifactWriter(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("call-log drain waits for artifact metadata and summary commit", async () => { diff --git a/tests/unit/call-log-startup.test.ts b/tests/unit/call-log-startup.test.ts index 9d556f7a87..67063a07f8 100644 --- a/tests/unit/call-log-startup.test.ts +++ b/tests/unit/call-log-startup.test.ts @@ -13,7 +13,7 @@ async function removeTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: any) { lastError = error; diff --git a/tests/unit/call-log-stream-debug.test.ts b/tests/unit/call-log-stream-debug.test.ts index 33d3978f74..6af3e46f32 100644 --- a/tests/unit/call-log-stream-debug.test.ts +++ b/tests/unit/call-log-stream-debug.test.ts @@ -13,7 +13,7 @@ const callLogs = await import("../../src/lib/usage/callLogs.ts"); async function resetStorage() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -24,7 +24,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("saveCallLog preserves streamChunks in pipeline payloads", async () => { diff --git a/tests/unit/call-log-trim-sql-vars-5217.test.ts b/tests/unit/call-log-trim-sql-vars-5217.test.ts index 7f7dab57aa..46963977ef 100644 --- a/tests/unit/call-log-trim-sql-vars-5217.test.ts +++ b/tests/unit/call-log-trim-sql-vars-5217.test.ts @@ -37,13 +37,13 @@ function insertCallLog(id: string, timestamp: string) { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("trimCallLogsToMaxRows deletes >999 rows in one pass without 'too many SQL variables'", () => { diff --git a/tests/unit/call-logs-correlation-substring.test.ts b/tests/unit/call-logs-correlation-substring.test.ts index c5fe01a53e..277dbf0ddf 100644 --- a/tests/unit/call-logs-correlation-substring.test.ts +++ b/tests/unit/call-logs-correlation-substring.test.ts @@ -12,7 +12,7 @@ const callLogs = await import("../../src/lib/usage/callLogs.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Seed test data diff --git a/tests/unit/call-logs-exclude-tests-allowlist.test.ts b/tests/unit/call-logs-exclude-tests-allowlist.test.ts index 78aa5728af..cec5b07d4d 100644 --- a/tests/unit/call-logs-exclude-tests-allowlist.test.ts +++ b/tests/unit/call-logs-exclude-tests-allowlist.test.ts @@ -51,13 +51,13 @@ function insertCallLog(row: SeedRow) { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("excludeTests keeps only /v1 and /api/v1 inference rows, drops all backend/management rows", async () => { diff --git a/tests/unit/call-logs-pagination.test.ts b/tests/unit/call-logs-pagination.test.ts index 99835b08f1..41559a6434 100644 --- a/tests/unit/call-logs-pagination.test.ts +++ b/tests/unit/call-logs-pagination.test.ts @@ -70,7 +70,7 @@ function insertCallLog(row: Record) { test.before(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Seed 25 rows with strictly increasing timestamps (id N -> minute N). for (let i = 0; i < 25; i++) { @@ -81,7 +81,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2565: getCallLogs honors limit and returns newest-first", async () => { diff --git a/tests/unit/call-logs-requested-model.test.ts b/tests/unit/call-logs-requested-model.test.ts index 745854ad32..bf89c1183a 100644 --- a/tests/unit/call-logs-requested-model.test.ts +++ b/tests/unit/call-logs-requested-model.test.ts @@ -13,7 +13,7 @@ const providers = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("call logs persist requestedModel and allow filtering by requested model", async () => { diff --git a/tests/unit/call-logs-session-tag.test.ts b/tests/unit/call-logs-session-tag.test.ts index 4e466af1f2..3fb92e035a 100644 --- a/tests/unit/call-logs-session-tag.test.ts +++ b/tests/unit/call-logs-session-tag.test.ts @@ -15,7 +15,7 @@ const callLogs = await import("../../src/lib/usage/callLogs.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("saveCallLog persists sessionTag when explicitly supplied", async () => { diff --git a/tests/unit/capture-critical-db-state.test.ts b/tests/unit/capture-critical-db-state.test.ts index 6ded65793e..4f8a2ecbff 100644 --- a/tests/unit/capture-critical-db-state.test.ts +++ b/tests/unit/capture-critical-db-state.test.ts @@ -37,7 +37,7 @@ after(() => { delete process.env.DATA_DIR; } try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore cleanup errors } diff --git a/tests/unit/catalog-auto-routing-disabled-10831.test.ts b/tests/unit/catalog-auto-routing-disabled-10831.test.ts index f2f96ef95f..cd40b633c3 100644 --- a/tests/unit/catalog-auto-routing-disabled-10831.test.ts +++ b/tests/unit/catalog-auto-routing-disabled-10831.test.ts @@ -40,7 +40,7 @@ const isAutoId = (m: { id: string }) => m.id.startsWith("auto/"); test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best-effort */ } diff --git a/tests/unit/catalog-hide-auto-no-think.test.ts b/tests/unit/catalog-hide-auto-no-think.test.ts index c0db3cffa7..8983f30198 100644 --- a/tests/unit/catalog-hide-auto-no-think.test.ts +++ b/tests/unit/catalog-hide-auto-no-think.test.ts @@ -33,7 +33,7 @@ async function fetchCatalog(): Promise> { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best-effort */ } diff --git a/tests/unit/catalog-order-contract.test.ts b/tests/unit/catalog-order-contract.test.ts index e1c5c0248b..b246841e83 100644 --- a/tests/unit/catalog-order-contract.test.ts +++ b/tests/unit/catalog-order-contract.test.ts @@ -29,7 +29,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function seedConnection(provider: string, overrides: Record = {}) { diff --git a/tests/unit/cc-compatible-model-catalog.test.ts b/tests/unit/cc-compatible-model-catalog.test.ts index 8453abed62..54fc490771 100644 --- a/tests/unit/cc-compatible-model-catalog.test.ts +++ b/tests/unit/cc-compatible-model-catalog.test.ts @@ -13,7 +13,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.afterEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 models exposes CC-compatible fallback models under the provider node prefix", async () => { diff --git a/tests/unit/cc-compatible-provider.test.ts b/tests/unit/cc-compatible-provider.test.ts index 751e21e9f9..3b7fff1d86 100644 --- a/tests/unit/cc-compatible-provider.test.ts +++ b/tests/unit/cc-compatible-provider.test.ts @@ -34,7 +34,7 @@ const originalAllowLocalProviderUrls = process.env.OMNIROUTE_ALLOW_LOCAL_PROVIDE async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -76,7 +76,7 @@ test.after(() => { process.env.OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS = originalAllowLocalProviderUrls; } core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("buildClaudeCodeCompatibleRequest keeps prior role history while dropping trailing assistant prefill", () => { diff --git a/tests/unit/cc-discovery-alias-api.test.ts b/tests/unit/cc-discovery-alias-api.test.ts index 9f466eeed2..3e03adbe5d 100644 --- a/tests/unit/cc-discovery-alias-api.test.ts +++ b/tests/unit/cc-discovery-alias-api.test.ts @@ -14,7 +14,7 @@ const route = await import("../../src/app/api/providers/[id]/cc-alias/route.ts") function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -41,7 +41,7 @@ describe("PUT/GET /api/providers/[id]/cc-alias", () => { after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.REQUIRE_API_KEY; }); diff --git a/tests/unit/cc-discovery-aliases-gate.test.ts b/tests/unit/cc-discovery-aliases-gate.test.ts index 74e26ad653..5c4e9c67f7 100644 --- a/tests/unit/cc-discovery-aliases-gate.test.ts +++ b/tests/unit/cc-discovery-aliases-gate.test.ts @@ -24,7 +24,7 @@ const { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -95,7 +95,7 @@ describe("ccDiscoveryAliases storage", () => { after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("getCcAliasProviderSetting returns null when unset", () => { @@ -171,7 +171,7 @@ describe("global CC alias state (env / DB / default)", () => { after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.EXPOSE_CC_DISCOVERY_ALIASES; }); diff --git a/tests/unit/cc-discovery-metrics.test.ts b/tests/unit/cc-discovery-metrics.test.ts index 166ae74a79..5d39e0a1cd 100644 --- a/tests/unit/cc-discovery-metrics.test.ts +++ b/tests/unit/cc-discovery-metrics.test.ts @@ -17,7 +17,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/changelog-fragments.test.ts b/tests/unit/changelog-fragments.test.ts index 6be69c0a4d..a64d3c7ff7 100644 --- a/tests/unit/changelog-fragments.test.ts +++ b/tests/unit/changelog-fragments.test.ts @@ -78,7 +78,7 @@ test("collectFragments reads sections sorted and flags invalid files", () => { assert.equal(c.features.length, 1); assert.equal(c.invalid.length, 1); assert.match(c.invalid[0].file, /bad\.md/); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("insertBullets appends at the END of each living section", () => { @@ -134,19 +134,19 @@ test("aggregate dry-run touches nothing; real run writes and deletes fragments", const again = aggregate({ root }); assert.equal(again.total, 0); assert.equal(readFileSync(join(root, "CHANGELOG.md"), "utf8"), after); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("aggregate refuses invalid fragments loudly", () => { const root = makeRoot({ fragments: { "features/oops.md": "forgot the dash" } }); assert.throws(() => aggregate({ root }), /invalid changelog fragments/); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("gate findInvalidFragments: clean tree passes, bad placement/content fail", () => { const clean = makeRoot({ fragments: { "maintenance/1-ok.md": "- ok (#1)" } }); assert.deepEqual(findInvalidFragments(clean), []); - rmSync(clean, { recursive: true, force: true }); + rmSync(clean, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); const dirty = makeRoot({ fragments: { @@ -161,7 +161,7 @@ test("gate findInvalidFragments: clean tree passes, bad placement/content fail", assert.ok(files.some((f) => f.includes("stray.md"))); assert.ok(files.some((f) => f.includes("unknown-section"))); assert.ok(files.some((f) => f.includes("3-bad.md"))); - rmSync(dirty, { recursive: true, force: true }); + rmSync(dirty, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("gate skips README.md and .gitkeep; absent changelog.d is fine", () => { @@ -170,11 +170,11 @@ test("gate skips README.md and .gitkeep; absent changelog.d is fine", () => { mkdirSync(join(root, "changelog.d/fixes"), { recursive: true }); writeFileSync(join(root, "changelog.d/fixes/.gitkeep"), ""); assert.deepEqual(findInvalidFragments(root), []); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); const bare = mkdtempSync(join(tmpdir(), "chfrag-bare-")); assert.deepEqual(findInvalidFragments(bare), []); - rmSync(bare, { recursive: true, force: true }); + rmSync(bare, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("SECTIONS maps every dir to a real living-section heading in the fixture", () => { diff --git a/tests/unit/chaos-api-routes.test.ts b/tests/unit/chaos-api-routes.test.ts index 650ad2ed59..ad1f5d773d 100644 --- a/tests/unit/chaos-api-routes.test.ts +++ b/tests/unit/chaos-api-routes.test.ts @@ -40,7 +40,7 @@ async function resetStorage() { // config cache too, or getChaosConfig() keeps serving a stale value (e.g. a // prior test's `enabled: true`) after resetDbInstance() below. chaosConfig.invalidateChaosConfigCache(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -74,7 +74,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/chaos-config.test.ts b/tests/unit/chaos-config.test.ts index 3f37e7a406..e90a76ad5e 100644 --- a/tests/unit/chaos-config.test.ts +++ b/tests/unit/chaos-config.test.ts @@ -24,7 +24,7 @@ const chaosConfig = await import("../../src/lib/chaos/chaosConfig.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/chaos-executor.test.ts b/tests/unit/chaos-executor.test.ts index b67bf0bad5..ae44c2f0bd 100644 --- a/tests/unit/chaos-executor.test.ts +++ b/tests/unit/chaos-executor.test.ts @@ -28,7 +28,7 @@ const chaosExecutor = await import("../../src/lib/chaos/chaosExecutor.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/chat-combo-live-test.test.ts b/tests/unit/chat-combo-live-test.test.ts index 348154c40a..36952cb04a 100644 --- a/tests/unit/chat-combo-live-test.test.ts +++ b/tests/unit/chat-combo-live-test.test.ts @@ -25,7 +25,7 @@ async function flushBackgroundWork() { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); resetAllCircuitBreakers(); } @@ -132,7 +132,7 @@ test.after(async () => { globalThis.fetch = originalFetch; resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo live test bypasses connection cooldown and breaker state to perform a real upstream request", async () => { diff --git a/tests/unit/chat-completions-parse-once-7847.test.ts b/tests/unit/chat-completions-parse-once-7847.test.ts index fd8f50fc99..5c014fac0d 100644 --- a/tests/unit/chat-completions-parse-once-7847.test.ts +++ b/tests/unit/chat-completions-parse-once-7847.test.ts @@ -119,5 +119,5 @@ test("#7847 downstream body resolution preserves the parsed object's identity", test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/chat-completions-route-shape-gate.test.ts b/tests/unit/chat-completions-route-shape-gate.test.ts index 38d8beea76..b0f7922a70 100644 --- a/tests/unit/chat-completions-route-shape-gate.test.ts +++ b/tests/unit/chat-completions-route-shape-gate.test.ts @@ -45,7 +45,7 @@ async function flushBackgroundWork() { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.after(async () => { await flushBackgroundWork(); globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makeCountingRequest(body: string) { diff --git a/tests/unit/chat-core-intercept-fetch.test.ts b/tests/unit/chat-core-intercept-fetch.test.ts index 7c9dfa774d..524723c241 100644 --- a/tests/unit/chat-core-intercept-fetch.test.ts +++ b/tests/unit/chat-core-intercept-fetch.test.ts @@ -51,7 +51,7 @@ function runChatCoreInterceptFetchStep( describe("chatCore.ts interceptFetch call site — flag-off regression guard (#7339)", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -61,7 +61,7 @@ describe("chatCore.ts interceptFetch call site — flag-off regression guard (#7 after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("leaves the outgoing body byte-identical when no interceptFetch rule is configured", () => { diff --git a/tests/unit/chat-helpers.test.ts b/tests/unit/chat-helpers.test.ts index 9007e0b33a..a971101891 100644 --- a/tests/unit/chat-helpers.test.ts +++ b/tests/unit/chat-helpers.test.ts @@ -28,7 +28,7 @@ const { setTlsClientForTest } = await import("../../open-sse/utils/proxyFetch.ts async function resetStorage() { resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("resolveModelOrError resolves built-in auto catalog ids without persisted combo rows", async () => { diff --git a/tests/unit/chat-routing-synced-inventory-11089.test.ts b/tests/unit/chat-routing-synced-inventory-11089.test.ts index 441b14893b..269a584e72 100644 --- a/tests/unit/chat-routing-synced-inventory-11089.test.ts +++ b/tests/unit/chat-routing-synced-inventory-11089.test.ts @@ -41,13 +41,13 @@ const PROVIDER = "ollama-local"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createConnection(data: Record): Promise { diff --git a/tests/unit/chat-safetynet-reqid-6097.test.ts b/tests/unit/chat-safetynet-reqid-6097.test.ts index 78121f3f76..3423c0e3dc 100644 --- a/tests/unit/chat-safetynet-reqid-6097.test.ts +++ b/tests/unit/chat-safetynet-reqid-6097.test.ts @@ -45,7 +45,7 @@ async function flushBackgroundWork() { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.after(async () => { await flushBackgroundWork(); globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test( diff --git a/tests/unit/chatcore-attempt-logging.test.ts b/tests/unit/chatcore-attempt-logging.test.ts index e41c58befa..b9fe57fbd3 100644 --- a/tests/unit/chatcore-attempt-logging.test.ts +++ b/tests/unit/chatcore-attempt-logging.test.ts @@ -72,7 +72,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("persists a call log row with the mapped fields (default cacheSource=upstream)", async () => { diff --git a/tests/unit/chatcore-caveman-output-analytics.test.ts b/tests/unit/chatcore-caveman-output-analytics.test.ts index e776cacb28..c2588a43f1 100644 --- a/tests/unit/chatcore-caveman-output-analytics.test.ts +++ b/tests/unit/chatcore-caveman-output-analytics.test.ts @@ -33,7 +33,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-codex-account-pool.test.ts b/tests/unit/chatcore-codex-account-pool.test.ts index a828d7357c..31439c3a1d 100644 --- a/tests/unit/chatcore-codex-account-pool.test.ts +++ b/tests/unit/chatcore-codex-account-pool.test.ts @@ -62,7 +62,7 @@ function buildResponsesResponse(text = "ok") { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -135,7 +135,7 @@ test.after(async () => { globalThis.fetch = originalFetch; await waitForAsyncSideEffects(); await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("chatCore persists child cooldown for each rotated Codex attempt", async () => { diff --git a/tests/unit/chatcore-combo-context-limit-8378.test.ts b/tests/unit/chatcore-combo-context-limit-8378.test.ts index 29011fdc55..5a6f20a3ca 100644 --- a/tests/unit/chatcore-combo-context-limit-8378.test.ts +++ b/tests/unit/chatcore-combo-context-limit-8378.test.ts @@ -37,7 +37,7 @@ const originalSiblingEnv = process.env[SIBLING_LIMIT_ENV]; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -77,7 +77,7 @@ test.after(() => { process.env[SIBLING_LIMIT_ENV] = originalSiblingEnv; } core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8378: enforceOutputTokenBudget honors the combo-resolved context limit, not the plain per-target lookup", async () => { diff --git a/tests/unit/chatcore-combo-context-override-rescue.test.ts b/tests/unit/chatcore-combo-context-override-rescue.test.ts index 67b716ed3c..717b8c644d 100644 --- a/tests/unit/chatcore-combo-context-override-rescue.test.ts +++ b/tests/unit/chatcore-combo-context-override-rescue.test.ts @@ -90,7 +90,7 @@ test.before(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { diff --git a/tests/unit/chatcore-compression-analytics-write.test.ts b/tests/unit/chatcore-compression-analytics-write.test.ts index ab3d056b8f..d8645451b3 100644 --- a/tests/unit/chatcore-compression-analytics-write.test.ts +++ b/tests/unit/chatcore-compression-analytics-write.test.ts @@ -85,7 +85,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-compression-cache-stats.test.ts b/tests/unit/chatcore-compression-cache-stats.test.ts index fe1e3904b2..440efd8775 100644 --- a/tests/unit/chatcore-compression-cache-stats.test.ts +++ b/tests/unit/chatcore-compression-cache-stats.test.ts @@ -42,7 +42,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-compression-settings.test.ts b/tests/unit/chatcore-compression-settings.test.ts index ad3ddbf9c0..7299f9b6fb 100644 --- a/tests/unit/chatcore-compression-settings.test.ts +++ b/tests/unit/chatcore-compression-settings.test.ts @@ -22,7 +22,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-compression-usage-receipt.test.ts b/tests/unit/chatcore-compression-usage-receipt.test.ts index fd3cb9711a..7535cb6172 100644 --- a/tests/unit/chatcore-compression-usage-receipt.test.ts +++ b/tests/unit/chatcore-compression-usage-receipt.test.ts @@ -28,7 +28,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("attaches the usage receipt only after pendingWrite resolves", async () => { diff --git a/tests/unit/chatcore-context-editing-telemetry.test.ts b/tests/unit/chatcore-context-editing-telemetry.test.ts index bfb6cad524..97b46bf24a 100644 --- a/tests/unit/chatcore-context-editing-telemetry.test.ts +++ b/tests/unit/chatcore-context-editing-telemetry.test.ts @@ -45,7 +45,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-executor-proxy.test.ts b/tests/unit/chatcore-executor-proxy.test.ts index a67e23a4f1..86c1ec173f 100644 --- a/tests/unit/chatcore-executor-proxy.test.ts +++ b/tests/unit/chatcore-executor-proxy.test.ts @@ -35,7 +35,7 @@ beforeEach(() => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("no config (disabled by default) returns the provider's own executor", async () => { diff --git a/tests/unit/chatcore-gamification-event.test.ts b/tests/unit/chatcore-gamification-event.test.ts index edc5afb70c..4914c9eeb5 100644 --- a/tests/unit/chatcore-gamification-event.test.ts +++ b/tests/unit/chatcore-gamification-event.test.ts @@ -41,7 +41,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-memory-skills-injection.test.ts b/tests/unit/chatcore-memory-skills-injection.test.ts index 5ecf886dc8..0829afa98d 100644 --- a/tests/unit/chatcore-memory-skills-injection.test.ts +++ b/tests/unit/chatcore-memory-skills-injection.test.ts @@ -16,7 +16,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── getSkillsProviderForFormat (pure switch) ──────────────────────────────── diff --git a/tests/unit/chatcore-model-output-cap-wiring.test.ts b/tests/unit/chatcore-model-output-cap-wiring.test.ts index 9cc0042a3e..9aa1b128f0 100644 --- a/tests/unit/chatcore-model-output-cap-wiring.test.ts +++ b/tests/unit/chatcore-model-output-cap-wiring.test.ts @@ -80,7 +80,7 @@ test.after(() => { globalThis.fetch = originalFetch; featureFlagsDb.removeFeatureFlagOverride("DISABLE_CONTEXT_WINDOW_CHECKS"); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("handleChatCore clamps an over-cap max_tokens to the model's output cap before dispatch", async () => { diff --git a/tests/unit/chatcore-non-streaming-usage-stats.test.ts b/tests/unit/chatcore-non-streaming-usage-stats.test.ts index 0065a83a75..6185636aef 100644 --- a/tests/unit/chatcore-non-streaming-usage-stats.test.ts +++ b/tests/unit/chatcore-non-streaming-usage-stats.test.ts @@ -54,7 +54,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-output-style-telemetry.test.ts b/tests/unit/chatcore-output-style-telemetry.test.ts index d91b3e0910..af43f93247 100644 --- a/tests/unit/chatcore-output-style-telemetry.test.ts +++ b/tests/unit/chatcore-output-style-telemetry.test.ts @@ -47,7 +47,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-quota-share-consumption.test.ts b/tests/unit/chatcore-quota-share-consumption.test.ts index 7bf26fc207..c568d24ed5 100644 --- a/tests/unit/chatcore-quota-share-consumption.test.ts +++ b/tests/unit/chatcore-quota-share-consumption.test.ts @@ -25,7 +25,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-reasoning-cache-write-guard.test.ts b/tests/unit/chatcore-reasoning-cache-write-guard.test.ts index d53008e454..7113c8298e 100644 --- a/tests/unit/chatcore-reasoning-cache-write-guard.test.ts +++ b/tests/unit/chatcore-reasoning-cache-write-guard.test.ts @@ -168,7 +168,7 @@ test.after(() => { try { clearReasoningCacheAll(); } catch {} - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("non-streaming: a replay provider (xiaomi-mimo) populates the reasoning cache", async () => { diff --git a/tests/unit/chatcore-sanitization.test.ts b/tests/unit/chatcore-sanitization.test.ts index 90e9b1e279..c295631bae 100644 --- a/tests/unit/chatcore-sanitization.test.ts +++ b/tests/unit/chatcore-sanitization.test.ts @@ -152,7 +152,7 @@ test.after(() => { db.close(); } catch {} - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("chatCore sanitization normalizes max_output_tokens into max_tokens", async () => { diff --git a/tests/unit/chatcore-semantic-cache.test.ts b/tests/unit/chatcore-semantic-cache.test.ts index 032bfcf9f9..61b86cc4a1 100644 --- a/tests/unit/chatcore-semantic-cache.test.ts +++ b/tests/unit/chatcore-semantic-cache.test.ts @@ -22,7 +22,7 @@ const { formatOmniRouteCost } = await import("../../src/domain/omnirouteResponse test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // A reusable persistAttemptLogs spy + base args. The functions below should NEVER be diff --git a/tests/unit/chatcore-streaming-quota-share.test.ts b/tests/unit/chatcore-streaming-quota-share.test.ts index 6acc9fde7b..df8a602702 100644 --- a/tests/unit/chatcore-streaming-quota-share.test.ts +++ b/tests/unit/chatcore-streaming-quota-share.test.ts @@ -40,7 +40,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-streaming-usage-stats.test.ts b/tests/unit/chatcore-streaming-usage-stats.test.ts index e5db383053..657dad88ce 100644 --- a/tests/unit/chatcore-streaming-usage-stats.test.ts +++ b/tests/unit/chatcore-streaming-usage-stats.test.ts @@ -55,7 +55,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/chatcore-telemetry-helpers.test.ts b/tests/unit/chatcore-telemetry-helpers.test.ts index e7bc72debc..efcef8883d 100644 --- a/tests/unit/chatcore-telemetry-helpers.test.ts +++ b/tests/unit/chatcore-telemetry-helpers.test.ts @@ -28,7 +28,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── forwardDashboardEventToLiveWs ─────────────────────────────────────────── diff --git a/tests/unit/chatcore-translation-paths.test.ts b/tests/unit/chatcore-translation-paths.test.ts index 6ecb048788..66178f4df6 100644 --- a/tests/unit/chatcore-translation-paths.test.ts +++ b/tests/unit/chatcore-translation-paths.test.ts @@ -322,7 +322,7 @@ async function resetStorage() { resetBackgroundStats(); globalThis.setTimeout = originalSetTimeout; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -448,7 +448,7 @@ test.after(async () => { resetAccountSemaphores(); await flushAsyncSideEffects(); await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("chatCore times out upstream execution before provider response headers", async () => { // This test asserts pendingDetail.providerRequest — only attached when the diff --git a/tests/unit/chatcore-upstream-body.test.ts b/tests/unit/chatcore-upstream-body.test.ts index 2f1fe135a9..9a5cb39a53 100644 --- a/tests/unit/chatcore-upstream-body.test.ts +++ b/tests/unit/chatcore-upstream-body.test.ts @@ -25,7 +25,7 @@ before(async () => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("pins the target model when it differs from the translated body model", async () => { diff --git a/tests/unit/chatgpt-web-codex.test.ts b/tests/unit/chatgpt-web-codex.test.ts index c7ffb6319f..71118fd306 100644 --- a/tests/unit/chatgpt-web-codex.test.ts +++ b/tests/unit/chatgpt-web-codex.test.ts @@ -169,7 +169,7 @@ test("turn broker holds a tool invocation and rejects wrong or duplicate results assert.throws(() => broker.completeTool(token, request.callId, { content: [] }), /not pending/); } finally { await broker.close(); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -207,7 +207,7 @@ test("revoking a turn rejects a pending connector invocation", async () => { await assert.rejects(invocation, /revoked/); } finally { await broker.close(); - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/check-changelog-integrity.test.ts b/tests/unit/check-changelog-integrity.test.ts index b78c1c5a82..cc247531bb 100644 --- a/tests/unit/check-changelog-integrity.test.ts +++ b/tests/unit/check-changelog-integrity.test.ts @@ -139,7 +139,7 @@ test("CLI rejects an unledgered loss", () => { assert.match(result.stderr, /1 bullet\(s\).*MISSING/s); assert.doesNotMatch(result.stderr, /reporting only, not failing/); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -152,7 +152,7 @@ test("CLI fails closed when the removed legacy bypass is still configured", () = assert.match(result.stderr, /ALLOW_CHANGELOG_REMOVALS.*removed/); assert.match(result.stderr, /changelog-reconciliations\.json/); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -179,7 +179,7 @@ test("CLI accepts only an exact, reviewable ledgered reconciliation", () => { assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`); assert.match(result.stdout, /OK.*ledgered reconciliation "clarify-fix-b"/s); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -211,7 +211,7 @@ test("CLI keeps an additional loss RED after an approved result is tampered with assert.match(result.stderr, /2 bullet\(s\).*MISSING/s); assert.doesNotMatch(result.stdout, /ledgered reconciliation/); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -239,7 +239,7 @@ test("CLI rejects exact file hashes when the ledger omits one removed occurrence assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); assert.match(result.stderr, /2 bullet\(s\).*MISSING/s); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -267,7 +267,7 @@ test("CLI rejects exact file hashes when the ledger omits one removed duplicate" assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); assert.match(result.stderr, /2 bullet\(s\).*MISSING/s); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -294,7 +294,7 @@ test("CLI rejects exact bullet deltas when the ledger base hash is wrong", () => assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); assert.match(result.stderr, /1 bullet\(s\).*MISSING/s); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -311,7 +311,7 @@ test("CLI validates a new fragment without treating it as a reconciliation", () assert.equal(result.status, 0, `${result.stdout}\n${result.stderr}`); assert.match(result.stdout, /OK — no base bullets lost/); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -326,7 +326,7 @@ test("CLI fails closed on a malformed reconciliation ledger", () => { assert.match(result.stderr, /invalid reconciliation ledger/); assert.match(result.stderr, /reconciliations must be an array/); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -338,6 +338,6 @@ test("CLI fails closed when an explicit base ref is unreadable", () => { assert.equal(result.status, 1, `${result.stdout}\n${result.stderr}`); assert.match(result.stderr, /FAIL.*CHANGELOG\.md.*missing-explicit-base/s); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/check-fabricated-docs.test.ts b/tests/unit/check-fabricated-docs.test.ts index bcb07a4811..24b2378dff 100644 --- a/tests/unit/check-fabricated-docs.test.ts +++ b/tests/unit/check-fabricated-docs.test.ts @@ -46,7 +46,7 @@ function findingsFor(fx: Fixture): Set { } return out; } finally { - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/check-openapi-breaking-ratchet.test.ts b/tests/unit/check-openapi-breaking-ratchet.test.ts index c9d1333be0..e7641c4118 100644 --- a/tests/unit/check-openapi-breaking-ratchet.test.ts +++ b/tests/unit/check-openapi-breaking-ratchet.test.ts @@ -116,7 +116,7 @@ function withTmpBaseline(content: string | null, fn: (p: string) => void) { try { fn(p); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/claude-classifier-compat.test.ts b/tests/unit/claude-classifier-compat.test.ts index f7f2f59950..90eddf11d9 100644 --- a/tests/unit/claude-classifier-compat.test.ts +++ b/tests/unit/claude-classifier-compat.test.ts @@ -68,7 +68,7 @@ const SEVERITY_CLASSIFIER_BODY = { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Settings default is opt-in (off) ──────────────────────────────────────── diff --git a/tests/unit/claude-code-rendering-fixes.test.ts b/tests/unit/claude-code-rendering-fixes.test.ts index fe50f4e426..dc3c689956 100644 --- a/tests/unit/claude-code-rendering-fixes.test.ts +++ b/tests/unit/claude-code-rendering-fixes.test.ts @@ -18,7 +18,7 @@ test.after(() => { resetDbInstance(); if (previousDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = previousDataDir; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Responses->Chat: output_item.done emits arguments when no delta chunks were sent", () => { diff --git a/tests/unit/claude-directive-midconv-passthrough.test.ts b/tests/unit/claude-directive-midconv-passthrough.test.ts index ca1a95684f..9d00c89c27 100644 --- a/tests/unit/claude-directive-midconv-passthrough.test.ts +++ b/tests/unit/claude-directive-midconv-passthrough.test.ts @@ -30,14 +30,14 @@ test.afterEach(async () => { globalThis.fetch = originalFetch; await flushAsyncSideEffects(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("claude mid-conversation-system passthrough relocates a directive-only messages[0]", async () => { diff --git a/tests/unit/claude-empty-stream-error-3685.test.ts b/tests/unit/claude-empty-stream-error-3685.test.ts index 719f2cb638..7986512cbb 100644 --- a/tests/unit/claude-empty-stream-error-3685.test.ts +++ b/tests/unit/claude-empty-stream-error-3685.test.ts @@ -33,7 +33,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { for (const entry of fs.readdirSync(TEST_DATA_DIR)) { - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); diff --git a/tests/unit/claudeAuthImport-bootstrap-headers-10144.test.ts b/tests/unit/claudeAuthImport-bootstrap-headers-10144.test.ts index e373732908..44cdcea978 100644 --- a/tests/unit/claudeAuthImport-bootstrap-headers-10144.test.ts +++ b/tests/unit/claudeAuthImport-bootstrap-headers-10144.test.ts @@ -28,7 +28,7 @@ test.afterEach(() => { }); test.after(() => { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("real enrichWithBootstrap sends the required CLI headers", async () => { diff --git a/tests/unit/cli-api-generator-ref-params.test.ts b/tests/unit/cli-api-generator-ref-params.test.ts index be6b559753..90c0e2805d 100644 --- a/tests/unit/cli-api-generator-ref-params.test.ts +++ b/tests/unit/cli-api-generator-ref-params.test.ts @@ -90,7 +90,7 @@ test("generator resolves a $ref path parameter into --id and substitutes {id} in "generated command must declare --body for the requestBody" ); } finally { - rmSync(workDir, { recursive: true, force: true }); + rmSync(workDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -126,7 +126,7 @@ components: try { assert.throws(() => runGenerator(specPath, outDir)); } finally { - rmSync(workDir, { recursive: true, force: true }); + rmSync(workDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-auth-export-command.test.ts b/tests/unit/cli-auth-export-command.test.ts index 2b3cd5ef2d..a23d9a8af9 100644 --- a/tests/unit/cli-auth-export-command.test.ts +++ b/tests/unit/cli-auth-export-command.test.ts @@ -62,7 +62,7 @@ async function withAuthExportEnv( new Database(dbPath).close(); await fn(dataDir, dbPath); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/cli-backup-command.test.ts b/tests/unit/cli-backup-command.test.ts index 5859e5ab40..d2dd9cc5c5 100644 --- a/tests/unit/cli-backup-command.test.ts +++ b/tests/unit/cli-backup-command.test.ts @@ -31,7 +31,7 @@ async function withBackupEnv(fn: (dataDir: string) => Promise) { await fn(dataDir); } finally { console.log = originalLog; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; } diff --git a/tests/unit/cli-combo-create-models-10954.test.ts b/tests/unit/cli-combo-create-models-10954.test.ts index 52fabf8c16..66f7346ad2 100644 --- a/tests/unit/cli-combo-create-models-10954.test.ts +++ b/tests/unit/cli-combo-create-models-10954.test.ts @@ -40,7 +40,7 @@ async function withComboEnv(fn: (dataDir: string) => Promise) { } finally { console.log = originalLog; globalThis.fetch = ORIGINAL_FETCH; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; @@ -225,7 +225,7 @@ test("combo create (HTTP) — POST /api/combos body carries the parsed models", } finally { console.log = originalLog; globalThis.fetch = ORIGINAL_FETCH; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; } diff --git a/tests/unit/cli-contexts.test.ts b/tests/unit/cli-contexts.test.ts index 2ed45bfeba..46b778d7c2 100644 --- a/tests/unit/cli-contexts.test.ts +++ b/tests/unit/cli-contexts.test.ts @@ -17,7 +17,7 @@ test.after(() => { if (origDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = origDataDir; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli-data-dir-env-loading.test.ts b/tests/unit/cli-data-dir-env-loading.test.ts index c3d2ae3423..52c54f47bc 100644 --- a/tests/unit/cli-data-dir-env-loading.test.ts +++ b/tests/unit/cli-data-dir-env-loading.test.ts @@ -89,7 +89,7 @@ test("CLI data-dir resolver preserves an existing legacy ~/.omniroute before XDG } ); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -152,6 +152,6 @@ test("CLI startup loads later non-conflicting .env files without overriding earl assert.equal(current.OMNIROUTE_HTTP_TIMEOUT_MS, "1234"); assert.equal(current.PORT, "34567"); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-data-dir-env.test.ts b/tests/unit/cli-data-dir-env.test.ts index 798177db66..b56d498669 100644 --- a/tests/unit/cli-data-dir-env.test.ts +++ b/tests/unit/cli-data-dir-env.test.ts @@ -38,7 +38,7 @@ async function withTempEnv( for (const [key, value] of Object.entries(originalEnv)) { process.env[key] = value; } - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/cli-doctor-command.test.ts b/tests/unit/cli-doctor-command.test.ts index d23878b76b..f6f19eec32 100644 --- a/tests/unit/cli-doctor-command.test.ts +++ b/tests/unit/cli-doctor-command.test.ts @@ -48,7 +48,7 @@ async function withDoctorEnv(fn: (dataDir: string) => Promise) { try { await fn(dataDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/cli-doctor-prebuilt-native-binary-10083.test.ts b/tests/unit/cli-doctor-prebuilt-native-binary-10083.test.ts index 2b42faba02..ed9c950079 100644 --- a/tests/unit/cli-doctor-prebuilt-native-binary-10083.test.ts +++ b/tests/unit/cli-doctor-prebuilt-native-binary-10083.test.ts @@ -31,8 +31,8 @@ async function withTempRoot(fn: (rootDir: string) => Promise) { try { await fn(rootDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; } diff --git a/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts b/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts index 5f48f1a7de..db63463c3d 100644 --- a/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts +++ b/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts @@ -37,7 +37,7 @@ function runCli(dataDir: string): { code: number | null; stdout: string; stderr: }); return { code: res.status, stdout: res.stdout ?? "", stderr: res.stderr ?? "" }; } finally { - fs.rmSync(isolatedHome, { recursive: true, force: true }); + fs.rmSync(isolatedHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } @@ -82,7 +82,7 @@ test("#7302: CLI must recognize DATA_DIR/server.env (Electron's secrets file) wh "Electron-persisted key in server.env" ); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -109,6 +109,6 @@ test("#7302: an existing DATA_DIR/.env must still win over DATA_DIR/server.env w "server.env must not leak into an existing .env" ); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-env-collision.test.ts b/tests/unit/cli-env-collision.test.ts index cb11ac4474..4447ef4fb1 100644 --- a/tests/unit/cli-env-collision.test.ts +++ b/tests/unit/cli-env-collision.test.ts @@ -67,7 +67,7 @@ test("a key masked by an earlier .env is named, with both files and without its assert.ok(!stderr.includes("cwd.example"), "the ignored value must never be printed"); assert.ok(!stderr.includes("data.example"), "the winning value must never be printed"); } finally { - fs.rmSync(dirs.tmp, { recursive: true, force: true }); + fs.rmSync(dirs.tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -83,7 +83,7 @@ test("a key each file declares once says nothing", () => { const stderr = runCli(dirs).stderr ?? ""; assert.ok(!/OMNIROUTE_BASE_URL|PORT/.test(stderr), `nothing to report: ${stderr}`); } finally { - fs.rmSync(dirs.tmp, { recursive: true, force: true }); + fs.rmSync(dirs.tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -103,7 +103,7 @@ test("a key the environment already set is reported too — that is #6194", () = assert.ok(!stderr.includes("shell.example"), "the winning value must never be printed"); assert.ok(!stderr.includes("data.example"), "the ignored value must never be printed"); } finally { - fs.rmSync(dirs.tmp, { recursive: true, force: true }); + fs.rmSync(dirs.tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -125,6 +125,6 @@ test("an unreadable .env is reported instead of being swallowed", () => { `the unreadable file should be named: ${result.stderr}` ); } finally { - fs.rmSync(dirs.tmp, { recursive: true, force: true }); + fs.rmSync(dirs.tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-expanded-commands.test.ts b/tests/unit/cli-expanded-commands.test.ts index e631a084c6..2b8ab4cb11 100644 --- a/tests/unit/cli-expanded-commands.test.ts +++ b/tests/unit/cli-expanded-commands.test.ts @@ -124,7 +124,7 @@ test("backup auto enable — nenhuma opção é sombreada pelo parent backup", a } finally { if (origDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = origDataDir; - rmSync(dataDir, { recursive: true, force: true }); + rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -189,7 +189,7 @@ test("backup — sem subcomando ainda cria um backup (uso legado documentado)", } finally { if (origDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = origDataDir; - rmSync(dataDir, { recursive: true, force: true }); + rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-helper/config-generator-codex.test.ts b/tests/unit/cli-helper/config-generator-codex.test.ts index 7d3843db57..af798704f3 100644 --- a/tests/unit/cli-helper/config-generator-codex.test.ts +++ b/tests/unit/cli-helper/config-generator-codex.test.ts @@ -31,7 +31,7 @@ function tempCodexHome(): string { after(() => { for (const dir of tmpDirs) { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/cli-helper/tool-detector-opencode-jsonc-10227.test.ts b/tests/unit/cli-helper/tool-detector-opencode-jsonc-10227.test.ts index f2039e55ef..4812f37c9d 100644 --- a/tests/unit/cli-helper/tool-detector-opencode-jsonc-10227.test.ts +++ b/tests/unit/cli-helper/tool-detector-opencode-jsonc-10227.test.ts @@ -36,6 +36,6 @@ test("detectTool reports an existing opencode.jsonc as the real config path (#10 } finally { if (previousXdg === undefined) delete process.env.XDG_CONFIG_HOME; else process.env.XDG_CONFIG_HOME = previousXdg; - fs.rmSync(xdgRoot, { recursive: true, force: true }); + fs.rmSync(xdgRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-ipv4-first-dns-2699.test.ts b/tests/unit/cli-ipv4-first-dns-2699.test.ts index 74bd4f33f5..3a0633d7b5 100644 --- a/tests/unit/cli-ipv4-first-dns-2699.test.ts +++ b/tests/unit/cli-ipv4-first-dns-2699.test.ts @@ -88,6 +88,6 @@ test("ServerSupervisor starts Node with IPv4-first DNS", async () => { else process.env.DATA_DIR = previousDataDir; if (previousNodeOptions === undefined) delete process.env.NODE_OPTIONS; else process.env.NODE_OPTIONS = previousNodeOptions; - rmSync(dataDir, { recursive: true, force: true }); + rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-keys-command.test.ts b/tests/unit/cli-keys-command.test.ts index c0175bb3b3..a2f2e73c0a 100644 --- a/tests/unit/cli-keys-command.test.ts +++ b/tests/unit/cli-keys-command.test.ts @@ -55,7 +55,7 @@ async function withCliKeysEnv(fn: (dataDir: string, dbPath: string) => Promise { if (origOmniLang === undefined) delete process.env.OMNIROUTE_LANG; else process.env.OMNIROUTE_LANG = origOmniLang; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli-logs-route.test.ts b/tests/unit/cli-logs-route.test.ts index 8dcf83316e..4dbba108c9 100644 --- a/tests/unit/cli-logs-route.test.ts +++ b/tests/unit/cli-logs-route.test.ts @@ -43,7 +43,7 @@ test.before(async () => { test.after(async () => { await updateSettings({ requireLogin: true }); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); try { fs.unlinkSync(logPath); } catch { diff --git a/tests/unit/cli-npm-install-runtime-allow-scripts-10713.test.ts b/tests/unit/cli-npm-install-runtime-allow-scripts-10713.test.ts index eacb1e245a..d07ee041d9 100644 --- a/tests/unit/cli-npm-install-runtime-allow-scripts-10713.test.ts +++ b/tests/unit/cli-npm-install-runtime-allow-scripts-10713.test.ts @@ -34,7 +34,7 @@ test("issue #10713: npmInstallRuntime requests --allow-scripts for its own fully process.env.PATH = originalPath; if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; - rmSync(fakeBinDir, { recursive: true, force: true }); - rmSync(fakeDataDir, { recursive: true, force: true }); + rmSync(fakeBinDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + rmSync(fakeDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-plugin-system.test.ts b/tests/unit/cli-plugin-system.test.ts index b74fdded29..4be5c03f72 100644 --- a/tests/unit/cli-plugin-system.test.ts +++ b/tests/unit/cli-plugin-system.test.ts @@ -56,7 +56,7 @@ test("discoverPlugins descobre plugin com package.json válido", async () => { if (orig === undefined) delete process.env.OMNIROUTE_PLUGIN_PATH; else process.env.OMNIROUTE_PLUGIN_PATH = orig; try { - rmSync(pluginDir, { recursive: true }); + rmSync(pluginDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -83,7 +83,7 @@ test("discoverPlugins ignora pacotes sem prefixo omniroute-cmd-", async () => { if (orig === undefined) delete process.env.OMNIROUTE_PLUGIN_PATH; else process.env.OMNIROUTE_PLUGIN_PATH = orig; try { - rmSync(pluginDir, { recursive: true }); + rmSync(pluginDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -115,7 +115,7 @@ test("loadPlugins não quebra CLI quando plugin tem erro de load (try/catch)", a if (orig === undefined) delete process.env.OMNIROUTE_PLUGIN_PATH; else process.env.OMNIROUTE_PLUGIN_PATH = orig; try { - rmSync(pluginDir, { recursive: true }); + rmSync(pluginDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -155,7 +155,7 @@ test("loadPlugins carrega plugin válido e chama register()", async () => { if (orig === undefined) delete process.env.OMNIROUTE_PLUGIN_PATH; else process.env.OMNIROUTE_PLUGIN_PATH = orig; try { - rmSync(pluginDir, { recursive: true }); + rmSync(pluginDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); diff --git a/tests/unit/cli-provider-catalog-full-10080.test.ts b/tests/unit/cli-provider-catalog-full-10080.test.ts index f7a907c690..3d65de7c95 100644 --- a/tests/unit/cli-provider-catalog-full-10080.test.ts +++ b/tests/unit/cli-provider-catalog-full-10080.test.ts @@ -128,7 +128,7 @@ test("falls back to COMMON_PROVIDERS when no catalog is present", () => { assert.equal(providers.length, COMMON_PROVIDERS.length); assert.equal(providers[0].id, "openai"); } finally { - fs.rmSync(emptyRoot, { recursive: true, force: true }); + fs.rmSync(emptyRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -147,6 +147,6 @@ test("an explicit catalogPath still overrides the directory walk", () => { ["only"] ); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-provider-test-routes-10570.test.ts b/tests/unit/cli-provider-test-routes-10570.test.ts index 36b9616ff1..56319745f6 100644 --- a/tests/unit/cli-provider-test-routes-10570.test.ts +++ b/tests/unit/cli-provider-test-routes-10570.test.ts @@ -35,7 +35,7 @@ async function withCliEnv(fn: (dataDir: string) => Promise) { await fn(dataDir); } finally { globalThis.fetch = ORIGINAL_FETCH; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY; diff --git a/tests/unit/cli-providers-command.test.ts b/tests/unit/cli-providers-command.test.ts index 4a071f4e32..d7b8900ed5 100644 --- a/tests/unit/cli-providers-command.test.ts +++ b/tests/unit/cli-providers-command.test.ts @@ -32,7 +32,7 @@ async function withProvidersEnv(fn: (dataDir: string) => Promise) { try { await fn(dataDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); globalThis.fetch = ORIGINAL_FETCH; if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; diff --git a/tests/unit/cli-providers-rotate.test.ts b/tests/unit/cli-providers-rotate.test.ts index 2d85ed4878..eb74d1e7ab 100644 --- a/tests/unit/cli-providers-rotate.test.ts +++ b/tests/unit/cli-providers-rotate.test.ts @@ -30,7 +30,7 @@ async function withEnv(fn: (dataDir: string) => Promise) { try { await fn(dataDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); globalThis.fetch = ORIGINAL_FETCH; if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/cli-remote-mode.test.ts b/tests/unit/cli-remote-mode.test.ts index f8d060ff6d..a1fafa6c93 100644 --- a/tests/unit/cli-remote-mode.test.ts +++ b/tests/unit/cli-remote-mode.test.ts @@ -44,7 +44,7 @@ test.after(() => { if (origContext === undefined) delete process.env.OMNIROUTE_CONTEXT; else process.env.OMNIROUTE_CONTEXT = origContext; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli-repl.test.ts b/tests/unit/cli-repl.test.ts index 741f2c238e..1f94618f17 100644 --- a/tests/unit/cli-repl.test.ts +++ b/tests/unit/cli-repl.test.ts @@ -113,7 +113,7 @@ test("saveSession e loadSession persistem e restauram sessão", async () => { } finally { process.env.DATA_DIR = origDataDir ?? ""; try { - rmSync(tmpDir, { recursive: true }); + rmSync(tmpDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -129,7 +129,7 @@ test("loadSession lança erro se sessão não existe", async () => { } finally { process.env.DATA_DIR = origDataDir ?? ""; try { - rmSync(tmpDir, { recursive: true }); + rmSync(tmpDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -154,7 +154,7 @@ test("listSessions retorna array (vazio ou com sessões)", async () => { } finally { process.env.DATA_DIR = origDataDir ?? ""; try { - rmSync(tmpDir, { recursive: true }); + rmSync(tmpDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); @@ -172,7 +172,7 @@ test("autosave não lança erro em condições normais", async () => { } finally { process.env.DATA_DIR = origDataDir ?? ""; try { - rmSync(tmpDir, { recursive: true }); + rmSync(tmpDir, { recursive: true, maxRetries: 5, retryDelay: 100 }); } catch {} } }); diff --git a/tests/unit/cli-runtime-detection.test.ts b/tests/unit/cli-runtime-detection.test.ts index 9e9205a98e..7a76f5110d 100644 --- a/tests/unit/cli-runtime-detection.test.ts +++ b/tests/unit/cli-runtime-detection.test.ts @@ -101,7 +101,7 @@ describe("Size threshold — checkKnownPath", () => { }); after(() => { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("should detect files >= 30 bytes via env var", async () => { @@ -164,7 +164,7 @@ describe("Healthcheck — checkRunnable", () => { }); after(() => { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("should report runnable=true for a script that outputs version", async () => { diff --git a/tests/unit/cli-runtime-extended.test.ts b/tests/unit/cli-runtime-extended.test.ts index 8c2ef44845..00f69eab91 100644 --- a/tests/unit/cli-runtime-extended.test.ts +++ b/tests/unit/cli-runtime-extended.test.ts @@ -50,7 +50,7 @@ test.afterEach(() => { restoreEnv(); for (const dir of tempDirs) { - fs.rmSync(dir as any, { recursive: true, force: true }); + fs.rmSync(dir as any, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } tempDirs.clear(); }); diff --git a/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts b/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts index 6551b227f7..145a28c9ec 100644 --- a/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts +++ b/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts @@ -55,8 +55,8 @@ describe("#7774 — known-path short-circuit hides a genuinely runnable Claude b if (value === undefined) delete (process.env as Record)[key]; else process.env[key] = value; } - fs.rmSync(fakeHome, { recursive: true, force: true }); - fs.rmSync(realBinDir, { recursive: true, force: true }); + fs.rmSync(fakeHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(realBinDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("should still find and report Claude as installed+runnable via PATH fallback", async () => { diff --git a/tests/unit/cli-runtime.test.ts b/tests/unit/cli-runtime.test.ts index 293f6a3933..a1844db758 100644 --- a/tests/unit/cli-runtime.test.ts +++ b/tests/unit/cli-runtime.test.ts @@ -17,7 +17,7 @@ test.after(() => { if (origDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = origDataDir; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); @@ -99,7 +99,7 @@ test("isBetterSqliteBinaryValid rejeita binário com magic bytes válidos mas AB false, "binário com header válido mas ABI/conteúdo incompatível deve ser inválido" ); - rmSync(join(nm, "better-sqlite3"), { recursive: true, force: true }); + rmSync(join(nm, "better-sqlite3"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("isBetterSqliteBinaryValid aceita um binário nativo real e carregável", async () => { @@ -125,7 +125,7 @@ test("isBetterSqliteBinaryValid aceita um binário nativo real e carregável", a copyFileSync(realBinary, binary); const result = isBetterSqliteBinaryValid(); assert.equal(result, true, "um binário real, compatível com o Node atual, deve ser válido"); - rmSync(join(nm, "better-sqlite3"), { recursive: true, force: true }); + rmSync(join(nm, "better-sqlite3"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("commands/runtime.mjs pode ser importado sem erro", async () => { diff --git a/tests/unit/cli-serve-stop-command.test.ts b/tests/unit/cli-serve-stop-command.test.ts index efde50e186..5955ec80bd 100644 --- a/tests/unit/cli-serve-stop-command.test.ts +++ b/tests/unit/cli-serve-stop-command.test.ts @@ -26,7 +26,7 @@ async function withEnv(fn: (dataDir: string) => Promise) { } finally { console.log = originalLog; globalThis.fetch = ORIGINAL_FETCH; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/cli-setup-command.test.ts b/tests/unit/cli-setup-command.test.ts index ae0c805a65..fa956e62f0 100644 --- a/tests/unit/cli-setup-command.test.ts +++ b/tests/unit/cli-setup-command.test.ts @@ -32,7 +32,7 @@ async function withTempEnv(fn: (dataDir: string) => Promise) { try { await fn(dataDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts b/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts index 97bfdc6c8f..39b09562b1 100644 --- a/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts +++ b/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts @@ -37,6 +37,6 @@ test("config-generator/opencode.ts imports cleanly with no tsconfig.json in scop `stdout: ${result.stdout}\nstderr: ${result.stderr}` ); } finally { - rmSync(stage, { recursive: true, force: true }); + rmSync(stage, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-setup-opencode.test.ts b/tests/unit/cli-setup-opencode.test.ts index ac99ced134..bbbc63fab4 100644 --- a/tests/unit/cli-setup-opencode.test.ts +++ b/tests/unit/cli-setup-opencode.test.ts @@ -62,7 +62,7 @@ describe("omniroute setup opencode", () => { console.info = _console.info; console.warn = _console.warn; try { - fs.rmSync(FIXTURE_ROOT, { recursive: true, force: true }); + fs.rmSync(FIXTURE_ROOT, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } @@ -146,7 +146,7 @@ describe("omniroute setup opencode", () => { }); it("fails with a clear error (exit 1) when the bundled plugin dist is missing", async () => { - fs.rmSync(path.join(FAKE_PLUGIN_DIR, "dist"), { recursive: true, force: true }); + fs.rmSync(path.join(FAKE_PLUGIN_DIR, "dist"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); try { const r = await runSetupOpenCodeCommand({ configDir: CONFIG_DIR, diff --git a/tests/unit/cli-sqlite-construction-fallback-8826.test.ts b/tests/unit/cli-sqlite-construction-fallback-8826.test.ts index fc9783d85b..871fe213fb 100644 --- a/tests/unit/cli-sqlite-construction-fallback-8826.test.ts +++ b/tests/unit/cli-sqlite-construction-fallback-8826.test.ts @@ -40,7 +40,7 @@ const { openOmniRouteDb } = await import("../../bin/cli/sqlite.mjs"); test("#8826: openOmniRouteDb() falls back to node:sqlite when better-sqlite3 native binding is missing (construction-time failure)", async (t) => { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-8826-")); t.after(() => { - try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {} + try { fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} Module._load = originalLoad; }); diff --git a/tests/unit/cli-stop-supervisor-respawn-9455.test.ts b/tests/unit/cli-stop-supervisor-respawn-9455.test.ts index badebaa3f5..c580c1fffd 100644 --- a/tests/unit/cli-stop-supervisor-respawn-9455.test.ts +++ b/tests/unit/cli-stop-supervisor-respawn-9455.test.ts @@ -140,7 +140,7 @@ test("Defect 1b: pid.mjs SERVICES array must include supervisor so killAllSubpro assert.equal(ok, true, "writePidFile('supervisor', ...) must succeed"); assert.equal(readPidFile("supervisor"), 555555); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; } diff --git a/tests/unit/cli-storage-key-bootstrap.test.ts b/tests/unit/cli-storage-key-bootstrap.test.ts index 3664ab5e8e..b6b9858ecc 100644 --- a/tests/unit/cli-storage-key-bootstrap.test.ts +++ b/tests/unit/cli-storage-key-bootstrap.test.ts @@ -41,7 +41,7 @@ function runCli(dataDir: string): { code: number | null; stderr: string } { }); return { code: res.status, stderr: res.stderr ?? "" }; } finally { - fs.rmSync(isolatedHome, { recursive: true, force: true }); + fs.rmSync(isolatedHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } @@ -63,7 +63,7 @@ test("CLI generates STORAGE_ENCRYPTION_KEY into DATA_DIR on first run (#1622)", "key persisted into DATA_DIR/.env" ); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -79,6 +79,6 @@ test("CLI refuses to auto-generate a key when a database already exists (#1622)" assert.equal(hasKey, false, "must NOT generate a key when a DB already exists"); assert.match(stderr, /already exists/i, "must warn that a database already exists"); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-tools-apply-container-422.test.ts b/tests/unit/cli-tools-apply-container-422.test.ts index b4fc5cf6bf..177753137b 100644 --- a/tests/unit/cli-tools-apply-container-422.test.ts +++ b/tests/unit/cli-tools-apply-container-422.test.ts @@ -38,7 +38,7 @@ test.after(async () => { } catch { // the DB was never opened } - for (const dir of tempDirs) fs.rmSync(dir, { recursive: true, force: true }); + for (const dir of tempDirs) fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function applyRequest(body: Record) { diff --git a/tests/unit/cli-tools-apply-opencode-jsonc.test.ts b/tests/unit/cli-tools-apply-opencode-jsonc.test.ts index 3abdb422b4..0d3d38d2ed 100644 --- a/tests/unit/cli-tools-apply-opencode-jsonc.test.ts +++ b/tests/unit/cli-tools-apply-opencode-jsonc.test.ts @@ -79,14 +79,14 @@ test.afterEach(async () => { if (originalAllowContainerWrite === undefined) delete process.env.OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE; else process.env.OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE = originalAllowContainerWrite; - for (const root of testRoots) await fs.rm(root, { recursive: true, force: true }); + for (const root of testRoots) await fs.rm(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); testRoots.clear(); }); test.after(async () => { if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; - await fs.rm(databaseRoot, { recursive: true, force: true }); + await fs.rm(databaseRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("apply writes back to the selected opencode.jsonc and does not create opencode.json (#10227)", async () => { diff --git a/tests/unit/cli-tools-crush.test.ts b/tests/unit/cli-tools-crush.test.ts index a3fca02851..4dbdbfde5e 100644 --- a/tests/unit/cli-tools-crush.test.ts +++ b/tests/unit/cli-tools-crush.test.ts @@ -63,7 +63,7 @@ const { GET, POST, DELETE } = await import("../../src/app/api/cli-tools/crush-se async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -151,7 +151,7 @@ test("crush-settings POST: writes crush.json with an openai-compat providers.omn } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -196,7 +196,7 @@ test("crush-settings DELETE: removes only the omniroute provider entry", async ( } } finally { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -226,7 +226,7 @@ test("crush-settings route.ts: does not call exec() or spawn() directly", () => test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.API_KEY_SECRET; delete process.env.JWT_SECRET; diff --git a/tests/unit/cli-tools-settings-jsonc.test.ts b/tests/unit/cli-tools-settings-jsonc.test.ts index c259397ec4..e283cd449e 100644 --- a/tests/unit/cli-tools-settings-jsonc.test.ts +++ b/tests/unit/cli-tools-settings-jsonc.test.ts @@ -65,7 +65,7 @@ test("readJsoncConfig parses a JSONC file with trailing commas (regression)", as assert.equal(parsed.apiKey, "sk-test"); assert.equal(parsed.model, "claude-sonnet-4-5"); } finally { - await fs.rm(dir, { recursive: true, force: true }); + await fs.rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -79,7 +79,7 @@ test("readJsoncConfig returns fallback on corrupted config instead of throwing", assert.equal(await readJsoncConfig(file), null); assert.deepEqual(await readJsoncConfig(file, {}), {}); } finally { - await fs.rm(dir, { recursive: true, force: true }); + await fs.rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-tray-systray2.test.ts b/tests/unit/cli-tray-systray2.test.ts index 33228db41a..9e0ecdea39 100644 --- a/tests/unit/cli-tray-systray2.test.ts +++ b/tests/unit/cli-tray-systray2.test.ts @@ -48,7 +48,7 @@ test("chmodSystrayBinAt sets +x on the bundled tray binary when present", () => const mode = statSync(binPath).mode & 0o777; assert.ok((mode & 0o111) !== 0, `expected exec bits on bin, got mode=${mode.toString(8)}`); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -59,7 +59,7 @@ test("chmodSystrayBinAt is a no-op when the binary doesn't exist", () => { assert.equal(result.changed, false); assert.equal(result.reason, "missing"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -70,6 +70,6 @@ test("chmodSystrayBinAt returns missing on win32 when binary is absent (#8609)", assert.equal(result.changed, false); assert.equal(result.reason, "missing"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-tray.test.ts b/tests/unit/cli-tray.test.ts index e67022bbd2..63dc79a25c 100644 --- a/tests/unit/cli-tray.test.ts +++ b/tests/unit/cli-tray.test.ts @@ -37,7 +37,7 @@ test.after(() => { if (origPath === undefined) delete process.env.PATH; else process.env.PATH = origPath; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli-update-global-paths-3295.test.ts b/tests/unit/cli-update-global-paths-3295.test.ts index e23a2ef3dd..56498fa514 100644 --- a/tests/unit/cli-update-global-paths-3295.test.ts +++ b/tests/unit/cli-update-global-paths-3295.test.ts @@ -25,7 +25,7 @@ test("getCurrentVersion resolves the real version from a foreign cwd (#3295)", a assert.equal(version, REAL_VERSION); } finally { process.chdir(originalCwd); - rmSync(foreignCwd, { recursive: true, force: true }); + rmSync(foreignCwd, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -59,7 +59,7 @@ test("createBackup resolves bin/ from a foreign cwd and copies cli/ recursively process.chdir(originalCwd); if (originalHome === undefined) delete process.env.HOME; else process.env.HOME = originalHome; - rmSync(foreignCwd, { recursive: true, force: true }); - rmSync(fakeHome, { recursive: true, force: true }); + rmSync(foreignCwd, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + rmSync(fakeHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli-update-shadow-install-9475.test.ts b/tests/unit/cli-update-shadow-install-9475.test.ts index f05794f211..7715d9a3ff 100644 --- a/tests/unit/cli-update-shadow-install-9475.test.ts +++ b/tests/unit/cli-update-shadow-install-9475.test.ts @@ -41,6 +41,6 @@ exit 0 console.log = origLog; if (origPath === undefined) delete process.env.PATH; else process.env.PATH = origPath; - rmSync(fakeBin, { recursive: true, force: true }); + rmSync(fakeBin, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli/alias-resolver-7791.test.ts b/tests/unit/cli/alias-resolver-7791.test.ts index d6037796f4..007fd42028 100644 --- a/tests/unit/cli/alias-resolver-7791.test.ts +++ b/tests/unit/cli/alias-resolver-7791.test.ts @@ -203,7 +203,7 @@ describe("aliasResolver.registerAliasResolver", () => { const ok = await registerAliasResolver(tmp); assert.equal(ok, false, "must return false when there is no src/ dir"); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -214,7 +214,7 @@ describe("aliasResolver.registerAliasResolver", () => { const ok = await registerAliasResolver(tmp); assert.equal(ok, true, "must register when src/ exists"); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli/autostart-linux.test.ts b/tests/unit/cli/autostart-linux.test.ts index 100d13828e..bf2dca7bf1 100644 --- a/tests/unit/cli/autostart-linux.test.ts +++ b/tests/unit/cli/autostart-linux.test.ts @@ -48,7 +48,7 @@ test.after(() => { if (origPath === undefined) delete process.env.PATH; else process.env.PATH = origPath; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli/autostart-windows.test.ts b/tests/unit/cli/autostart-windows.test.ts index 75cbd5af8f..439d00ebcb 100644 --- a/tests/unit/cli/autostart-windows.test.ts +++ b/tests/unit/cli/autostart-windows.test.ts @@ -17,7 +17,7 @@ test.after(() => { if (origAppData === undefined) delete process.env.APPDATA; else process.env.APPDATA = origAppData; try { - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/cli/launch-codex-windows-spawn-args.test.ts b/tests/unit/cli/launch-codex-windows-spawn-args.test.ts index 1cb5d8eb83..d33910a845 100644 --- a/tests/unit/cli/launch-codex-windows-spawn-args.test.ts +++ b/tests/unit/cli/launch-codex-windows-spawn-args.test.ts @@ -126,7 +126,7 @@ test( assert.deepEqual(received, args, "child argv must match what the caller passed"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/cli/launch-windows-spawn-args.test.ts b/tests/unit/cli/launch-windows-spawn-args.test.ts index 52dd9aa3ab..65abfda804 100644 --- a/tests/unit/cli/launch-windows-spawn-args.test.ts +++ b/tests/unit/cli/launch-windows-spawn-args.test.ts @@ -126,7 +126,7 @@ test( assert.deepEqual(received, args, "child argv must match what the caller passed"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/cli/run-execution.test.ts b/tests/unit/cli/run-execution.test.ts index 85b41f4ad3..7549b53ef2 100644 --- a/tests/unit/cli/run-execution.test.ts +++ b/tests/unit/cli/run-execution.test.ts @@ -66,8 +66,8 @@ process.exit(7);` if (originalPath === undefined) delete process.env.PATH; else process.env.PATH = originalPath; delete process.env.CAPTURE_PATH; - await rm(fake.dir, { recursive: true, force: true }); - await rm(capture, { recursive: true, force: true }); + await rm(fake.dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + await rm(capture, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -117,8 +117,8 @@ fs.writeFileSync(process.env.CAPTURE_PATH, JSON.stringify({ if (originalPath === undefined) delete process.env.PATH; else process.env.PATH = originalPath; delete process.env.CAPTURE_PATH; - await rm(fake.dir, { recursive: true, force: true }); - await rm(capture, { recursive: true, force: true }); + await rm(fake.dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + await rm(capture, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -164,7 +164,7 @@ fs.writeFileSync(process.env.CAPTURE_PATH, JSON.stringify({ if (originalPath === undefined) delete process.env.PATH; else process.env.PATH = originalPath; delete process.env.CAPTURE_PATH; - await rm(fake.dir, { recursive: true, force: true }); - await rm(capture, { recursive: true, force: true }); + await rm(fake.dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + await rm(capture, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli/setup-claude.test.ts b/tests/unit/cli/setup-claude.test.ts index 256dcbd317..867e62a686 100644 --- a/tests/unit/cli/setup-claude.test.ts +++ b/tests/unit/cli/setup-claude.test.ts @@ -109,7 +109,7 @@ test("syncClaudeProfilesFromModels falls back to a generic profile for unmatched // No effort tier for the generic fallback — effortLevel must be omitted. assert.equal("effortLevel" in json, false); } finally { - await fs.rm(claudeHome, { recursive: true, force: true }); + await fs.rm(claudeHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -137,7 +137,7 @@ test("syncClaudeProfilesFromModels writes directory-per-profile settings + threa // The auth token must never be written to disk. assert.equal(JSON.stringify(json).includes("ANTHROPIC_AUTH_TOKEN"), false); } finally { - await fs.rm(claudeHome, { recursive: true, force: true }); + await fs.rm(claudeHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -166,7 +166,7 @@ test("syncClaudeProfilesFromModels dry-run writes nothing and reports via the in // …and writes nothing to disk. await assert.rejects(fs.stat(settingsPath), /ENOENT/); } finally { - await fs.rm(claudeHome, { recursive: true, force: true }); + await fs.rm(claudeHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli/setup-codex.test.ts b/tests/unit/cli/setup-codex.test.ts index 2280979c8b..176dd922a1 100644 --- a/tests/unit/cli/setup-codex.test.ts +++ b/tests/unit/cli/setup-codex.test.ts @@ -76,6 +76,6 @@ test("syncCodexProfilesFromModels writes compatible profiles and skips media", a /ENOENT/ ); } finally { - await fs.rm(codexHome, { recursive: true, force: true }); + await fs.rm(codexHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cli/setup-qwen.test.ts b/tests/unit/cli/setup-qwen.test.ts index b6140c76d4..dc8d49427e 100644 --- a/tests/unit/cli/setup-qwen.test.ts +++ b/tests/unit/cli/setup-qwen.test.ts @@ -64,7 +64,7 @@ test("setup-qwen writes current V4 settings and only its dedicated env key", asy assert.match(env, /^OPENAI_API_KEY=keep-me$/m); assert.match(env, /^OMNIROUTE_API_KEY="sk-qwen-dedicated"$/m); } finally { - await fs.rm(tempDir, { recursive: true, force: true }); + await fs.rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -85,6 +85,6 @@ test("setup-qwen does not overwrite an invalid settings file", async () => { assert.equal(code, 1); assert.equal(await fs.readFile(settingsPath, "utf8"), "{ invalid JSON"); } finally { - await fs.rm(tempDir, { recursive: true, force: true }); + await fs.rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cliRuntime-codex-shebang-8036.test.ts b/tests/unit/cliRuntime-codex-shebang-8036.test.ts index e31fd28321..96ce0b5ed5 100644 --- a/tests/unit/cliRuntime-codex-shebang-8036.test.ts +++ b/tests/unit/cliRuntime-codex-shebang-8036.test.ts @@ -69,5 +69,5 @@ test("#8036: codex is reported runnable even when the launcher PATH omits node's }); test.after(async () => { - await fsp.rm(sandboxHome, { recursive: true, force: true }); + await fsp.rm(sandboxHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/cliRuntime-symlink-escape-7753.test.ts b/tests/unit/cliRuntime-symlink-escape-7753.test.ts index a36ba60ef4..23c3b113f5 100644 --- a/tests/unit/cliRuntime-symlink-escape-7753.test.ts +++ b/tests/unit/cliRuntime-symlink-escape-7753.test.ts @@ -51,10 +51,10 @@ test("#7753: a genuinely unsafe symlink whose ORIGINAL location is also untruste assert.equal(result.installed, false); assert.equal(result.reason, "symlink_escape"); - await fsp.rm(untrustedDir, { recursive: true, force: true }); + await fsp.rm(untrustedDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.after(async () => { - await fsp.rm(sandboxHome, { recursive: true, force: true }); - await fsp.rm(outsideDir, { recursive: true, force: true }); + await fsp.rm(sandboxHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + await fsp.rm(outsideDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/client-identity-profiles.test.ts b/tests/unit/client-identity-profiles.test.ts index 7328111fe4..54e00736a5 100644 --- a/tests/unit/client-identity-profiles.test.ts +++ b/tests/unit/client-identity-profiles.test.ts @@ -24,7 +24,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getClientIdentityProfileHeaders: default profile adds no headers", () => { diff --git a/tests/unit/cliproxy-auth-import-1934.test.ts b/tests/unit/cliproxy-auth-import-1934.test.ts index 2f664c9330..8c5a01809d 100644 --- a/tests/unit/cliproxy-auth-import-1934.test.ts +++ b/tests/unit/cliproxy-auth-import-1934.test.ts @@ -117,7 +117,7 @@ test("scanCliProxyAuthDir reads importable files and counts skips", async () => assert.equal(candidates[0].provider, "antigravity"); assert.equal(skipped, 2); // unknown type + broken json } finally { - await fs.rm(dir, { recursive: true, force: true }); + await fs.rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts b/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts index 50c09efea2..2b06adcb3e 100644 --- a/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts +++ b/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts @@ -50,7 +50,7 @@ afterEach(async () => { after(() => { coreDb.resetDbInstance(); - if (fs.existsSync(testDataDir)) fs.rmSync(testDataDir, { recursive: true, force: true }); + if (fs.existsSync(testDataDir)) fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); type ExecuteInput = { diff --git a/tests/unit/cliproxyapi-fallback-wiring.test.ts b/tests/unit/cliproxyapi-fallback-wiring.test.ts index 74ad11cbb5..224f0c2229 100644 --- a/tests/unit/cliproxyapi-fallback-wiring.test.ts +++ b/tests/unit/cliproxyapi-fallback-wiring.test.ts @@ -53,14 +53,14 @@ before(async () => { afterEach(() => { // Reset DB singleton so each test starts from a clean schema state. coreDb.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(testDataDir, { recursive: true }); }); after(() => { coreDb.resetDbInstance(); if (fs.existsSync(testDataDir)) { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts b/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts index 1952999118..4b01562de5 100644 --- a/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts +++ b/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts @@ -37,7 +37,7 @@ afterEach(() => { after(() => { coreDb.resetDbInstance(); - if (fs.existsSync(testDataDir)) fs.rmSync(testDataDir, { recursive: true, force: true }); + if (fs.existsSync(testDataDir)) fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); type ExecuteInput = { diff --git a/tests/unit/cloud-agent-credentials.test.ts b/tests/unit/cloud-agent-credentials.test.ts index 75f6c592ff..cb09b4093a 100644 --- a/tests/unit/cloud-agent-credentials.test.ts +++ b/tests/unit/cloud-agent-credentials.test.ts @@ -24,7 +24,7 @@ const creds = await import("../../src/lib/cloudAgent/credentials.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migration 061 provisions cloud_agent_credentials (table exists after DB init)", () => { diff --git a/tests/unit/cloud-agent-tasks-route-auth.test.ts b/tests/unit/cloud-agent-tasks-route-auth.test.ts index c23fe9366b..fbfdfce120 100644 --- a/tests/unit/cloud-agent-tasks-route-auth.test.ts +++ b/tests/unit/cloud-agent-tasks-route-auth.test.ts @@ -21,7 +21,7 @@ type ErrorBody = { error: { message: string } }; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/cloud-sync.test.ts b/tests/unit/cloud-sync.test.ts index 5137382bcf..5e6a81ffb7 100644 --- a/tests/unit/cloud-sync.test.ts +++ b/tests/unit/cloud-sync.test.ts @@ -37,7 +37,7 @@ async function loadCloudSync(label) { async function resetStorage() { apiKeysDb.resetApiKeyState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); globalThis.fetch = ORIGINAL_FETCH; delete process.env.CLOUD_URL; @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(() => { apiKeysDb.resetApiKeyState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); globalThis.fetch = ORIGINAL_FETCH; if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/cloud-write-auth.test.ts b/tests/unit/cloud-write-auth.test.ts index 7a04b1e40b..68c1ce3ca9 100644 --- a/tests/unit/cloud-write-auth.test.ts +++ b/tests/unit/cloud-write-auth.test.ts @@ -32,7 +32,7 @@ async function resetStorage() { process.env.API_KEY_SECRET = "cloud-write-auth-api-key-secret"; core.resetDbInstance(); localDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await localDb.updateSettings({ requireLogin: true, password: "" }); } @@ -135,7 +135,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); localDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("PUT /api/cloud/credentials/update rejects valid API key without manage/admin scope and leaves credentials unchanged", async () => { diff --git a/tests/unit/cloudflare-models-uuid-4259.test.ts b/tests/unit/cloudflare-models-uuid-4259.test.ts index e14f4bc57b..6026b4971b 100644 --- a/tests/unit/cloudflare-models-uuid-4259.test.ts +++ b/tests/unit/cloudflare-models-uuid-4259.test.ts @@ -21,7 +21,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4259 cloudflare-ai discovery uses the model name (slug) as id, not the UUID", async () => { diff --git a/tests/unit/cloudflaredTunnel-extended.test.ts b/tests/unit/cloudflaredTunnel-extended.test.ts index f34f7516ab..31484b1ff0 100644 --- a/tests/unit/cloudflaredTunnel-extended.test.ts +++ b/tests/unit/cloudflaredTunnel-extended.test.ts @@ -101,7 +101,7 @@ test.afterEach(async () => { restoreEnv(); for (const dir of tempDirs) { - await fs.rm(dir as any, { recursive: true, force: true }); + await fs.rm(dir as any, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } tempDirs.clear(); }); diff --git a/tests/unit/cloudflaredTunnel.test.ts b/tests/unit/cloudflaredTunnel.test.ts index 5397927cbf..9bb5b38d82 100644 --- a/tests/unit/cloudflaredTunnel.test.ts +++ b/tests/unit/cloudflaredTunnel.test.ts @@ -293,6 +293,6 @@ test("getCloudflaredTunnelStatus resets stale runtime state from a previous serv process.env.CLOUDFLARED_BIN = originalBinary; } - await fs.rm(tempDir, { recursive: true, force: true }); + await fs.rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/codex-account-cooldown-write.test.ts b/tests/unit/codex-account-cooldown-write.test.ts index c24347afb7..d2a64419b0 100644 --- a/tests/unit/codex-account-cooldown-write.test.ts +++ b/tests/unit/codex-account-cooldown-write.test.ts @@ -15,7 +15,7 @@ const codexFailover = await import("../../open-sse/handlers/chatCore/codexFailov async function resetStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -65,7 +65,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("persisting Codex and Spark child cooldowns retains sibling and unrelated state", async () => { diff --git a/tests/unit/codex-auth-import-userid-dedup-6301.test.ts b/tests/unit/codex-auth-import-userid-dedup-6301.test.ts index 9f5046ed4d..ab88408957 100644 --- a/tests/unit/codex-auth-import-userid-dedup-6301.test.ts +++ b/tests/unit/codex-auth-import-userid-dedup-6301.test.ts @@ -71,7 +71,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -92,7 +92,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("parseAndValidateCodexAuth extracts userId from chatgpt_user_id claim", () => { diff --git a/tests/unit/codex-catalog-revalidation-runtime.test.ts b/tests/unit/codex-catalog-revalidation-runtime.test.ts index c7d2d78665..fa4b542a6c 100644 --- a/tests/unit/codex-catalog-revalidation-runtime.test.ts +++ b/tests/unit/codex-catalog-revalidation-runtime.test.ts @@ -25,7 +25,7 @@ const originalEnv = { async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -43,7 +43,7 @@ test.beforeEach(async () => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); for (const [key, value] of Object.entries(originalEnv)) { if (value === undefined) delete process.env[key]; else process.env[key] = value; diff --git a/tests/unit/codex-catalog-revalidation.test.ts b/tests/unit/codex-catalog-revalidation.test.ts index e70bdbc686..c00de6ca98 100644 --- a/tests/unit/codex-catalog-revalidation.test.ts +++ b/tests/unit/codex-catalog-revalidation.test.ts @@ -84,7 +84,7 @@ test("resolveCodexCatalogAppVersion uses stable, source-qualified identities", ( ); assert.equal(resolveCodexCatalogAppVersion({}, { runtimeRoot, packageVersion: null }), null); } finally { - fs.rmSync(runtimeRoot, { recursive: true, force: true }); + fs.rmSync(runtimeRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/codex-connection-defaults.test.ts b/tests/unit/codex-connection-defaults.test.ts index a05abc4803..1b50a3aa7d 100644 --- a/tests/unit/codex-connection-defaults.test.ts +++ b/tests/unit/codex-connection-defaults.test.ts @@ -15,7 +15,7 @@ const { migrateCodexConnectionDefaultsFromLegacySettings } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migration backfills Codex request defaults, preserves existing providerSpecificData, and is idempotent", async () => { diff --git a/tests/unit/codex-connection-edit-6562.test.ts b/tests/unit/codex-connection-edit-6562.test.ts index 7b444a95cc..a1df77a5ac 100644 --- a/tests/unit/codex-connection-edit-6562.test.ts +++ b/tests/unit/codex-connection-edit-6562.test.ts @@ -46,7 +46,7 @@ const providerByIdRoute = await import("../../src/app/api/providers/[id]/route.t function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -56,7 +56,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createCodexConnection( diff --git a/tests/unit/codex-fingerprint-seed-persistence.test.ts b/tests/unit/codex-fingerprint-seed-persistence.test.ts index d65b7197b4..82b88b17b9 100644 --- a/tests/unit/codex-fingerprint-seed-persistence.test.ts +++ b/tests/unit/codex-fingerprint-seed-persistence.test.ts @@ -14,13 +14,13 @@ const UUID_V4_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3} async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } beforeEach(resetStorage); after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createCodexOAuthConnection(providerSpecificData?: Record) { diff --git a/tests/unit/codex-gpt55-effort-routing.test.ts b/tests/unit/codex-gpt55-effort-routing.test.ts index 17b0abdb40..2d1aeba82e 100644 --- a/tests/unit/codex-gpt55-effort-routing.test.ts +++ b/tests/unit/codex-gpt55-effort-routing.test.ts @@ -41,7 +41,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Defect B: suffixed bare names infer codex, not openai ───────────────────── diff --git a/tests/unit/codex-gpt55-routing-5887.test.ts b/tests/unit/codex-gpt55-routing-5887.test.ts index 5e77fcdb4c..d710d919e0 100644 --- a/tests/unit/codex-gpt55-routing-5887.test.ts +++ b/tests/unit/codex-gpt55-routing-5887.test.ts @@ -31,7 +31,7 @@ let openaiConnectionId: number | string | undefined; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // (a) Codex active, OpenAI NOT active → bare gpt-5.5 must infer codex. diff --git a/tests/unit/codex-import-refresh-validation-7522.test.ts b/tests/unit/codex-import-refresh-validation-7522.test.ts index cb22a60748..b68754b6e4 100644 --- a/tests/unit/codex-import-refresh-validation-7522.test.ts +++ b/tests/unit/codex-import-refresh-validation-7522.test.ts @@ -31,7 +31,7 @@ test.before(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function jsonResponse(body: unknown, status = 200) { diff --git a/tests/unit/codex-import-token-route.test.ts b/tests/unit/codex-import-token-route.test.ts index f9bbbc4ec2..cafc20c897 100644 --- a/tests/unit/codex-import-token-route.test.ts +++ b/tests/unit/codex-import-token-route.test.ts @@ -39,7 +39,7 @@ test.before(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function postImportToken(body: unknown) { diff --git a/tests/unit/codex-models-catalog-refresh.test.ts b/tests/unit/codex-models-catalog-refresh.test.ts index 9de940db09..87c3522c76 100644 --- a/tests/unit/codex-models-catalog-refresh.test.ts +++ b/tests/unit/codex-models-catalog-refresh.test.ts @@ -43,7 +43,7 @@ type CatalogResponse = { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("codex client (originator: codex_exec) receives a top-level `models` array so the catalog refresh decodes", async () => { diff --git a/tests/unit/codex-oauth-refresh-persist-6352.test.ts b/tests/unit/codex-oauth-refresh-persist-6352.test.ts index 12f23cd67d..5473a242a8 100644 --- a/tests/unit/codex-oauth-refresh-persist-6352.test.ts +++ b/tests/unit/codex-oauth-refresh-persist-6352.test.ts @@ -51,7 +51,7 @@ const { OAUTH_ENDPOINTS } = await import("../../open-sse/config/constants.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -94,7 +94,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("checkAndRefreshToken reuses the stored Codex refresh_token, persists the new access_token, rotates the refresh_token, and clears stale auth-failure state (#6352)", async () => { diff --git a/tests/unit/codex-orphaned-tool-outputs-2928.test.ts b/tests/unit/codex-orphaned-tool-outputs-2928.test.ts index 1a96a1263b..23ab9c00aa 100644 --- a/tests/unit/codex-orphaned-tool-outputs-2928.test.ts +++ b/tests/unit/codex-orphaned-tool-outputs-2928.test.ts @@ -36,7 +36,7 @@ function toolOutputs(input: InputItem[]): InputItem[] { test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex strips function_call_output items without matching function calls", () => { diff --git a/tests/unit/codex-quota-selection-hydration.test.ts b/tests/unit/codex-quota-selection-hydration.test.ts index 124c863fcd..f3d36ec19b 100644 --- a/tests/unit/codex-quota-selection-hydration.test.ts +++ b/tests/unit/codex-quota-selection-hydration.test.ts @@ -21,7 +21,7 @@ function futureIso(ms = 60_000) { async function resetStorage() { core.resetDbInstance(); quotaCache.__clearForTests(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex selection ignores hydrated Spark-only exhaustion for normal Codex models", async () => { diff --git a/tests/unit/codex-reset-credits.test.ts b/tests/unit/codex-reset-credits.test.ts index e9466858d2..2a6ecccee7 100644 --- a/tests/unit/codex-reset-credits.test.ts +++ b/tests/unit/codex-reset-credits.test.ts @@ -17,7 +17,7 @@ type QuotaUsageRecord = Record; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("consumeCodexResetCredit fetches a credit id, posts it, then refreshes usage", async () => { diff --git a/tests/unit/codex-responses-passthrough-strip-3317.test.ts b/tests/unit/codex-responses-passthrough-strip-3317.test.ts index 9c755e6ff7..b925eb14d7 100644 --- a/tests/unit/codex-responses-passthrough-strip-3317.test.ts +++ b/tests/unit/codex-responses-passthrough-strip-3317.test.ts @@ -72,7 +72,7 @@ test.after(() => { /* ignore */ } try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/codex-responses-ws-fingerprint.test.ts b/tests/unit/codex-responses-ws-fingerprint.test.ts index e65cdeefb2..77a56c1f12 100644 --- a/tests/unit/codex-responses-ws-fingerprint.test.ts +++ b/tests/unit/codex-responses-ws-fingerprint.test.ts @@ -15,14 +15,14 @@ const { POST } = await import("../../src/app/api/internal/codex-responses-ws/rou function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(resetDb); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex internal websocket bridge prepare preserves original OAuth identity in off mode", async () => { diff --git a/tests/unit/codex-same-account-transport-retry-9708.test.ts b/tests/unit/codex-same-account-transport-retry-9708.test.ts index e436df0080..cca34dd347 100644 --- a/tests/unit/codex-same-account-transport-retry-9708.test.ts +++ b/tests/unit/codex-same-account-transport-retry-9708.test.ts @@ -24,7 +24,7 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9708: 503 connection-reset and 507 buffer errors are retryable pre-output transport", () => { diff --git a/tests/unit/codex-session-affinity-reset-aware-5903.test.ts b/tests/unit/codex-session-affinity-reset-aware-5903.test.ts index 02f4ef6f1f..541c4fd2fa 100644 --- a/tests/unit/codex-session-affinity-reset-aware-5903.test.ts +++ b/tests/unit/codex-session-affinity-reset-aware-5903.test.ts @@ -31,7 +31,7 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -56,7 +56,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("codex session affinity wins over a per-request reset-aware forcedConnectionId (#5903)", async () => { diff --git a/tests/unit/codex-settings-wire-api-default.test.ts b/tests/unit/codex-settings-wire-api-default.test.ts index d8dae1b1b7..7b7d5fd32d 100644 --- a/tests/unit/codex-settings-wire-api-default.test.ts +++ b/tests/unit/codex-settings-wire-api-default.test.ts @@ -44,7 +44,7 @@ const post = async (body: Record) => test.after(async () => { os.homedir = originalHome; - await fs.rm(TEST_HOME, { recursive: true, force: true }); + await fs.rm(TEST_HOME, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; if (originalWriteFlag === undefined) delete process.env.CLI_ALLOW_CONFIG_WRITES; @@ -78,7 +78,7 @@ test("POST resolves the Codex wire API before URL normalization and TOML generat for (const testCase of cases) { await t.test(testCase.name, async () => { - await fs.rm(TEST_HOME, { recursive: true, force: true }); + await fs.rm(TEST_HOME, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); const response = await post(testCase.body); assert.equal(response.status, 200); diff --git a/tests/unit/codex-stream-false.test.ts b/tests/unit/codex-stream-false.test.ts index 138272d8e7..7c111c7bf6 100644 --- a/tests/unit/codex-stream-false.test.ts +++ b/tests/unit/codex-stream-false.test.ts @@ -139,7 +139,7 @@ function buildResponsesNdjson(text = "Brasilia") { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -207,7 +207,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("CodexExecutor.transformRequest clones the request body before forcing stream=true", () => { diff --git a/tests/unit/codex-synced-bare-model-routing.test.ts b/tests/unit/codex-synced-bare-model-routing.test.ts index 765b5a1de3..685ce7f456 100644 --- a/tests/unit/codex-synced-bare-model-routing.test.ts +++ b/tests/unit/codex-synced-bare-model-routing.test.ts @@ -46,13 +46,13 @@ async function seedSyncedModel(provider: TestProvider, modelId: string, isActive test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("bare GPT-5.6 model routes through Codex when it is the only active provider", async () => { diff --git a/tests/unit/codex-ws-policy-enforcement-6564.test.ts b/tests/unit/codex-ws-policy-enforcement-6564.test.ts index 7801e27a9f..3cf85bc3e0 100644 --- a/tests/unit/codex-ws-policy-enforcement-6564.test.ts +++ b/tests/unit/codex-ws-policy-enforcement-6564.test.ts @@ -71,7 +71,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -95,7 +95,7 @@ test.after(async () => { apiKeysDb.resetApiKeyState(); costRules.resetCostData(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Builds a bridge POST request for the internal codex-responses-ws route's "prepare" action. */ diff --git a/tests/unit/colocate-optionals.test.ts b/tests/unit/colocate-optionals.test.ts index 8250c46317..8af400d522 100644 --- a/tests/unit/colocate-optionals.test.ts +++ b/tests/unit/colocate-optionals.test.ts @@ -85,7 +85,7 @@ test("computeDependencyClosure walks deps transitively and skips peers (transfor "closure must NOT include the transformers peer" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -121,7 +121,7 @@ test("colocateLlmlinguaOptionals copies the closure into dist and never clobbers ); assert.equal(distTransformers.version, "4.2.0", "dist transformers must remain 4.2.0"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -140,7 +140,7 @@ test("colocateLlmlinguaOptionals is idempotent (second run is a no-op)", () => { assert.equal(second.reason, "already co-located"); } } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -157,7 +157,7 @@ test("colocateLlmlinguaOptionals skips when SLM optionals are not installed", () assert.equal(result.reason, "SLM optionals not installed at root"); } } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -171,7 +171,7 @@ test("colocateLlmlinguaOptionals skips when there is no standalone dist bundle", assert.equal(result.reason, "no standalone dist/node_modules"); } } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -206,7 +206,7 @@ test("colocateLlmlinguaOptionals fills a Next-traced stub (package.json only, no "the real dist/index.js must be filled in, not left missing behind the stub" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/combo-account-allowlist-3266.test.ts b/tests/unit/combo-account-allowlist-3266.test.ts index 57411db268..eddde9809a 100644 --- a/tests/unit/combo-account-allowlist-3266.test.ts +++ b/tests/unit/combo-account-allowlist-3266.test.ts @@ -42,7 +42,7 @@ function okResponse(content: string) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── 1. Schema parse ───────────────────────────────────────────────────────── diff --git a/tests/unit/combo-attempt-body-isolation-7847.test.ts b/tests/unit/combo-attempt-body-isolation-7847.test.ts index 9373c51e7c..36cedb67b1 100644 --- a/tests/unit/combo-attempt-body-isolation-7847.test.ts +++ b/tests/unit/combo-attempt-body-isolation-7847.test.ts @@ -97,7 +97,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-auto-candidate-expansion.test.ts b/tests/unit/combo-auto-candidate-expansion.test.ts index fdfeb062ab..0d101431e5 100644 --- a/tests/unit/combo-auto-candidate-expansion.test.ts +++ b/tests/unit/combo-auto-candidate-expansion.test.ts @@ -19,7 +19,7 @@ const providerModels = await import("../../open-sse/config/providerModels.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -27,7 +27,7 @@ test.beforeEach(() => resetStorage()); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-auto-pool-visible-only.test.ts b/tests/unit/combo-auto-pool-visible-only.test.ts index e0748ea77b..cfcba30235 100644 --- a/tests/unit/combo-auto-pool-visible-only.test.ts +++ b/tests/unit/combo-auto-pool-visible-only.test.ts @@ -24,7 +24,7 @@ const combo = await import("../../open-sse/services/combo.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ test.beforeEach(() => resetStorage()); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-bracket-names.test.ts b/tests/unit/combo-bracket-names.test.ts index 0f4d8af0de..96ebcb9d2a 100644 --- a/tests/unit/combo-bracket-names.test.ts +++ b/tests/unit/combo-bracket-names.test.ts @@ -14,7 +14,7 @@ const sseModelService = await import("../../src/sse/services/model.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -24,7 +24,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo schemas accept names with spaces and square brackets", () => { diff --git a/tests/unit/combo-builder-effort-variants-8072.test.ts b/tests/unit/combo-builder-effort-variants-8072.test.ts index 5a1ffe7eec..da92cbea65 100644 --- a/tests/unit/combo-builder-effort-variants-8072.test.ts +++ b/tests/unit/combo-builder-effort-variants-8072.test.ts @@ -34,7 +34,7 @@ const { getComboBuilderOptions } = await import("../../src/lib/combos/builderOpt test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8072 buildModelOptions: synced - effort variants appear in the Combo Builder picker and inherit the base model's metadata", async () => { diff --git a/tests/unit/combo-builder-model-source-5477.test.ts b/tests/unit/combo-builder-model-source-5477.test.ts index 230e4fe48d..3ca86da56f 100644 --- a/tests/unit/combo-builder-model-source-5477.test.ts +++ b/tests/unit/combo-builder-model-source-5477.test.ts @@ -22,7 +22,7 @@ const { getComboBuilderOptions } = await import("../../src/lib/combos/builderOpt test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5477 buildModelOptions classifies custom-model source (manual -> custom, api-sync -> imported)", async () => { diff --git a/tests/unit/combo-builder-opencode-prefix.test.ts b/tests/unit/combo-builder-opencode-prefix.test.ts index 8ce510e8be..24cfe8762d 100644 --- a/tests/unit/combo-builder-opencode-prefix.test.ts +++ b/tests/unit/combo-builder-opencode-prefix.test.ts @@ -28,7 +28,7 @@ const { parseModel } = await import("../../open-sse/services/model.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2901 no-auth OpenCode combo models use the oc/ prefix (not opencode/)", async () => { diff --git a/tests/unit/combo-builder-options-route.test.ts b/tests/unit/combo-builder-options-route.test.ts index 8353b40de2..9f5181b8f6 100644 --- a/tests/unit/combo-builder-options-route.test.ts +++ b/tests/unit/combo-builder-options-route.test.ts @@ -16,7 +16,7 @@ const route = await import("../../src/app/api/combos/builder/options/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo builder options route aggregates providers, connections, models and combo refs", async () => { diff --git a/tests/unit/combo-cache-invalidation.test.ts b/tests/unit/combo-cache-invalidation.test.ts index 5291c5c76a..ebff45d40a 100644 --- a/tests/unit/combo-cache-invalidation.test.ts +++ b/tests/unit/combo-cache-invalidation.test.ts @@ -36,7 +36,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Mirror the cache-validity predicate used by the handler cache layers diff --git a/tests/unit/combo-context-generic-default-10734.test.ts b/tests/unit/combo-context-generic-default-10734.test.ts index 27749b9f9a..78d932d22e 100644 --- a/tests/unit/combo-context-generic-default-10734.test.ts +++ b/tests/unit/combo-context-generic-default-10734.test.ts @@ -19,7 +19,7 @@ const catalog = await import("../../src/app/api/v1/models/catalog.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10734: resolveTokenLimit marks the generic 128k catch-all as specific:false", () => { diff --git a/tests/unit/combo-context-length.test.ts b/tests/unit/combo-context-length.test.ts index c416b4d8be..fb900eaee3 100644 --- a/tests/unit/combo-context-length.test.ts +++ b/tests/unit/combo-context-length.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Zod Schema Validation (createComboSchema) ─── diff --git a/tests/unit/combo-context-overflow-compression-probe.test.ts b/tests/unit/combo-context-overflow-compression-probe.test.ts index aae7f3ab2e..c854339c69 100644 --- a/tests/unit/combo-context-overflow-compression-probe.test.ts +++ b/tests/unit/combo-context-overflow-compression-probe.test.ts @@ -43,7 +43,7 @@ test.after(() => { } else { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { diff --git a/tests/unit/combo-context-prefix-resolution.test.ts b/tests/unit/combo-context-prefix-resolution.test.ts index bd586f2efc..8a827bc6de 100644 --- a/tests/unit/combo-context-prefix-resolution.test.ts +++ b/tests/unit/combo-context-prefix-resolution.test.ts @@ -38,7 +38,7 @@ const { setModelContextOverride, removeModelContextOverride } = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("computeComboContextLength resolves a registry-known, prefixed member (glm/glm-5.2) to its real context window", () => { diff --git a/tests/unit/combo-context-relay.test.ts b/tests/unit/combo-context-relay.test.ts index 5e83b460c3..e984d7a696 100644 --- a/tests/unit/combo-context-relay.test.ts +++ b/tests/unit/combo-context-relay.test.ts @@ -78,7 +78,7 @@ function buildQuotaResponse(usedPercent, resetAfterSeconds = 3600) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -116,7 +116,7 @@ test.after(async () => { clearSessions(); globalThis.fetch = originalFetch; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("handleComboChat context-relay routes to the first available model", async () => { diff --git a/tests/unit/combo-context-window-filter.test.ts b/tests/unit/combo-context-window-filter.test.ts index 442caf85e0..a78c3d5ba5 100644 --- a/tests/unit/combo-context-window-filter.test.ts +++ b/tests/unit/combo-context-window-filter.test.ts @@ -27,7 +27,7 @@ test.after(() => { } else { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { diff --git a/tests/unit/combo-description-5005.test.ts b/tests/unit/combo-description-5005.test.ts index c77a6a9185..89d382390a 100644 --- a/tests/unit/combo-description-5005.test.ts +++ b/tests/unit/combo-description-5005.test.ts @@ -25,7 +25,7 @@ const combosDb = await import("../../src/lib/db/combos.ts"); async function resetStorage() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createComboSchema preserves description instead of stripping it", () => { diff --git a/tests/unit/combo-dispatch-prelude.test.ts b/tests/unit/combo-dispatch-prelude.test.ts index 87d35ef25d..68307b8da2 100644 --- a/tests/unit/combo-dispatch-prelude.test.ts +++ b/tests/unit/combo-dispatch-prelude.test.ts @@ -89,7 +89,7 @@ function setup(combo: ComboInput) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_API_KEY_SECRET === undefined) delete process.env.API_KEY_SECRET; diff --git a/tests/unit/combo-empty-models.test.ts b/tests/unit/combo-empty-models.test.ts index 95f32813a3..77785f9cb5 100644 --- a/tests/unit/combo-empty-models.test.ts +++ b/tests/unit/combo-empty-models.test.ts @@ -15,7 +15,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("an update cannot remove every model from a combo", () => { diff --git a/tests/unit/combo-fallback-token-estimate-7847.test.ts b/tests/unit/combo-fallback-token-estimate-7847.test.ts index 1a8e57838c..b4d1aeb69a 100644 --- a/tests/unit/combo-fallback-token-estimate-7847.test.ts +++ b/tests/unit/combo-fallback-token-estimate-7847.test.ts @@ -22,7 +22,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-forecast.test.ts b/tests/unit/combo-forecast.test.ts index 46bbc75c2b..2e7af7891f 100644 --- a/tests/unit/combo-forecast.test.ts +++ b/tests/unit/combo-forecast.test.ts @@ -23,7 +23,7 @@ const { normalizeComboStep } = await import("../../src/lib/combos/steps.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -85,7 +85,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/combo-health-dashboard.test.ts b/tests/unit/combo-health-dashboard.test.ts index 52449883bf..41edbf7f7d 100644 --- a/tests/unit/combo-health-dashboard.test.ts +++ b/tests/unit/combo-health-dashboard.test.ts @@ -26,7 +26,7 @@ const { normalizeComboStep } = await import("../../src/lib/combos/steps.ts"); async function resetStorage() { comboMetrics.resetAllComboMetrics(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -120,7 +120,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/combo-health-route.test.ts b/tests/unit/combo-health-route.test.ts index 9aae08757d..489ef8c534 100644 --- a/tests/unit/combo-health-route.test.ts +++ b/tests/unit/combo-health-route.test.ts @@ -18,7 +18,7 @@ const { normalizeComboStep } = await import("../../src/lib/combos/steps.ts"); async function resetStorage() { comboMetrics.resetAllComboMetrics(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.beforeEach(async () => { test.after(() => { comboMetrics.resetAllComboMetrics(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo health route exposes step-level target health for structured combos", async () => { diff --git a/tests/unit/combo-hidden-leaf-routing.test.ts b/tests/unit/combo-hidden-leaf-routing.test.ts index 3c340c5b20..87c590ec5b 100644 --- a/tests/unit/combo-hidden-leaf-routing.test.ts +++ b/tests/unit/combo-hidden-leaf-routing.test.ts @@ -21,13 +21,13 @@ function okResponse(): Response { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("handleComboChat never routes hidden leaves in priority, weighted, or round-robin combos", async () => { diff --git a/tests/unit/combo-id-resolution-4446.test.ts b/tests/unit/combo-id-resolution-4446.test.ts index 6b69a49f8f..e714dac404 100644 --- a/tests/unit/combo-id-resolution-4446.test.ts +++ b/tests/unit/combo-id-resolution-4446.test.ts @@ -21,7 +21,7 @@ const sseModelService = await import("../../src/sse/services/model.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4446 getComboForModel resolves a combo by a case-insensitive name (lowercased slug)", async () => { diff --git a/tests/unit/combo-lockout-quota-reset-6863.test.ts b/tests/unit/combo-lockout-quota-reset-6863.test.ts index 84eb7ed70a..e2b6f43dc4 100644 --- a/tests/unit/combo-lockout-quota-reset-6863.test.ts +++ b/tests/unit/combo-lockout-quota-reset-6863.test.ts @@ -31,7 +31,7 @@ test.after(() => { clearAllModelLockouts(); try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/combo-model-name-collision-8530.test.ts b/tests/unit/combo-model-name-collision-8530.test.ts index fcdf09a827..f9d8da17ab 100644 --- a/tests/unit/combo-model-name-collision-8530.test.ts +++ b/tests/unit/combo-model-name-collision-8530.test.ts @@ -35,7 +35,7 @@ interface ComboResponseBody { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -61,7 +61,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("POST /api/combos: name colliding with a real model id is created (#6940 pattern), with a warning", async () => { diff --git a/tests/unit/combo-patch-verb.test.ts b/tests/unit/combo-patch-verb.test.ts index c72d0e23d4..9f35123ad5 100644 --- a/tests/unit/combo-patch-verb.test.ts +++ b/tests/unit/combo-patch-verb.test.ts @@ -13,7 +13,7 @@ const comboRoute = await import("../../src/app/api/combos/[id]/route.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function patch(id: string, body: Record) { diff --git a/tests/unit/combo-prescreen.test.ts b/tests/unit/combo-prescreen.test.ts index 63d681b9c5..7d687227a6 100644 --- a/tests/unit/combo-prescreen.test.ts +++ b/tests/unit/combo-prescreen.test.ts @@ -14,7 +14,7 @@ const combosDb = await import("../../src/lib/db/combos.ts"); after(() => { dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts b/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts index 252c9cef3b..8cb5f018d8 100644 --- a/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts +++ b/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts @@ -33,7 +33,7 @@ const { getCircuitBreaker } = await import("../../src/shared/utils/circuitBreake test.after(() => { dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makeLog() { diff --git a/tests/unit/combo-quota-exhaustion-only-fallback.test.ts b/tests/unit/combo-quota-exhaustion-only-fallback.test.ts index cbb4f70c11..0db3589e99 100644 --- a/tests/unit/combo-quota-exhaustion-only-fallback.test.ts +++ b/tests/unit/combo-quota-exhaustion-only-fallback.test.ts @@ -26,7 +26,7 @@ test.after(() => { resetDbInstance(); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function log() { diff --git a/tests/unit/combo-quota-share-cooldown-wait.test.ts b/tests/unit/combo-quota-share-cooldown-wait.test.ts index ba33def470..a803245320 100644 --- a/tests/unit/combo-quota-share-cooldown-wait.test.ts +++ b/tests/unit/combo-quota-share-cooldown-wait.test.ts @@ -94,7 +94,7 @@ function comboOf(strategy: string) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -107,7 +107,7 @@ test.after(async () => { clearAllModelLockouts(); try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/combo-quota-token-limit.test.ts b/tests/unit/combo-quota-token-limit.test.ts index 53ecdb91c1..e93f090606 100644 --- a/tests/unit/combo-quota-token-limit.test.ts +++ b/tests/unit/combo-quota-token-limit.test.ts @@ -23,7 +23,7 @@ test.after(() => { else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_QUOTA_ROUTING === undefined) delete process.env.OMNIROUTE_QUOTA_AWARE_ROUTING; else process.env.OMNIROUTE_QUOTA_AWARE_ROUTING = ORIGINAL_QUOTA_ROUTING; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("round-robin quota reservation keeps the connection token limit", async () => { diff --git a/tests/unit/combo-resource-404-health.test.ts b/tests/unit/combo-resource-404-health.test.ts index a7d318a8d3..fa5e71a15e 100644 --- a/tests/unit/combo-resource-404-health.test.ts +++ b/tests/unit/combo-resource-404-health.test.ts @@ -47,7 +47,7 @@ test.after(() => { clearAllModelLockouts(); clearCooldownState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo resource 404 never records model lockout or provider cooldown", async () => { diff --git a/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts b/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts index 8ab28e1085..0aa1a04799 100644 --- a/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts +++ b/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts @@ -80,7 +80,7 @@ test.after(() => { clearModelsDevCapabilities(); settingsDb.clearAllLKGP(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/combo-routes-composite-tiers.test.ts b/tests/unit/combo-routes-composite-tiers.test.ts index bb1cbc0f93..6661f7171b 100644 --- a/tests/unit/combo-routes-composite-tiers.test.ts +++ b/tests/unit/combo-routes-composite-tiers.test.ts @@ -14,7 +14,7 @@ const comboRoute = await import("../../src/app/api/combos/[id]/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -77,7 +77,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("POST /api/combos persists names with spaces and square brackets", async () => { diff --git a/tests/unit/combo-routing-engine.test.ts b/tests/unit/combo-routing-engine.test.ts index bcf8f5dc0d..8ffe458cb4 100644 --- a/tests/unit/combo-routing-engine.test.ts +++ b/tests/unit/combo-routing-engine.test.ts @@ -126,7 +126,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: any) { lastError = error; diff --git a/tests/unit/combo-rr-fallback-advance-948.test.ts b/tests/unit/combo-rr-fallback-advance-948.test.ts index 3ff204c8db..7adc8278f1 100644 --- a/tests/unit/combo-rr-fallback-advance-948.test.ts +++ b/tests/unit/combo-rr-fallback-advance-948.test.ts @@ -89,7 +89,7 @@ test.after(() => { } if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#948: two consecutive requests do not reuse the fallback-served model", async () => { diff --git a/tests/unit/combo-rr-session-stickiness-3825.test.ts b/tests/unit/combo-rr-session-stickiness-3825.test.ts index 9ef5ed2d2c..b2b5c11981 100644 --- a/tests/unit/combo-rr-session-stickiness-3825.test.ts +++ b/tests/unit/combo-rr-session-stickiness-3825.test.ts @@ -79,7 +79,7 @@ test.beforeEach(() => { test.after(() => { stick.__setStickinessHeadroomFetcherForTests(null); dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-runtime-unit-concurrency.test.ts b/tests/unit/combo-runtime-unit-concurrency.test.ts index 8ccebe4603..ac2695c4a1 100644 --- a/tests/unit/combo-runtime-unit-concurrency.test.ts +++ b/tests/unit/combo-runtime-unit-concurrency.test.ts @@ -63,7 +63,7 @@ test.after(() => { resetDbInstance(); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("isRuntimeUnitAtConcurrencyCap returns true for a model unit at cap", async () => { diff --git a/tests/unit/combo-scope-proxy-dead-7149.test.ts b/tests/unit/combo-scope-proxy-dead-7149.test.ts index 8d301763e9..06e4592a6f 100644 --- a/tests/unit/combo-scope-proxy-dead-7149.test.ts +++ b/tests/unit/combo-scope-proxy-dead-7149.test.ts @@ -22,13 +22,13 @@ type ProxyResolutionLike = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7149: a proxy assigned to a Combo via the dashboard (registry scope='combo') is honored when resolving the proxy for a request routed through that combo", async () => { diff --git a/tests/unit/combo-scoring-inspector.test.ts b/tests/unit/combo-scoring-inspector.test.ts index 12062cbbe5..a8d4f4c9a2 100644 --- a/tests/unit/combo-scoring-inspector.test.ts +++ b/tests/unit/combo-scoring-inspector.test.ts @@ -36,7 +36,7 @@ async function resetStorage() { clearAllModelLockouts(); resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -145,7 +145,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/combo-selected-connection-success.test.ts b/tests/unit/combo-selected-connection-success.test.ts index 2e986639c7..fc4a32a431 100644 --- a/tests/unit/combo-selected-connection-success.test.ts +++ b/tests/unit/combo-selected-connection-success.test.ts @@ -47,7 +47,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: any) { lastError = error; diff --git a/tests/unit/combo-sessionless-pin-3825.test.ts b/tests/unit/combo-sessionless-pin-3825.test.ts index d8bcd2207f..e71e90c16c 100644 --- a/tests/unit/combo-sessionless-pin-3825.test.ts +++ b/tests/unit/combo-sessionless-pin-3825.test.ts @@ -56,7 +56,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: any) { lastError = error; diff --git a/tests/unit/combo-silent-stop-gaps.test.ts b/tests/unit/combo-silent-stop-gaps.test.ts index 3b101a20c0..5ace242f14 100644 --- a/tests/unit/combo-silent-stop-gaps.test.ts +++ b/tests/unit/combo-silent-stop-gaps.test.ts @@ -90,7 +90,7 @@ test.after(async () => { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/combo-speed-telemetry-6875.test.ts b/tests/unit/combo-speed-telemetry-6875.test.ts index 6bef6edd58..81cb355442 100644 --- a/tests/unit/combo-speed-telemetry-6875.test.ts +++ b/tests/unit/combo-speed-telemetry-6875.test.ts @@ -36,7 +36,7 @@ const core = await import("../../src/lib/db/core.ts"); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/combo-stickiness-responses-input-7270.test.ts b/tests/unit/combo-stickiness-responses-input-7270.test.ts index 125b551b5b..ec4045fde0 100644 --- a/tests/unit/combo-stickiness-responses-input-7270.test.ts +++ b/tests/unit/combo-stickiness-responses-input-7270.test.ts @@ -92,7 +92,7 @@ test.beforeEach(() => { test.after(() => { stick.__setStickinessHeadroomFetcherForTests(null); dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-strategies.test.ts b/tests/unit/combo-strategies.test.ts index 127a20ab80..dd0c7be367 100644 --- a/tests/unit/combo-strategies.test.ts +++ b/tests/unit/combo-strategies.test.ts @@ -24,7 +24,7 @@ const { saveModelsDevCapabilities } = await import("../../src/lib/modelsDevSync. after(() => { dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/combo-strategy-fallbacks.test.ts b/tests/unit/combo-strategy-fallbacks.test.ts index 88792e64cc..1cd34ef7b6 100644 --- a/tests/unit/combo-strategy-fallbacks.test.ts +++ b/tests/unit/combo-strategy-fallbacks.test.ts @@ -55,7 +55,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: any) { lastError = error; diff --git a/tests/unit/combo-strict-random-distribution-3959.test.ts b/tests/unit/combo-strict-random-distribution-3959.test.ts index 5209b6c49c..4bb177b64e 100644 --- a/tests/unit/combo-strict-random-distribution-3959.test.ts +++ b/tests/unit/combo-strict-random-distribution-3959.test.ts @@ -61,7 +61,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3959 strict-random spreads the fallback across healthy peers, not a fixed model", async () => { diff --git a/tests/unit/combo-system-prompt-templates-5501.test.ts b/tests/unit/combo-system-prompt-templates-5501.test.ts index e31e14fde3..0d1321e15e 100644 --- a/tests/unit/combo-system-prompt-templates-5501.test.ts +++ b/tests/unit/combo-system-prompt-templates-5501.test.ts @@ -176,7 +176,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/combo-target-resolution-split.test.ts b/tests/unit/combo-target-resolution-split.test.ts index 92d95f570a..9f80ff17fd 100644 --- a/tests/unit/combo-target-resolution-split.test.ts +++ b/tests/unit/combo-target-resolution-split.test.ts @@ -30,7 +30,7 @@ test.after(() => { } else { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { diff --git a/tests/unit/combo-test-route.test.ts b/tests/unit/combo-test-route.test.ts index 022732e02c..b70f11fd94 100644 --- a/tests/unit/combo-test-route.test.ts +++ b/tests/unit/combo-test-route.test.ts @@ -19,7 +19,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -55,7 +55,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("combo test route validates request payloads and combo existence", async () => { diff --git a/tests/unit/combo-vision-aware-routing.test.ts b/tests/unit/combo-vision-aware-routing.test.ts index 8d5c186c3f..d77da16bb2 100644 --- a/tests/unit/combo-vision-aware-routing.test.ts +++ b/tests/unit/combo-vision-aware-routing.test.ts @@ -42,7 +42,7 @@ const { deriveRequestCompatibilityRequirements, hasHardCapabilityFailure } = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --- Part A: capability resolution ----------------------------------------- diff --git a/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts b/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts index 7db23c6ce5..5db4619676 100644 --- a/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts +++ b/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts @@ -32,7 +32,7 @@ const failureTracker = await import("../../../open-sse/services/combo/failureTra test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("recordComboFailure clears only the failing session's pin, leaving other sessions on the same combo untouched", () => { diff --git a/tests/unit/combo/image-combo.test.ts b/tests/unit/combo/image-combo.test.ts index d122dace10..a1f539b638 100644 --- a/tests/unit/combo/image-combo.test.ts +++ b/tests/unit/combo/image-combo.test.ts @@ -62,7 +62,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: unknown) { lastError = error; diff --git a/tests/unit/combo/reset-window-strategy-9330.test.ts b/tests/unit/combo/reset-window-strategy-9330.test.ts index 30bfcd43d0..6485056564 100644 --- a/tests/unit/combo/reset-window-strategy-9330.test.ts +++ b/tests/unit/combo/reset-window-strategy-9330.test.ts @@ -42,7 +42,7 @@ const { registerQuotaFetcher } = await import("../../../open-sse/services/quotaP after(() => { dbCore.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/combo/speech-combo.test.ts b/tests/unit/combo/speech-combo.test.ts index d011de5ba4..b0e49025b5 100644 --- a/tests/unit/combo/speech-combo.test.ts +++ b/tests/unit/combo/speech-combo.test.ts @@ -42,7 +42,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: unknown) { lastError = error; diff --git a/tests/unit/combo/strict-context-failopen-8786.test.ts b/tests/unit/combo/strict-context-failopen-8786.test.ts index 68a1e8c75c..39ba5f3ad8 100644 --- a/tests/unit/combo/strict-context-failopen-8786.test.ts +++ b/tests/unit/combo/strict-context-failopen-8786.test.ts @@ -28,7 +28,7 @@ const { applyContextRequirements } = await import( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function target(provider: string, modelStr: string) { diff --git a/tests/unit/combo/video-combo.test.ts b/tests/unit/combo/video-combo.test.ts index d429ada930..bb280b161f 100644 --- a/tests/unit/combo/video-combo.test.ts +++ b/tests/unit/combo/video-combo.test.ts @@ -59,7 +59,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: unknown) { lastError = error; diff --git a/tests/unit/combos-duplicate-resolution-audit.test.ts b/tests/unit/combos-duplicate-resolution-audit.test.ts index ea304e8a85..78d7bf21c6 100644 --- a/tests/unit/combos-duplicate-resolution-audit.test.ts +++ b/tests/unit/combos-duplicate-resolution-audit.test.ts @@ -22,7 +22,7 @@ const { resolveBuiltinAutoSpec } = test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/combos-duplicate-route.test.ts b/tests/unit/combos-duplicate-route.test.ts index 447c26583b..5e957d8a9e 100644 --- a/tests/unit/combos-duplicate-route.test.ts +++ b/tests/unit/combos-duplicate-route.test.ts @@ -38,7 +38,7 @@ function makePostRequest(url: string, body: unknown, apiKey?: string): Request { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/combos-quota-protected.test.ts b/tests/unit/combos-quota-protected.test.ts index cf2c4ad6ce..63de82ce00 100644 --- a/tests/unit/combos-quota-protected.test.ts +++ b/tests/unit/combos-quota-protected.test.ts @@ -13,7 +13,7 @@ const comboRoute = await import("../../src/app/api/combos/[id]/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ---- quota-protected combos ---- diff --git a/tests/unit/command-code-auth-assist.test.ts b/tests/unit/command-code-auth-assist.test.ts index f8ca2c8a66..0972d8a981 100644 --- a/tests/unit/command-code-auth-assist.test.ts +++ b/tests/unit/command-code-auth-assist.test.ts @@ -19,7 +19,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Command Code auth assist start/callback/status/apply keeps state hash and key private", async () => { diff --git a/tests/unit/command-code-executor.test.ts b/tests/unit/command-code-executor.test.ts index e9b305468d..59224676f6 100644 --- a/tests/unit/command-code-executor.test.ts +++ b/tests/unit/command-code-executor.test.ts @@ -72,7 +72,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Command Code provider catalog has pinned models and alias lookup", () => { diff --git a/tests/unit/command-code-user-array-5166.test.ts b/tests/unit/command-code-user-array-5166.test.ts index a692012ed0..9d3b8a42de 100644 --- a/tests/unit/command-code-user-array-5166.test.ts +++ b/tests/unit/command-code-user-array-5166.test.ts @@ -32,7 +32,7 @@ function okResponse() { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.afterEach(() => { diff --git a/tests/unit/command-code-vision.test.ts b/tests/unit/command-code-vision.test.ts index 3640139755..1589bd4649 100644 --- a/tests/unit/command-code-vision.test.ts +++ b/tests/unit/command-code-vision.test.ts @@ -30,7 +30,7 @@ function okResponse() { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.afterEach(() => { diff --git a/tests/unit/compliance-audit-route.test.ts b/tests/unit/compliance-audit-route.test.ts index 51e4fc9c09..4004ddd25b 100644 --- a/tests/unit/compliance-audit-route.test.ts +++ b/tests/unit/compliance-audit-route.test.ts @@ -13,7 +13,7 @@ const auditRoute = await import("../../src/app/api/compliance/audit-log/route.ts function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("compliance audit route keeps array payloads and exposes total count with structured filters", async () => { diff --git a/tests/unit/compliance-index.test.ts b/tests/unit/compliance-index.test.ts index f99a5a4b26..7d94572487 100644 --- a/tests/unit/compliance-index.test.ts +++ b/tests/unit/compliance-index.test.ts @@ -15,7 +15,7 @@ const compliance = await import("../../src/lib/compliance/index.ts"); function resetDb() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -26,7 +26,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("compliance audit log initialization, writes and filtered reads work end to end", () => { diff --git a/tests/unit/compression-settings-cache.test.ts b/tests/unit/compression-settings-cache.test.ts index 729e4c8a25..8b0e9f8285 100644 --- a/tests/unit/compression-settings-cache.test.ts +++ b/tests/unit/compression-settings-cache.test.ts @@ -24,7 +24,7 @@ function cleanup() { delete process.env.DATA_DIR; } try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } diff --git a/tests/unit/compression-tokens.test.ts b/tests/unit/compression-tokens.test.ts index a7a5a422b8..fcb8709e99 100644 --- a/tests/unit/compression-tokens.test.ts +++ b/tests/unit/compression-tokens.test.ts @@ -93,6 +93,6 @@ test("tokensCompressed round-trips through saveCallLog → getCallLogs", async ( assert.equal(logComp.tokens?.in, 1000); assert.equal(logComp.tokens?.out, 500); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/compression/active-combo-integration.test.ts b/tests/unit/compression/active-combo-integration.test.ts index 09e1c641cd..982b3631e5 100644 --- a/tests/unit/compression/active-combo-integration.test.ts +++ b/tests/unit/compression/active-combo-integration.test.ts @@ -16,7 +16,7 @@ const { DEFAULT_COMPRESSION_CONFIG } = await import("../../../open-sse/services/ after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL; }); diff --git a/tests/unit/compression/adaptive-context-budget-config.test.ts b/tests/unit/compression/adaptive-context-budget-config.test.ts index 4dd4acb68c..ab9aaf7900 100644 --- a/tests/unit/compression/adaptive-context-budget-config.test.ts +++ b/tests/unit/compression/adaptive-context-budget-config.test.ts @@ -31,7 +31,7 @@ const { DEFAULT_CONTEXT_BUDGET } = await import( beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -41,7 +41,7 @@ afterEach(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/caveman-db.test.ts b/tests/unit/compression/caveman-db.test.ts index b1cd5f8592..2257c9abb9 100644 --- a/tests/unit/compression/caveman-db.test.ts +++ b/tests/unit/compression/caveman-db.test.ts @@ -16,7 +16,7 @@ const { getCompressionSettings, updateCompressionSettings } = describe("compression DB module", () => { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -26,7 +26,7 @@ describe("compression DB module", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/compareRoute.test.ts b/tests/unit/compression/compareRoute.test.ts index c3d75f7b0e..dbbaa26269 100644 --- a/tests/unit/compression/compareRoute.test.ts +++ b/tests/unit/compression/compareRoute.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("ranks a high-savings engine above a no-op for repetitive tool output", async () => { const text = ["$ npm install", "npm warn deprecated glob@7.2.3: no longer supported", diff --git a/tests/unit/compression/compression-combos-db.test.ts b/tests/unit/compression/compression-combos-db.test.ts index 0b58800334..14cd61be95 100644 --- a/tests/unit/compression/compression-combos-db.test.ts +++ b/tests/unit/compression/compression-combos-db.test.ts @@ -13,7 +13,7 @@ const combosDb = await import("../../../src/lib/db/compressionCombos.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/compression-engines-map-migration.test.ts b/tests/unit/compression/compression-engines-map-migration.test.ts index d315c737e5..d8ef8e3530 100644 --- a/tests/unit/compression/compression-engines-map-migration.test.ts +++ b/tests/unit/compression/compression-engines-map-migration.test.ts @@ -15,13 +15,13 @@ const { getCompressionSettings, updateCompressionSettings } = await import( function freshDir() { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/compression-preview-auth.test.ts b/tests/unit/compression/compression-preview-auth.test.ts index b5bfb1332e..0e6ebc5553 100644 --- a/tests/unit/compression/compression-preview-auth.test.ts +++ b/tests/unit/compression/compression-preview-auth.test.ts @@ -24,7 +24,7 @@ type ErrorResponseBody = { async function resetAuthRequiredStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -44,7 +44,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("compression preview requires management auth before reading preview input", async () => { diff --git a/tests/unit/compression/compressionAnalytics.test.ts b/tests/unit/compression/compressionAnalytics.test.ts index eaef7898df..7402059c82 100644 --- a/tests/unit/compression/compressionAnalytics.test.ts +++ b/tests/unit/compression/compressionAnalytics.test.ts @@ -42,7 +42,7 @@ describe("compressionAnalytics", () => { after(() => { core.closeDbInstance(); - rmSync(tmpDir, { recursive: true, force: true }); + rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("empty table returns zeroed summary", () => { diff --git a/tests/unit/compression/db.test.ts b/tests/unit/compression/db.test.ts index 1861e71dcf..957cdbf899 100644 --- a/tests/unit/compression/db.test.ts +++ b/tests/unit/compression/db.test.ts @@ -14,7 +14,7 @@ const { getCompressionSettings, updateCompressionSettings } = beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -24,7 +24,7 @@ afterEach(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/headroom-minrows-persist-8056.test.ts b/tests/unit/compression/headroom-minrows-persist-8056.test.ts index de52eb5b11..717af14673 100644 --- a/tests/unit/compression/headroom-minrows-persist-8056.test.ts +++ b/tests/unit/compression/headroom-minrows-persist-8056.test.ts @@ -32,7 +32,7 @@ const { getCompressionSettings, updateCompressionSettings } = beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -42,7 +42,7 @@ afterEach(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/llmlingua-model-store.test.ts b/tests/unit/compression/llmlingua-model-store.test.ts index 0459432b5b..18f820a573 100644 --- a/tests/unit/compression/llmlingua-model-store.test.ts +++ b/tests/unit/compression/llmlingua-model-store.test.ts @@ -87,7 +87,7 @@ describe("getLlmlinguaModelCacheDir", () => { } if (tmpDir) { try { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore cleanup errors */ } diff --git a/tests/unit/compression/llmlingua-worker-resolution.test.ts b/tests/unit/compression/llmlingua-worker-resolution.test.ts index cd7df8e9ac..356ef718fd 100644 --- a/tests/unit/compression/llmlingua-worker-resolution.test.ts +++ b/tests/unit/compression/llmlingua-worker-resolution.test.ts @@ -67,7 +67,7 @@ test("firstAncestorWith walks up from anchors to find a marker", () => { assert.equal(found, path.join(tmp, "dist"), "must find the dist root by walking up"); assert.equal(firstAncestorWith([anchor], path.join("node_modules", "nope")), null); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/compression/mcp-accessibility-config.test.ts b/tests/unit/compression/mcp-accessibility-config.test.ts index 96431eddfb..da14e4d30d 100644 --- a/tests/unit/compression/mcp-accessibility-config.test.ts +++ b/tests/unit/compression/mcp-accessibility-config.test.ts @@ -24,7 +24,7 @@ const route = await import("../../../src/app/api/settings/compression/mcp-access function resetDir() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ describe("mcpAccessibility config reachability", () => { afterEach(() => core.resetDbInstance()); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/compression/omniglyph-profile-config.test.ts b/tests/unit/compression/omniglyph-profile-config.test.ts index d24f361bae..151d204885 100644 --- a/tests/unit/compression/omniglyph-profile-config.test.ts +++ b/tests/unit/compression/omniglyph-profile-config.test.ts @@ -27,7 +27,7 @@ const { getCompressionSettings, updateCompressionSettings } = await import( beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -37,7 +37,7 @@ afterEach(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/compression/omniglyph-registries.test.ts b/tests/unit/compression/omniglyph-registries.test.ts index 895f1c54e2..5737c3c6fc 100644 --- a/tests/unit/compression/omniglyph-registries.test.ts +++ b/tests/unit/compression/omniglyph-registries.test.ts @@ -25,13 +25,13 @@ const { compressionConfigureInput } = await import("../../../open-sse/mcp-server beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/compression/preserve-system-prompt-mode-db.test.ts b/tests/unit/compression/preserve-system-prompt-mode-db.test.ts index ab3ae491f7..8837a08b34 100644 --- a/tests/unit/compression/preserve-system-prompt-mode-db.test.ts +++ b/tests/unit/compression/preserve-system-prompt-mode-db.test.ts @@ -38,7 +38,7 @@ test.after(async () => { /* core never loaded */ } try { - fs.rmSync(TEMP_DIR, { recursive: true, force: true }); + fs.rmSync(TEMP_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best-effort */ } diff --git a/tests/unit/compression/preview-fallback-reasons-6461.test.ts b/tests/unit/compression/preview-fallback-reasons-6461.test.ts index 4de93f128f..4b15d63e6c 100644 --- a/tests/unit/compression/preview-fallback-reasons-6461.test.ts +++ b/tests/unit/compression/preview-fallback-reasons-6461.test.ts @@ -29,7 +29,7 @@ function makeReq(body: unknown) { test.beforeEach(() => core.resetDbInstance()); test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6461 preview exposes fallbackReasons and mirrors it into skippedReasons", async () => { diff --git a/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts b/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts index 0d7d01da9b..2096bff502 100644 --- a/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts +++ b/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts @@ -22,7 +22,7 @@ function makeReq(body: unknown) { test.beforeEach(() => core.resetDbInstance()); test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression for #6488: outer originalTokens/compressedTokens (real tiktoken counter over diff --git a/tests/unit/compression/previewRouteBreakdown.test.ts b/tests/unit/compression/previewRouteBreakdown.test.ts index a4053bd73c..f1de1203df 100644 --- a/tests/unit/compression/previewRouteBreakdown.test.ts +++ b/tests/unit/compression/previewRouteBreakdown.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("response carries a non-empty engineBreakdown for a single engine", async () => { const res = await route.POST(makeReq({ messages: [{ role: "user", content: "$ git status\nOn branch main\nnothing to commit" }], diff --git a/tests/unit/compression/previewRouteFidelity.test.ts b/tests/unit/compression/previewRouteFidelity.test.ts index b87f70b6b4..0bc849f80f 100644 --- a/tests/unit/compression/previewRouteFidelity.test.ts +++ b/tests/unit/compression/previewRouteFidelity.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("fidelityGate flag is accepted (200) and preview still works", async () => { const res = await route.POST(makeReq({ diff --git a/tests/unit/compression/previewRouteFuzzy.test.ts b/tests/unit/compression/previewRouteFuzzy.test.ts index 3b4b31159c..48f2c4502e 100644 --- a/tests/unit/compression/previewRouteFuzzy.test.ts +++ b/tests/unit/compression/previewRouteFuzzy.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const A = "alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu nu xi omicron pi rho"; diff --git a/tests/unit/compression/previewRouteIonizer.test.ts b/tests/unit/compression/previewRouteIonizer.test.ts index eebcb0989d..de6fa444e5 100644 --- a/tests/unit/compression/previewRouteIonizer.test.ts +++ b/tests/unit/compression/previewRouteIonizer.test.ts @@ -16,7 +16,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the ionizer lane samples an oversized JSON array into a CCR marker", async () => { const big = JSON.stringify(Array.from({ length: 400 }, (_, i) => ({ i, v: `r${i}` }))); diff --git a/tests/unit/compression/previewRoutePipeline.test.ts b/tests/unit/compression/previewRoutePipeline.test.ts index b90ddfcc73..c9456c5dc6 100644 --- a/tests/unit/compression/previewRoutePipeline.test.ts +++ b/tests/unit/compression/previewRoutePipeline.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("pipeline runs the engines in the GIVEN order (reversed vs default rtk→caveman)", async () => { const text = "$ pytest\ntests/a.py ....\nbasically what I mean is that you should loop through them one by one"; const res = await route.POST(makeReq({ messages: [{ role: "user", content: text }], pipeline: ["caveman", "rtk"] })); diff --git a/tests/unit/compression/previewRouteTokens.test.ts b/tests/unit/compression/previewRouteTokens.test.ts index b0b36d313b..033baaaba5 100644 --- a/tests/unit/compression/previewRouteTokens.test.ts +++ b/tests/unit/compression/previewRouteTokens.test.ts @@ -19,7 +19,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("originalTokens equals countTextTokens, not the *1.33 estimate", async () => { const text = "the quick brown fox jumps over the lazy dog repeatedly and often"; diff --git a/tests/unit/compression/previewRouteToon.test.ts b/tests/unit/compression/previewRouteToon.test.ts index f10d9dcbd9..d912e77b08 100644 --- a/tests/unit/compression/previewRouteToon.test.ts +++ b/tests/unit/compression/previewRouteToon.test.ts @@ -20,7 +20,7 @@ function makeReq(body: unknown) { test.beforeEach(() => core.resetDbInstance()); test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("headroom engine carries encoderComparison with one array and a valid winner", async () => { diff --git a/tests/unit/compression/retrieveRoute.test.ts b/tests/unit/compression/retrieveRoute.test.ts index cbff7a447c..328ed61773 100644 --- a/tests/unit/compression/retrieveRoute.test.ts +++ b/tests/unit/compression/retrieveRoute.test.ts @@ -15,7 +15,7 @@ function makeReq(body: unknown) { }); } test.beforeEach(() => core.resetDbInstance()); -test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true }); }); +test.after(() => { core.resetDbInstance(); rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("400 when hash is missing", async () => { const res = await route.POST(makeReq({})); assert.equal(res.status, 400); diff --git a/tests/unit/compression/retrieveRouteRanged.test.ts b/tests/unit/compression/retrieveRouteRanged.test.ts index a1dd2a941e..3f002e1872 100644 --- a/tests/unit/compression/retrieveRouteRanged.test.ts +++ b/tests/unit/compression/retrieveRouteRanged.test.ts @@ -24,7 +24,7 @@ test.beforeEach(() => { }); test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("mode:head n:2 returns first 2 lines", async () => { diff --git a/tests/unit/compression/rtk-command-samples.test.ts b/tests/unit/compression/rtk-command-samples.test.ts index b352e38647..81fbfbd5eb 100644 --- a/tests/unit/compression/rtk-command-samples.test.ts +++ b/tests/unit/compression/rtk-command-samples.test.ts @@ -35,7 +35,7 @@ beforeEach(() => { afterEach(() => { if (prevDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = prevDataDir; - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("maybePersistRtkRawOutput — command sidecar", () => { diff --git a/tests/unit/compression/rtk-grouping-config.test.ts b/tests/unit/compression/rtk-grouping-config.test.ts index 6a65b1b6e3..2147ca3047 100644 --- a/tests/unit/compression/rtk-grouping-config.test.ts +++ b/tests/unit/compression/rtk-grouping-config.test.ts @@ -23,7 +23,7 @@ const { getCompressionSettings, updateCompressionSettings } = await import( describe("RTK grouping config persistence (R5)", () => { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -33,7 +33,7 @@ describe("RTK grouping config persistence (R5)", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/compression/rtk-mcp-tools.test.ts b/tests/unit/compression/rtk-mcp-tools.test.ts index aefba54d0b..b7288d697f 100644 --- a/tests/unit/compression/rtk-mcp-tools.test.ts +++ b/tests/unit/compression/rtk-mcp-tools.test.ts @@ -42,14 +42,14 @@ function seedSamples() { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); core.getDbInstance(); // run migrations → mcp_tool_audit table exists }); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("RTK MCP tools (T07)", () => { diff --git a/tests/unit/compression/rtk-raw-output-route.test.ts b/tests/unit/compression/rtk-raw-output-route.test.ts index 0ab56c1928..7eca439114 100644 --- a/tests/unit/compression/rtk-raw-output-route.test.ts +++ b/tests/unit/compression/rtk-raw-output-route.test.ts @@ -23,7 +23,7 @@ type ErrorResponseBody = { async function resetAuthRequiredStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: true, @@ -43,7 +43,7 @@ test.after(() => { if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("RTK raw-output route requires management auth before reading retained output", async () => { diff --git a/tests/unit/compression/rtk-renderers-config.test.ts b/tests/unit/compression/rtk-renderers-config.test.ts index 2be878169d..86812f8241 100644 --- a/tests/unit/compression/rtk-renderers-config.test.ts +++ b/tests/unit/compression/rtk-renderers-config.test.ts @@ -22,7 +22,7 @@ describe("RTK renderer config persistence", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/compression/rtk-strip-comments.test.ts b/tests/unit/compression/rtk-strip-comments.test.ts index f9b70963ab..c69a8ab9de 100644 --- a/tests/unit/compression/rtk-strip-comments.test.ts +++ b/tests/unit/compression/rtk-strip-comments.test.ts @@ -99,7 +99,7 @@ describe("RTK strip-code-comments — runtime reachability", () => { describe("RTK strip-code-comments — config persistence", () => { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -109,7 +109,7 @@ describe("RTK strip-code-comments — config persistence", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/conductor-a2a-post.test.ts b/tests/unit/conductor-a2a-post.test.ts index 7cbae0e4d6..27d54ae117 100644 --- a/tests/unit/conductor-a2a-post.test.ts +++ b/tests/unit/conductor-a2a-post.test.ts @@ -37,7 +37,7 @@ const VALID_BODY = { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.CONDUCTOR_HUB_URL; delete process.env.OMNIROUTE_API_KEY; @@ -45,7 +45,7 @@ test.beforeEach(() => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.CONDUCTOR_HUB_URL; delete process.env.OMNIROUTE_API_KEY; while (servers.length > 0) { diff --git a/tests/unit/conductor-ask-route.test.ts b/tests/unit/conductor-ask-route.test.ts index 9edfffbc8d..63277546b3 100644 --- a/tests/unit/conductor-ask-route.test.ts +++ b/tests/unit/conductor-ask-route.test.ts @@ -15,14 +15,14 @@ const servers: Server[] = []; test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.CONDUCTOR_SPOKESPERSON_URL; }); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.CONDUCTOR_SPOKESPERSON_URL; while (servers.length > 0) { const s = servers.pop(); diff --git a/tests/unit/conductor-fleet-route.test.ts b/tests/unit/conductor-fleet-route.test.ts index 4fb4b88a2b..0ccb93dee7 100644 --- a/tests/unit/conductor-fleet-route.test.ts +++ b/tests/unit/conductor-fleet-route.test.ts @@ -32,7 +32,7 @@ function fakeHub(routes: Record): Pro test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.CONDUCTOR_HUB_URL; delete process.env.CONDUCTOR_HUB_TOKEN; @@ -40,7 +40,7 @@ test.beforeEach(() => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.CONDUCTOR_HUB_URL; while (servers.length > 0) { const s = servers.pop(); diff --git a/tests/unit/config-audit-persistence.test.ts b/tests/unit/config-audit-persistence.test.ts index 4bad88bc5d..ec997a72dd 100644 --- a/tests/unit/config-audit-persistence.test.ts +++ b/tests/unit/config-audit-persistence.test.ts @@ -16,7 +16,7 @@ type CountRow = { c: number }; function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/config-expiry-time-bomb.test.ts b/tests/unit/config-expiry-time-bomb.test.ts index 7740e09e5c..dbb837f2ab 100644 --- a/tests/unit/config-expiry-time-bomb.test.ts +++ b/tests/unit/config-expiry-time-bomb.test.ts @@ -92,7 +92,7 @@ test("scanConfigExpiry: walks a config tree, skips node_modules and invalid JSON const found = scanConfigExpiry(dir).map((f) => `${f.file}:${f.keyPath}`); assert.deepEqual(found, ["a.json:validUntil", "sub/b.json:deep.expiresAt"]); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/config-hot-reload.test.ts b/tests/unit/config-hot-reload.test.ts index fabd87a500..195421ede1 100644 --- a/tests/unit/config-hot-reload.test.ts +++ b/tests/unit/config-hot-reload.test.ts @@ -45,7 +45,7 @@ async function resetStorage() { }); invalidateCacheControlSettingsCache(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/console-interceptor-message-fidelity.test.ts b/tests/unit/console-interceptor-message-fidelity.test.ts index ab1cd6f90e..e3c8e2d2de 100644 --- a/tests/unit/console-interceptor-message-fidelity.test.ts +++ b/tests/unit/console-interceptor-message-fidelity.test.ts @@ -64,7 +64,7 @@ test("the interceptor keeps the component and substitutes printf formats", () => assert.equal(plain, 'plain message {"a":1}'); } finally { __consoleInterceptorInternals.reset(); - fs.rmSync(LOG_DIR, { recursive: true, force: true }); + fs.rmSync(LOG_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -90,6 +90,6 @@ test("a first argument that coincidentally contains a printf token does not swal assert.ok(entry.includes(err.stack || ""), "Error stack was dropped"); } finally { __consoleInterceptorInternals.reset(); - fs.rmSync(LOG_DIR, { recursive: true, force: true }); + fs.rmSync(LOG_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/context-handoff.test.ts b/tests/unit/context-handoff.test.ts index a19b8734a8..8bbd7fac83 100644 --- a/tests/unit/context-handoff.test.ts +++ b/tests/unit/context-handoff.test.ts @@ -13,7 +13,7 @@ const contextHandoff = await import("../../open-sse/services/contextHandoff.ts") async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("buildHandoffSystemMessage and injectHandoffIntoBody preserve existing history", () => { diff --git a/tests/unit/context-manager.test.ts b/tests/unit/context-manager.test.ts index de95d5b6f2..17df8f9a25 100644 --- a/tests/unit/context-manager.test.ts +++ b/tests/unit/context-manager.test.ts @@ -16,7 +16,7 @@ test.after(() => { core.resetDbInstance(); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── estimateTokens ───────────────────────────────────────────────────────── diff --git a/tests/unit/context-window-reconcile-persisted-overrides.test.ts b/tests/unit/context-window-reconcile-persisted-overrides.test.ts index 13285d398f..eeaf2e610c 100644 --- a/tests/unit/context-window-reconcile-persisted-overrides.test.ts +++ b/tests/unit/context-window-reconcile-persisted-overrides.test.ts @@ -16,13 +16,13 @@ const { runContextWindowReconcile } = await import("../../src/lib/contextWindowR test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("runContextWindowReconcile retains an auto override across repeated synced discovery", async () => { diff --git a/tests/unit/conversationTurnContent.test.ts b/tests/unit/conversationTurnContent.test.ts index adccdf3a8c..8f941a0618 100644 --- a/tests/unit/conversationTurnContent.test.ts +++ b/tests/unit/conversationTurnContent.test.ts @@ -19,7 +19,7 @@ const { resolveTurnDisplayContent } = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function insertCallLog(row: { id: string; correlationId: string; artifactRelPath: string | null }) { diff --git a/tests/unit/conversations-active-call-log-id.test.ts b/tests/unit/conversations-active-call-log-id.test.ts index 9e8473f582..843efe022b 100644 --- a/tests/unit/conversations-active-call-log-id.test.ts +++ b/tests/unit/conversations-active-call-log-id.test.ts @@ -28,7 +28,7 @@ const route = await import("../../src/app/api/conversations/route.ts"); test.after(() => { core.resetDbInstance(); usageHistory.clearPendingRequests(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { diff --git a/tests/unit/cooldown-epoch-string-3954.test.ts b/tests/unit/cooldown-epoch-string-3954.test.ts index ddc3af23c7..f7743df296 100644 --- a/tests/unit/cooldown-epoch-string-3954.test.ts +++ b/tests/unit/cooldown-epoch-string-3954.test.ts @@ -30,7 +30,7 @@ const { isAccountUnavailable, getEarliestRateLimitedUntil, filterAvailableAccoun test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const HOUR = 3_600_000; diff --git a/tests/unit/correctness/goldenSnapshot.test.ts b/tests/unit/correctness/goldenSnapshot.test.ts index d7f804cea5..bc341cfe10 100644 --- a/tests/unit/correctness/goldenSnapshot.test.ts +++ b/tests/unit/correctness/goldenSnapshot.test.ts @@ -23,7 +23,7 @@ test("goldenSnapshot writes on first run then matches", (t) => { assert.throws(() => goldenSnapshot("selftest/sample", { a: 1, b: 3 }, tmpDir)); // Cleanup - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("goldenSnapshot first-run (no UPDATE_GOLDEN) writes and passes", () => { @@ -36,6 +36,6 @@ test("goldenSnapshot first-run (no UPDATE_GOLDEN) writes and passes", () => { // File exists: different value should throw assert.throws(() => goldenSnapshot("test/value", { x: 99 }, td)); } finally { - fs.rmSync(td, { recursive: true, force: true }); + fs.rmSync(td, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cursor-agent-availability-route-authenticated.test.ts b/tests/unit/cursor-agent-availability-route-authenticated.test.ts index 1959910495..3472e5b15b 100644 --- a/tests/unit/cursor-agent-availability-route-authenticated.test.ts +++ b/tests/unit/cursor-agent-availability-route-authenticated.test.ts @@ -22,7 +22,7 @@ const { GET } = await import("../../src/app/api/providers/cursor/agent-availabil test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const FAKE_CURSOR_AGENT_SCRIPT = `#!/usr/bin/env node @@ -46,7 +46,7 @@ test.after(() => { process.env.HOME = originalHome; if (originalUserProfile !== undefined) process.env.USERPROFILE = originalUserProfile; else delete process.env.USERPROFILE; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("returns {cursorAgentAvailable: true} and ONLY that field when cursor-agent is authenticated", async () => { diff --git a/tests/unit/cursor-agent-availability-route.test.ts b/tests/unit/cursor-agent-availability-route.test.ts index c395a228d9..6b9a5685f2 100644 --- a/tests/unit/cursor-agent-availability-route.test.ts +++ b/tests/unit/cursor-agent-availability-route.test.ts @@ -50,7 +50,7 @@ if (args[0] === "status") { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function writeFakeCursorAgentBinary(destPath: string): void { @@ -72,7 +72,7 @@ test.after(() => { if (originalUserProfile !== undefined) process.env.USERPROFILE = originalUserProfile; else delete process.env.USERPROFILE; delete process.env.FAKE_CURSOR_AGENT_STATUS_MODE; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("returns {cursorAgentAvailable: false} and ONLY that field when cursor-agent is unauthenticated", async () => { diff --git a/tests/unit/cursor-agent-cli-version.test.ts b/tests/unit/cursor-agent-cli-version.test.ts index abd4031756..4ec68f69e4 100644 --- a/tests/unit/cursor-agent-cli-version.test.ts +++ b/tests/unit/cursor-agent-cli-version.test.ts @@ -59,7 +59,7 @@ test("newestVersionInDir picks lexicographically newest matching child", () => { fs.mkdirSync(path.join(tmp, "3.9.0")); assert.equal(newestVersionInDir(tmp), "2026.07.08-0c04a8a"); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -79,7 +79,7 @@ test("detectCursorAgentCliVersionFromFs uses shim realpath under versions/", assert.equal(detectCursorAgentCliVersionFromFs(home), id); }); } finally { - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -93,8 +93,8 @@ test("detectCursorAgentCliVersionFromFs uses CURSOR_DATA_DIR versions when no sh assert.equal(detectCursorAgentCliVersionFromFs(home), id); }); } finally { - fs.rmSync(home, { recursive: true, force: true }); - fs.rmSync(data, { recursive: true, force: true }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(data, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -123,7 +123,7 @@ test("getCursorAgentCliVersion ignores invalid env and uses pin when FS empty", ); } finally { resetCursorAgentCliVersionCache(); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -160,8 +160,8 @@ test("getCursorAgentCliVersion reads CURSOR_DATA_DIR via isolated HOME", () => { ); } finally { resetCursorAgentCliVersionCache(); - fs.rmSync(home, { recursive: true, force: true }); - fs.rmSync(data, { recursive: true, force: true }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(data, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -209,8 +209,8 @@ test("disk cache hit serves immediately without blocking on network", async () = ); } finally { resetCursorAgentCliVersionTestHooks(); - fs.rmSync(cacheDir, { recursive: true, force: true }); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(cacheDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -235,7 +235,7 @@ test("refreshCursorAgentCliVersionFromInstaller writes disk cache from HTML", as assert.equal(onDisk.version, scrapedId); } finally { resetCursorAgentCliVersionTestHooks(); - fs.rmSync(cacheDir, { recursive: true, force: true }); + fs.rmSync(cacheDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -264,7 +264,7 @@ test("invalid installer HTML falls through to pin", async () => { assert.equal(id, null); } finally { resetCursorAgentCliVersionTestHooks(); - fs.rmSync(cacheDir, { recursive: true, force: true }); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(cacheDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/cursor-agent-models.test.ts b/tests/unit/cursor-agent-models.test.ts index 7b03ff9518..1d72c79834 100644 --- a/tests/unit/cursor-agent-models.test.ts +++ b/tests/unit/cursor-agent-models.test.ts @@ -123,7 +123,7 @@ describe("resolveCursorAgentBinary", () => { if (ORIGINAL_USERPROFILE !== undefined) process.env.USERPROFILE = ORIGINAL_USERPROFILE; else delete process.env.USERPROFILE; process.env.PATH = ORIGINAL_PATH; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("finds the HOME-relative fixed candidate (~/.local/bin/cursor-agent) with allowPathFallback:false", () => { @@ -152,7 +152,7 @@ describe("resolveCursorAgentBinary", () => { assert.equal(resolveCursorAgentBinary({ allowPathFallback: false }), fixedBinary); assert.equal(resolveCursorAgentBinary({ allowPathFallback: true }), fixedBinary); } finally { - fs.rmSync(pathDir, { recursive: true, force: true }); + fs.rmSync(pathDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -175,7 +175,7 @@ describe("resolveCursorAgentBinary", () => { assert.equal(resolveCursorAgentBinary({ allowPathFallback: true }), pathOnlyBinary); assert.equal(resolveCursorAgentBinary(), pathOnlyBinary); } finally { - fs.rmSync(pathDir, { recursive: true, force: true }); + fs.rmSync(pathDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -198,7 +198,7 @@ describe("resolveCursorAgentBinary", () => { try { assert.equal(resolveCursorAgentBinary({ allowPathFallback: false }), null); } finally { - fs.rmSync(pathDir, { recursive: true, force: true }); + fs.rmSync(pathDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); @@ -261,7 +261,7 @@ if (selfExitMs) { afterEach(() => { delete process.env.FAKE_BIN_SELF_EXIT_MS; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("sends SIGKILL after the follow-up window when the process ignores SIGTERM", async () => { diff --git a/tests/unit/cursor-renewal.test.ts b/tests/unit/cursor-renewal.test.ts index fcb480bca1..242570b8ea 100644 --- a/tests/unit/cursor-renewal.test.ts +++ b/tests/unit/cursor-renewal.test.ts @@ -120,7 +120,7 @@ describe("runCursorAgentNudge", () => { afterEach(() => { clearFakeCursorAgentEnv(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it('invokes the binary with exactly ["--list-models"] and never "login"', async () => { @@ -180,7 +180,7 @@ describe("checkCursorAgentAvailability", () => { if (ORIGINAL_USERPROFILE !== undefined) process.env.USERPROFILE = ORIGINAL_USERPROFILE; else delete process.env.USERPROFILE; clearFakeCursorAgentEnv(); - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("reports available:true when the resolved binary is authenticated", async () => { @@ -298,7 +298,7 @@ describe("getCachedCursorAgentAvailability (Task 5 Step 1 — 5-minute TTL wrapp if (ORIGINAL_USERPROFILE !== undefined) process.env.USERPROFILE = ORIGINAL_USERPROFILE; else delete process.env.USERPROFILE; clearFakeCursorAgentEnv(); - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // A single test, one continuous mocked timeline: getCachedCursorAgentAvailability()'s @@ -364,7 +364,7 @@ describe("renewCursorConnection", () => { if (ORIGINAL_USERPROFILE !== undefined) process.env.USERPROFILE = ORIGINAL_USERPROFILE; else delete process.env.USERPROFILE; clearFakeCursorAgentEnv(); - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function writeIdeToken(accessToken: string, machineId?: string): Promise { diff --git a/tests/unit/cursor-token-extractor.test.ts b/tests/unit/cursor-token-extractor.test.ts index 986d8dd0ad..70b60dc95c 100644 --- a/tests/unit/cursor-token-extractor.test.ts +++ b/tests/unit/cursor-token-extractor.test.ts @@ -236,7 +236,7 @@ describe("tryAgentAuth", () => { } else { delete process.env.USERPROFILE; } - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("finds a token in the primary auth.json candidate", async () => { @@ -336,7 +336,7 @@ describe("tryIdeAuth", () => { delete process.env.USERPROFILE; } if (tmpHome) { - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); tmpHome = undefined; } }); diff --git a/tests/unit/cursor-version-detector.test.mjs b/tests/unit/cursor-version-detector.test.mjs index 6fef869a9b..fc70e70555 100644 --- a/tests/unit/cursor-version-detector.test.mjs +++ b/tests/unit/cursor-version-detector.test.mjs @@ -45,7 +45,7 @@ test("getCursorVersion reads version from state.vscdb", () => { } finally { if (origEnv === undefined) delete process.env.CURSOR_STATE_DB_PATH; else process.env.CURSOR_STATE_DB_PATH = origEnv; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -74,7 +74,7 @@ test("getCursorVersion returns fallback when DB has no version key", () => { } finally { if (origEnv === undefined) delete process.env.CURSOR_STATE_DB_PATH; else process.env.CURSOR_STATE_DB_PATH = origEnv; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -100,7 +100,7 @@ test("getCursorVersion caches the result across calls", () => { } finally { if (origEnv === undefined) delete process.env.CURSOR_STATE_DB_PATH; else process.env.CURSOR_STATE_DB_PATH = origEnv; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -126,6 +126,6 @@ test("resetCursorVersionCache forces re-read from DB", () => { } finally { if (origEnv === undefined) delete process.env.CURSOR_STATE_DB_PATH; else process.env.CURSOR_STATE_DB_PATH = origEnv; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/custom-headers-provider-nodes.test.ts b/tests/unit/custom-headers-provider-nodes.test.ts index 17646b37f9..651ff02ff1 100644 --- a/tests/unit/custom-headers-provider-nodes.test.ts +++ b/tests/unit/custom-headers-provider-nodes.test.ts @@ -18,7 +18,7 @@ const { DefaultExecutor } = await import("../../open-sse/executors/default.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderNodeSchema accepts valid customHeaders as record of strings", () => { diff --git a/tests/unit/custom-model-target-format.test.ts b/tests/unit/custom-model-target-format.test.ts index 062a97566d..6382e367b2 100644 --- a/tests/unit/custom-model-target-format.test.ts +++ b/tests/unit/custom-model-target-format.test.ts @@ -38,7 +38,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2905 addCustomModel persists targetFormat", async () => { diff --git a/tests/unit/dashscope-text-models-discovery.test.ts b/tests/unit/dashscope-text-models-discovery.test.ts index 5e62ce7613..bef519cc29 100644 --- a/tests/unit/dashscope-text-models-discovery.test.ts +++ b/tests/unit/dashscope-text-models-discovery.test.ts @@ -73,7 +73,7 @@ const MIXED_DASHSCOPE_MODELS = [ async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -139,7 +139,7 @@ async function assertTextOnlyDiscovery({ test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Qwen Cloud syncs only text models from the selected Beijing region", async () => { diff --git a/tests/unit/data-dir-writable-fallback.test.ts b/tests/unit/data-dir-writable-fallback.test.ts index 70421108f5..d028b894d3 100644 --- a/tests/unit/data-dir-writable-fallback.test.ts +++ b/tests/unit/data-dir-writable-fallback.test.ts @@ -44,7 +44,7 @@ async function withTempEnv( } catch { // ignore } - fs.rmSync(root, { recursive: true, force: true }); + fs.rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/database-settings-maintenance.test.ts b/tests/unit/database-settings-maintenance.test.ts index a6c3d69e83..d5923d621f 100644 --- a/tests/unit/database-settings-maintenance.test.ts +++ b/tests/unit/database-settings-maintenance.test.ts @@ -30,7 +30,7 @@ type UsageSummaryRow = { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/datadir-test-context-guard-10428.test.ts b/tests/unit/datadir-test-context-guard-10428.test.ts index e957a490fa..0cf20076fa 100644 --- a/tests/unit/datadir-test-context-guard-10428.test.ts +++ b/tests/unit/datadir-test-context-guard-10428.test.ts @@ -60,7 +60,7 @@ test("G2: an explicit DATA_DIR still wins inside a test context", () => { withEnv({ DATA_DIR: explicit, NODE_ENV: "test" }, () => { assert.equal(resolveWritableDataDir(), explicit); }); - fs.rmSync(explicit, { recursive: true, force: true }); + fs.rmSync(explicit, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("G3: the escape hatch restores the old behavior for deliberate runs", () => { diff --git a/tests/unit/db-adapters/driverFactory.test.ts b/tests/unit/db-adapters/driverFactory.test.ts index b73ea87a6f..9097167f6f 100644 --- a/tests/unit/db-adapters/driverFactory.test.ts +++ b/tests/unit/db-adapters/driverFactory.test.ts @@ -33,7 +33,7 @@ function forceNodeSqlite() { function createTempDatabasePath(t: TestContext) { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-node-sqlite-")); const databasePath = path.join(dir, "database.sqlite"); - t.after(() => fs.rmSync(dir, { recursive: true, force: true })); + t.after(() => fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); return databasePath; } diff --git a/tests/unit/db-agent-bridge-bypass.test.ts b/tests/unit/db-agent-bridge-bypass.test.ts index a45e8f8831..7fab0d718c 100644 --- a/tests/unit/db-agent-bridge-bypass.test.ts +++ b/tests/unit/db-agent-bridge-bypass.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const DEFAULT_PATTERNS = [ diff --git a/tests/unit/db-agent-bridge-mappings.test.ts b/tests/unit/db-agent-bridge-mappings.test.ts index 5c03d24fa4..47ee9758f3 100644 --- a/tests/unit/db-agent-bridge-mappings.test.ts +++ b/tests/unit/db-agent-bridge-mappings.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getMappingsForAgent returns empty array when no mappings exist", () => { diff --git a/tests/unit/db-agent-bridge-state.test.ts b/tests/unit/db-agent-bridge-state.test.ts index 919c17646b..ec2d262e44 100644 --- a/tests/unit/db-agent-bridge-state.test.ts +++ b/tests/unit/db-agent-bridge-state.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migration is idempotent — running getDbInstance twice does not throw", () => { diff --git a/tests/unit/db-apiKeys-crud.test.ts b/tests/unit/db-apiKeys-crud.test.ts index c7dc35e15a..e8493398f3 100644 --- a/tests/unit/db-apiKeys-crud.test.ts +++ b/tests/unit/db-apiKeys-crud.test.ts @@ -31,7 +31,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-backup-autobackup-setting-5871.test.ts b/tests/unit/db-backup-autobackup-setting-5871.test.ts index e9ed86365c..bb8704076c 100644 --- a/tests/unit/db-backup-autobackup-setting-5871.test.ts +++ b/tests/unit/db-backup-autobackup-setting-5871.test.ts @@ -29,7 +29,7 @@ const databaseSettings = await import("../../src/lib/db/databaseSettings.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -40,7 +40,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("fresh install (seeded default autoBackupEnabled=false) → auto backups disabled", () => { diff --git a/tests/unit/db-backup-extended.test.ts b/tests/unit/db-backup-extended.test.ts index d4f9f26463..4ed9a08064 100644 --- a/tests/unit/db-backup-extended.test.ts +++ b/tests/unit/db-backup-extended.test.ts @@ -21,12 +21,12 @@ async function resetStorage() { const targetPath = path.join(TEST_DATA_DIR, entry); const stat = fs.lstatSync(targetPath); if (stat.isDirectory()) { - fs.rmSync(targetPath, { recursive: true, force: true }); + fs.rmSync(targetPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } else { await backupDb.unlinkFileWithRetry(targetPath, { maxAttempts: 20, baseDelayMs: 25 }); } } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -78,7 +78,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("backupDbFile creates manual backups and listDbBackups returns metadata", async () => { @@ -98,7 +98,7 @@ test("backupDbFile creates manual backups and listDbBackups returns metadata", a }); test("listDbBackups returns an empty list when the backup directory is missing", async () => { - fs.rmSync(core.DB_BACKUPS_DIR, { recursive: true, force: true }); + fs.rmSync(core.DB_BACKUPS_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); const backups = await backupDb.listDbBackups(); assert.deepEqual(backups, []); }); diff --git a/tests/unit/db-backups-skills-3500.test.ts b/tests/unit/db-backups-skills-3500.test.ts index a2f0118ab2..3c5f543f34 100644 --- a/tests/unit/db-backups-skills-3500.test.ts +++ b/tests/unit/db-backups-skills-3500.test.ts @@ -229,7 +229,7 @@ test.after(() => { /* best effort */ } try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/db-call-log-stats-3500.test.ts b/tests/unit/db-call-log-stats-3500.test.ts index 5216132d8b..b99060dc4e 100644 --- a/tests/unit/db-call-log-stats-3500.test.ts +++ b/tests/unit/db-call-log-stats-3500.test.ts @@ -85,7 +85,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/db-ccr-migration-renumber-134.test.ts b/tests/unit/db-ccr-migration-renumber-134.test.ts index 2be3b40c98..edbdd23f6e 100644 --- a/tests/unit/db-ccr-migration-renumber-134.test.ts +++ b/tests/unit/db-ccr-migration-renumber-134.test.ts @@ -49,7 +49,7 @@ function createLegacyDb(appliedName: string) { } test.after(() => { - fs.rmSync(migrationsDir, { recursive: true, force: true }); + fs.rmSync(migrationsDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalMigrationsDir === undefined) delete process.env.OMNIROUTE_MIGRATIONS_DIR; else process.env.OMNIROUTE_MIGRATIONS_DIR = originalMigrationsDir; }); diff --git a/tests/unit/db-cleanup-xp-audit-log.test.ts b/tests/unit/db-cleanup-xp-audit-log.test.ts index 630acaf17c..7fe7047845 100644 --- a/tests/unit/db-cleanup-xp-audit-log.test.ts +++ b/tests/unit/db-cleanup-xp-audit-log.test.ts @@ -19,7 +19,7 @@ type CountRow = { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/db-combos-crud.test.ts b/tests/unit/db-combos-crud.test.ts index 986ab7d76e..f610197b44 100644 --- a/tests/unit/db-combos-crud.test.ts +++ b/tests/unit/db-combos-crud.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createCombo stores default strategy and supports lookup by id and name", async () => { diff --git a/tests/unit/db-command-code-auth.test.ts b/tests/unit/db-command-code-auth.test.ts index 266aa7c333..6b67dd28fd 100644 --- a/tests/unit/db-command-code-auth.test.ts +++ b/tests/unit/db-command-code-auth.test.ts @@ -12,7 +12,7 @@ const commandCodeAuthDb = await import("../../src/lib/db/commandCodeAuth.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("status lookup expires stale pending command-code auth sessions", () => { diff --git a/tests/unit/db-core-extended.test.ts b/tests/unit/db-core-extended.test.ts index b38b567d06..95516bcfe7 100644 --- a/tests/unit/db-core-extended.test.ts +++ b/tests/unit/db-core-extended.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-core-init.test.ts b/tests/unit/db-core-init.test.ts index 15ab1b576b..c968780bf8 100644 --- a/tests/unit/db-core-init.test.ts +++ b/tests/unit/db-core-init.test.ts @@ -50,7 +50,7 @@ function makeTempDir(prefix) { } function removePath(targetPath) { - fs.rmSync(targetPath, { recursive: true, force: true }); + fs.rmSync(targetPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } async function importFresh(modulePath) { diff --git a/tests/unit/db-core-migration.test.ts b/tests/unit/db-core-migration.test.ts index 8069214877..61545c072c 100644 --- a/tests/unit/db-core-migration.test.ts +++ b/tests/unit/db-core-migration.test.ts @@ -13,7 +13,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Test 1: migrateFromJson handles empty db.json and renames it", () => { diff --git a/tests/unit/db-core.test.ts b/tests/unit/db-core.test.ts index b198a780a7..5d7027dcb3 100644 --- a/tests/unit/db-core.test.ts +++ b/tests/unit/db-core.test.ts @@ -12,7 +12,7 @@ function makeTempDir(prefix: string): string { } function removePath(targetPath: string) { - fs.rmSync(targetPath, { recursive: true, force: true }); + fs.rmSync(targetPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } const originalEnv = { diff --git a/tests/unit/db-detailed-logs.test.ts b/tests/unit/db-detailed-logs.test.ts index 4469c7baf7..0eef9b566b 100644 --- a/tests/unit/db-detailed-logs.test.ts +++ b/tests/unit/db-detailed-logs.test.ts @@ -29,7 +29,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_PII_ENABLED === undefined) { delete process.env.PII_RESPONSE_SANITIZATION; diff --git a/tests/unit/db-domainState-crud.test.ts b/tests/unit/db-domainState-crud.test.ts index c02be9060c..8c3a7bec28 100644 --- a/tests/unit/db-domainState-crud.test.ts +++ b/tests/unit/db-domainState-crud.test.ts @@ -15,7 +15,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-fresh-setup-9934.test.ts b/tests/unit/db-fresh-setup-9934.test.ts index 6faafa3f8a..706414037c 100644 --- a/tests/unit/db-fresh-setup-9934.test.ts +++ b/tests/unit/db-fresh-setup-9934.test.ts @@ -142,7 +142,7 @@ test( } finally { if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/db-gamification-federation-3500.test.ts b/tests/unit/db-gamification-federation-3500.test.ts index 5fd1876fec..6f2c4f706a 100644 --- a/tests/unit/db-gamification-federation-3500.test.ts +++ b/tests/unit/db-gamification-federation-3500.test.ts @@ -42,7 +42,7 @@ test.after(async () => { const tryRm = (attempts: number) => { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } resolve(); } catch (err: any) { diff --git a/tests/unit/db-health-check.test.ts b/tests/unit/db-health-check.test.ts index 52f0f0a7a6..4486b7fc60 100644 --- a/tests/unit/db-health-check.test.ts +++ b/tests/unit/db-health-check.test.ts @@ -16,7 +16,7 @@ const healthCheckDb = await import("../../src/lib/db/healthCheck.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -27,7 +27,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function insertBrokenRows(db) { diff --git a/tests/unit/db-health-driver.test.ts b/tests/unit/db-health-driver.test.ts index efbc6b08f6..ef8a652eda 100644 --- a/tests/unit/db-health-driver.test.ts +++ b/tests/unit/db-health-driver.test.ts @@ -14,7 +14,7 @@ const driverFactory = await import("../../src/lib/db/adapters/driverFactory.ts") test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── describeDbDriver: pure decision ─────────────────── diff --git a/tests/unit/db-health-route.test.ts b/tests/unit/db-health-route.test.ts index 8b36871b88..415fffc9cb 100644 --- a/tests/unit/db-health-route.test.ts +++ b/tests/unit/db-health-route.test.ts @@ -19,7 +19,7 @@ const TEST_INITIAL_PASSWORD = "db-health-route-password"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.JWT_SECRET = TEST_JWT_SECRET; process.env.INITIAL_PASSWORD = TEST_INITIAL_PASSWORD; @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT_SECRET === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = ORIGINAL_JWT_SECRET; if (ORIGINAL_INITIAL_PASSWORD === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/db-inspector-custom-hosts.test.ts b/tests/unit/db-inspector-custom-hosts.test.ts index 39ad298ae8..4496f2d51b 100644 --- a/tests/unit/db-inspector-custom-hosts.test.ts +++ b/tests/unit/db-inspector-custom-hosts.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("listCustomHosts returns empty array initially", () => { diff --git a/tests/unit/db-inspector-sessions.test.ts b/tests/unit/db-inspector-sessions.test.ts index 801309d7d1..dd2c27896c 100644 --- a/tests/unit/db-inspector-sessions.test.ts +++ b/tests/unit/db-inspector-sessions.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createSession returns a uuid and started_at timestamp", () => { diff --git a/tests/unit/db-install-upgrade-schema-parity.test.ts b/tests/unit/db-install-upgrade-schema-parity.test.ts index 9ce6c408c4..6ed39eee5e 100644 --- a/tests/unit/db-install-upgrade-schema-parity.test.ts +++ b/tests/unit/db-install-upgrade-schema-parity.test.ts @@ -49,7 +49,7 @@ test.after(() => { } catch { /* best effort */ } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function migrationFiles(): Array<{ version: string; name: string }> { diff --git a/tests/unit/db-job-registry-migration-renumber-139.test.ts b/tests/unit/db-job-registry-migration-renumber-139.test.ts index 11f430dc0f..09788ae2cc 100644 --- a/tests/unit/db-job-registry-migration-renumber-139.test.ts +++ b/tests/unit/db-job-registry-migration-renumber-139.test.ts @@ -35,7 +35,7 @@ fs.writeFileSync( const { runMigrations } = await import("../../src/lib/db/migrationRunner.ts"); test.after(() => { - fs.rmSync(migrationsDir, { recursive: true, force: true }); + fs.rmSync(migrationsDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalMigrationsDir === undefined) delete process.env.OMNIROUTE_MIGRATIONS_DIR; else process.env.OMNIROUTE_MIGRATIONS_DIR = originalMigrationsDir; }); diff --git a/tests/unit/db-logs-cache-3500.test.ts b/tests/unit/db-logs-cache-3500.test.ts index 914a3f9a6b..b4e020f9a2 100644 --- a/tests/unit/db-logs-cache-3500.test.ts +++ b/tests/unit/db-logs-cache-3500.test.ts @@ -69,7 +69,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // =========================================================================== diff --git a/tests/unit/db-migration-runner-extra-dirs.test.ts b/tests/unit/db-migration-runner-extra-dirs.test.ts index 845b06366c..494122e7a7 100644 --- a/tests/unit/db-migration-runner-extra-dirs.test.ts +++ b/tests/unit/db-migration-runner-extra-dirs.test.ts @@ -85,7 +85,7 @@ const { runMigrations } = await import("../../src/lib/db/migrationRunner.ts"); process.on("exit", () => { for (const dir of tempDirs) { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } @@ -258,7 +258,7 @@ test("diretório core ausente não impede as migrations dos extras", async () => name: f, body: fs.readFileSync(path.join(CORE_DIR, f), "utf-8"), })); - fs.rmSync(CORE_DIR, { recursive: true, force: true }); + fs.rmSync(CORE_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); try { const r = runWithExtras(`ee=${eeDir}`); assert.ok(r.tables.includes("ee_solo"), `tabelas: ${r.tables.join(", ")}`); diff --git a/tests/unit/db-model-aliases-cascade.test.ts b/tests/unit/db-model-aliases-cascade.test.ts index 2d1a76ce30..e75f2fc144 100644 --- a/tests/unit/db-model-aliases-cascade.test.ts +++ b/tests/unit/db-model-aliases-cascade.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("deleteModelAliasesForProvider removes only the target provider's aliases", async () => { diff --git a/tests/unit/db-model-context-overrides.test.ts b/tests/unit/db-model-context-overrides.test.ts index 5584ac3bc9..afb60d5cce 100644 --- a/tests/unit/db-model-context-overrides.test.ts +++ b/tests/unit/db-model-context-overrides.test.ts @@ -14,7 +14,7 @@ const mco = await import("../../src/lib/db/modelContextOverrides.ts"); function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); } @@ -26,7 +26,7 @@ beforeEach(() => { after(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("modelContextOverrides", () => { diff --git a/tests/unit/db-models-crud.test.ts b/tests/unit/db-models-crud.test.ts index bd21ad6aca..31c0d30253 100644 --- a/tests/unit/db-models-crud.test.ts +++ b/tests/unit/db-models-crud.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("model aliases can be created, listed and deleted", async () => { diff --git a/tests/unit/db-models-extended.test.ts b/tests/unit/db-models-extended.test.ts index 201d9d88a3..8971da4e2a 100644 --- a/tests/unit/db-models-extended.test.ts +++ b/tests/unit/db-models-extended.test.ts @@ -25,7 +25,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-playground-presets.test.ts b/tests/unit/db-playground-presets.test.ts index f3907481e8..77b8497466 100644 --- a/tests/unit/db-playground-presets.test.ts +++ b/tests/unit/db-playground-presets.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Migration idempotency ─────────────────────────────────────────────────── diff --git a/tests/unit/db-pre-migration-backup-retention-10421.test.ts b/tests/unit/db-pre-migration-backup-retention-10421.test.ts index bc99aa39fb..798bb3cb66 100644 --- a/tests/unit/db-pre-migration-backup-retention-10421.test.ts +++ b/tests/unit/db-pre-migration-backup-retention-10421.test.ts @@ -211,7 +211,7 @@ test( ); } finally { db.close(); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); @@ -263,6 +263,6 @@ test("#10421 the newest pre-migration backup survives pruning", serial, async () assert.equal(fresh.length, 1, `expected the run's own backup to survive, got ${fresh.length}`); } finally { db.close(); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/db-provider-cookie-dedup-3368.test.ts b/tests/unit/db-provider-cookie-dedup-3368.test.ts index 9d5916a4ff..f62278b317 100644 --- a/tests/unit/db-provider-cookie-dedup-3368.test.ts +++ b/tests/unit/db-provider-cookie-dedup-3368.test.ts @@ -19,7 +19,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -40,7 +40,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3368 cookie dedup: re-importing the same cookie under a different name updates, not duplicates", async () => { diff --git a/tests/unit/db-provider-daily-usage-4009.test.ts b/tests/unit/db-provider-daily-usage-4009.test.ts index 9c19f747a3..3dcf30c2f5 100644 --- a/tests/unit/db-provider-daily-usage-4009.test.ts +++ b/tests/unit/db-provider-daily-usage-4009.test.ts @@ -59,7 +59,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4009 getProviderDailyUsageRows is exported as a function", () => { diff --git a/tests/unit/db-provider-limits.test.ts b/tests/unit/db-provider-limits.test.ts index e5104e5e08..40c6804ad8 100644 --- a/tests/unit/db-provider-limits.test.ts +++ b/tests/unit/db-provider-limits.test.ts @@ -12,7 +12,7 @@ const providerLimitsDb = await import("../../src/lib/db/providerLimits.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("providerLimits cache returns empty defaults before any writes", () => { diff --git a/tests/unit/db-provider-plans.test.ts b/tests/unit/db-provider-plans.test.ts index ab9c25edae..56355c775c 100644 --- a/tests/unit/db-provider-plans.test.ts +++ b/tests/unit/db-provider-plans.test.ts @@ -26,7 +26,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/db-provider-stats.test.ts b/tests/unit/db-provider-stats.test.ts index 398351084a..0d4f5c09d7 100644 --- a/tests/unit/db-provider-stats.test.ts +++ b/tests/unit/db-provider-stats.test.ts @@ -72,7 +72,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3175 getProviderCallStats aggregates totals, success and latency per provider", () => { diff --git a/tests/unit/db-providers-access-token-1290.test.ts b/tests/unit/db-providers-access-token-1290.test.ts index 85d94ec50f..45c1600e4d 100644 --- a/tests/unit/db-providers-access-token-1290.test.ts +++ b/tests/unit/db-providers-access-token-1290.test.ts @@ -20,7 +20,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderConnection: authType access_token never dedups — same email creates a new row each time", async () => { diff --git a/tests/unit/db-providers-cross-idp-dedup-2244.test.ts b/tests/unit/db-providers-cross-idp-dedup-2244.test.ts index fd74044cc4..d08690db21 100644 --- a/tests/unit/db-providers-cross-idp-dedup-2244.test.ts +++ b/tests/unit/db-providers-cross-idp-dedup-2244.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -45,7 +45,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2244 cross-IdP dedup: same email + same username updates the existing connection", async () => { diff --git a/tests/unit/db-providers-crud.test.ts b/tests/unit/db-providers-crud.test.ts index a731780597..09f44f4f93 100644 --- a/tests/unit/db-providers-crud.test.ts +++ b/tests/unit/db-providers-crud.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderConnection assigns provider-scoped priorities and supports filtered reads", async () => { diff --git a/tests/unit/db-proxies-crud.test.ts b/tests/unit/db-proxies-crud.test.ts index 1cd35d35c9..4a69ebc718 100644 --- a/tests/unit/db-proxies-crud.test.ts +++ b/tests/unit/db-proxies-crud.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("proxy CRUD redacts secrets by default and preserves stored credentials when omitted", async () => { diff --git a/tests/unit/db-quota-consumption.test.ts b/tests/unit/db-quota-consumption.test.ts index 3a166291f4..0cebd46831 100644 --- a/tests/unit/db-quota-consumption.test.ts +++ b/tests/unit/db-quota-consumption.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/db-quota-migrations-idempotency.test.ts b/tests/unit/db-quota-migrations-idempotency.test.ts index 969335fc2f..ad11181c23 100644 --- a/tests/unit/db-quota-migrations-idempotency.test.ts +++ b/tests/unit/db-quota-migrations-idempotency.test.ts @@ -53,7 +53,7 @@ const EXPECTED_INDEXES = [ test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migrations 073-075 create all expected tables and indexes on first init", () => { diff --git a/tests/unit/db-quota-pools.test.ts b/tests/unit/db-quota-pools.test.ts index ecf04494a1..c73fbf9ad4 100644 --- a/tests/unit/db-quota-pools.test.ts +++ b/tests/unit/db-quota-pools.test.ts @@ -27,7 +27,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/db-quota-snapshots.test.ts b/tests/unit/db-quota-snapshots.test.ts index cce181254a..9a13864980 100644 --- a/tests/unit/db-quota-snapshots.test.ts +++ b/tests/unit/db-quota-snapshots.test.ts @@ -12,7 +12,7 @@ const quotaSnapshotsDb = await import("../../src/lib/db/quotaSnapshots.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("quotaSnapshots save and query rows with provider and connection filters", () => { diff --git a/tests/unit/db-read-cache.test.ts b/tests/unit/db-read-cache.test.ts index 55181dba2e..f1e58b2990 100644 --- a/tests/unit/db-read-cache.test.ts +++ b/tests/unit/db-read-cache.test.ts @@ -23,7 +23,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getCachedSettings returns cached data until TTL expires or cache is invalidated", async () => { diff --git a/tests/unit/db-recovery.test.ts b/tests/unit/db-recovery.test.ts index 0eaa3156d9..5a2aad049f 100644 --- a/tests/unit/db-recovery.test.ts +++ b/tests/unit/db-recovery.test.ts @@ -12,7 +12,7 @@ async function withRecoveryEnv(fn: (dataDir: string) => Promise) { try { await fn(dataDir); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; } diff --git a/tests/unit/db-registered-keys.test.ts b/tests/unit/db-registered-keys.test.ts index 6173cc08d4..4dee75800b 100644 --- a/tests/unit/db-registered-keys.test.ts +++ b/tests/unit/db-registered-keys.test.ts @@ -12,7 +12,7 @@ const registeredKeysDb = await import("../../src/lib/db/registeredKeys.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("registered keys issue, validate, consume budget and revoke correctly", () => { diff --git a/tests/unit/db-registeredKeys-crud.test.ts b/tests/unit/db-registeredKeys-crud.test.ts index 8475517982..7ef8c0a192 100644 --- a/tests/unit/db-registeredKeys-crud.test.ts +++ b/tests/unit/db-registeredKeys-crud.test.ts @@ -15,7 +15,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-reset-module-state.test.ts b/tests/unit/db-reset-module-state.test.ts index f4fdd63a12..2ab944dac0 100644 --- a/tests/unit/db-reset-module-state.test.ts +++ b/tests/unit/db-reset-module-state.test.ts @@ -22,7 +22,7 @@ const { isValidApiKey } = await import("../../src/sse/services/auth.ts"); async function recreateDataDirFromScratch(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Primeiro acesso recria o DB do zero (migrations + colunas-fallback). await settingsDb.updateSettings({ requireLogin: true, setupComplete: true }); @@ -40,7 +40,7 @@ test("api-key validation survives a second resetDbInstance with a recreated DB ( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db-secrets.test.ts b/tests/unit/db-secrets.test.ts index 0d085c2176..033491b275 100644 --- a/tests/unit/db-secrets.test.ts +++ b/tests/unit/db-secrets.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getPersistedSecret returns null for missing keys", () => { diff --git a/tests/unit/db-settings-crud.test.ts b/tests/unit/db-settings-crud.test.ts index bc5d06aa4e..2b53e043ae 100644 --- a/tests/unit/db-settings-crud.test.ts +++ b/tests/unit/db-settings-crud.test.ts @@ -21,7 +21,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -43,7 +43,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/db-settings-debug-mode-default-10312.test.ts b/tests/unit/db-settings-debug-mode-default-10312.test.ts index 327b4ce74d..e4a22b6417 100644 --- a/tests/unit/db-settings-debug-mode-default-10312.test.ts +++ b/tests/unit/db-settings-debug-mode-default-10312.test.ts @@ -21,7 +21,7 @@ async function resetStorage() { delete (globalThis as { __omnirouteDb?: unknown }).__omnirouteDb; core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); core.getDbInstance(); diff --git a/tests/unit/db-settings-extended.test.ts b/tests/unit/db-settings-extended.test.ts index 6bb476a573..cf36810871 100644 --- a/tests/unit/db-settings-extended.test.ts +++ b/tests/unit/db-settings-extended.test.ts @@ -25,7 +25,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch { diff --git a/tests/unit/db-sqljs-atomic-persist.test.ts b/tests/unit/db-sqljs-atomic-persist.test.ts index bb61f2a5c3..de2b9f607c 100644 --- a/tests/unit/db-sqljs-atomic-persist.test.ts +++ b/tests/unit/db-sqljs-atomic-persist.test.ts @@ -96,7 +96,7 @@ test( } finally { if (readerFd !== null) fs.closeSync(readerFd); if (adapter?.open) adapter.close(); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); @@ -111,6 +111,6 @@ test("sql.js persist() is a no-op for :memory: databases (no temp file, no throw assert.deepEqual(fs.readdirSync(dataDir), [], "an in-memory database wrote to disk"); } finally { if (adapter?.open) adapter.close(); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/db-sqljs-close-poison-7494.test.ts b/tests/unit/db-sqljs-close-poison-7494.test.ts index cd819c8785..afbc7246a4 100644 --- a/tests/unit/db-sqljs-close-poison-7494.test.ts +++ b/tests/unit/db-sqljs-close-poison-7494.test.ts @@ -46,7 +46,7 @@ test( "sanity: confirms the underlying sql.js singleton mechanism this bug exploits" ); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); @@ -94,7 +94,7 @@ test( // already-deleted path in the background. await new Promise((resolve) => setTimeout(resolve, 200)); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); @@ -117,7 +117,7 @@ test( assert.equal(probe!.open, false, "closeProbeIfSafe() must still close non-sql.js adapters"); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts b/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts index c68cebea3d..73e4d5165b 100644 --- a/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts +++ b/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts @@ -61,7 +61,7 @@ test.after(() => { } if (prevDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = prevDataDir; - if (dataDir) fs.rmSync(dataDir, { recursive: true, force: true }); + if (dataDir) fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("src/lib/db/core.ts has no top-level await (breaks esbuild's CJS require() bundling — #7288 hotfix)", () => { @@ -204,7 +204,7 @@ test( "otherwise every boot would pay the WASM-load cost even on the happy path" ); } finally { - fs.rmSync(dir2, { recursive: true, force: true }); + fs.rmSync(dir2, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/db-synced-model-catalog-invalidation-8728.test.ts b/tests/unit/db-synced-model-catalog-invalidation-8728.test.ts index 7145857980..38940659e7 100644 --- a/tests/unit/db-synced-model-catalog-invalidation-8728.test.ts +++ b/tests/unit/db-synced-model-catalog-invalidation-8728.test.ts @@ -14,7 +14,7 @@ const readCache = await import("../../src/lib/db/readCache.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("replace invalidates only for canonical persisted changes", async () => { diff --git a/tests/unit/db-upstreamProxy.test.ts b/tests/unit/db-upstreamProxy.test.ts index 7948e62eff..4f14536171 100644 --- a/tests/unit/db-upstreamProxy.test.ts +++ b/tests/unit/db-upstreamProxy.test.ts @@ -53,12 +53,12 @@ afterEach(() => { }); after(() => { - if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true }); + if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function resetModuleStorage() { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); } @@ -367,7 +367,7 @@ describe("db/upstreamProxy (module coverage)", () => { after(async () => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("validates proxy URLs and blocks unsupported or private destinations", async () => { diff --git a/tests/unit/db-usage-analytics-3500.test.ts b/tests/unit/db-usage-analytics-3500.test.ts index e9d49c4326..4bf2c7b409 100644 --- a/tests/unit/db-usage-analytics-3500.test.ts +++ b/tests/unit/db-usage-analytics-3500.test.ts @@ -89,7 +89,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/db-versionManager.test.ts b/tests/unit/db-versionManager.test.ts index 34ff05a3a2..63fb6d5862 100644 --- a/tests/unit/db-versionManager.test.ts +++ b/tests/unit/db-versionManager.test.ts @@ -64,12 +64,12 @@ afterEach(() => { }); after(() => { - if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true }); + if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function resetModuleStorage() { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); } @@ -395,7 +395,7 @@ describe("db/versionManager (module coverage)", () => { after(async () => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("round-trips inserts, updates and status listings through the production module", async () => { diff --git a/tests/unit/db-webhooks.test.ts b/tests/unit/db-webhooks.test.ts index 78e83b0fc7..5e8ace2df7 100644 --- a/tests/unit/db-webhooks.test.ts +++ b/tests/unit/db-webhooks.test.ts @@ -12,7 +12,7 @@ const webhooksDb = await import("../../src/lib/db/webhooks.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("webhooks create, update, query enabled hooks and delete records", () => { diff --git a/tests/unit/db/api-keys.test.ts b/tests/unit/db/api-keys.test.ts index 3c01698b56..56f6145981 100644 --- a/tests/unit/db/api-keys.test.ts +++ b/tests/unit/db/api-keys.test.ts @@ -27,7 +27,7 @@ const MACHINE_ID = "machine1234567890"; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ───────────────────────────────────────────────────────────────────────────── diff --git a/tests/unit/db/connectionRuntimeState.test.ts b/tests/unit/db/connectionRuntimeState.test.ts index 1a90d0527a..897e0a0b2c 100644 --- a/tests/unit/db/connectionRuntimeState.test.ts +++ b/tests/unit/db/connectionRuntimeState.test.ts @@ -28,7 +28,7 @@ const crs = await import("../../../src/lib/db/connectionRuntimeState.ts"); async function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("get: returns null for unknown connection", async () => { diff --git a/tests/unit/db/context-editing-telemetry-record.test.ts b/tests/unit/db/context-editing-telemetry-record.test.ts index 1b5c9ad3eb..8242818b6b 100644 --- a/tests/unit/db/context-editing-telemetry-record.test.ts +++ b/tests/unit/db/context-editing-telemetry-record.test.ts @@ -29,7 +29,7 @@ const { function resetDb(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db/default-combo-toggle.test.ts b/tests/unit/db/default-combo-toggle.test.ts index 62434b9cd6..8e49b23b72 100644 --- a/tests/unit/db/default-combo-toggle.test.ts +++ b/tests/unit/db/default-combo-toggle.test.ts @@ -27,7 +27,7 @@ const { getDefaultCompressionCombo, setEngineInDefaultCombo, getCompressionCombo function resetDb(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db/discovery-results.test.ts b/tests/unit/db/discovery-results.test.ts index afc4106ee6..c9fb59cdb9 100644 --- a/tests/unit/db/discovery-results.test.ts +++ b/tests/unit/db/discovery-results.test.ts @@ -21,7 +21,7 @@ before(async () => { after(() => { core.resetDbInstance(); - if (tmpDataDir) rmSync(tmpDataDir, { recursive: true, force: true }); + if (tmpDataDir) rmSync(tmpDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("discoveryResults DB module", () => { diff --git a/tests/unit/db/jobRegistryDb.test.ts b/tests/unit/db/jobRegistryDb.test.ts index 08aa22a9c7..c701f08a75 100644 --- a/tests/unit/db/jobRegistryDb.test.ts +++ b/tests/unit/db/jobRegistryDb.test.ts @@ -28,7 +28,7 @@ const db = await import("../../../src/lib/db/jobRegistryDb.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("seed: migration registers 3 built-in jobs", () => { diff --git a/tests/unit/db/migration-071.test.ts b/tests/unit/db/migration-071.test.ts index 1522e37abc..6df839940b 100644 --- a/tests/unit/db/migration-071.test.ts +++ b/tests/unit/db/migration-071.test.ts @@ -25,7 +25,7 @@ const versionManager = await import("../../../src/lib/db/versionManager.ts"); async function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migration 071 — adds 3 new columns to version_manager", async () => { diff --git a/tests/unit/db/omp.test.ts b/tests/unit/db/omp.test.ts index d06e014b90..cd3f7937b6 100644 --- a/tests/unit/db/omp.test.ts +++ b/tests/unit/db/omp.test.ts @@ -67,7 +67,7 @@ beforeEach(() => { afterEach(() => { process.env.HOME = origHome; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("db/omp.ts — getOmpCredentials", () => { diff --git a/tests/unit/db/per-engine-analytics.test.ts b/tests/unit/db/per-engine-analytics.test.ts index 018e14e1f2..58af68687e 100644 --- a/tests/unit/db/per-engine-analytics.test.ts +++ b/tests/unit/db/per-engine-analytics.test.ts @@ -27,7 +27,7 @@ const { insertCompressionAnalyticsRow, getPerEngineAnalytics } = function resetDb(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db/per-engine-breakdown-analytics.test.ts b/tests/unit/db/per-engine-breakdown-analytics.test.ts index e5fec7147e..107d4768d0 100644 --- a/tests/unit/db/per-engine-breakdown-analytics.test.ts +++ b/tests/unit/db/per-engine-breakdown-analytics.test.ts @@ -27,7 +27,7 @@ const { insertCompressionAnalyticsRow, insertCompressionEngineBreakdown, getPerE function resetDb(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db/quota-pools.test.ts b/tests/unit/db/quota-pools.test.ts index d818840740..5245e3910f 100644 --- a/tests/unit/db/quota-pools.test.ts +++ b/tests/unit/db/quota-pools.test.ts @@ -21,7 +21,7 @@ const { getDbInstance } = await import("../../../src/lib/db/core.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ───────────────────────────────────────────────────────────────────────────── diff --git a/tests/unit/db/repositories/sqliteComboRepositories.test.ts b/tests/unit/db/repositories/sqliteComboRepositories.test.ts index a9d9181234..94c41620e1 100644 --- a/tests/unit/db/repositories/sqliteComboRepositories.test.ts +++ b/tests/unit/db/repositories/sqliteComboRepositories.test.ts @@ -18,7 +18,7 @@ const combosDb = await import("../../../../src/lib/db/combos.ts"); async function resetStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,5 +42,5 @@ test("legacy combo count facade remains synchronous", async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/db/serviceModels.test.ts b/tests/unit/db/serviceModels.test.ts index 0e36f2164a..4d745d97fb 100644 --- a/tests/unit/db/serviceModels.test.ts +++ b/tests/unit/db/serviceModels.test.ts @@ -21,7 +21,7 @@ const { getServiceModels, saveServiceModels, markAllUnavailable } = function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getServiceModels — returns [] when no row exists", () => { diff --git a/tests/unit/db/vacuum-scheduler.test.ts b/tests/unit/db/vacuum-scheduler.test.ts index 0f979c2495..43fb6e9bb0 100644 --- a/tests/unit/db/vacuum-scheduler.test.ts +++ b/tests/unit/db/vacuum-scheduler.test.ts @@ -54,7 +54,7 @@ test.beforeEach(() => { test.after(() => { scheduler.__resetForTests(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/db/weak-rng-fixes.test.ts b/tests/unit/db/weak-rng-fixes.test.ts index 3d23d5d20c..9f50fe15a4 100644 --- a/tests/unit/db/weak-rng-fixes.test.ts +++ b/tests/unit/db/weak-rng-fixes.test.ts @@ -9,7 +9,7 @@ process.env.DATA_DIR = TEST_DATA_DIR; test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/deepseek-thinking-efforts.test.ts b/tests/unit/deepseek-thinking-efforts.test.ts index a47dc88c76..899402eab8 100644 --- a/tests/unit/deepseek-thinking-efforts.test.ts +++ b/tests/unit/deepseek-thinking-efforts.test.ts @@ -19,14 +19,14 @@ const { sanitizeReasoningEffortForProvider } = await import("../../open-sse/exec test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("DeepSeek registries declare none/low/high/max on both V4 models", () => { diff --git a/tests/unit/delete-provider-connection-clears-combo-pins-8887.test.ts b/tests/unit/delete-provider-connection-clears-combo-pins-8887.test.ts index b38a81c8d0..0e8420a2d3 100644 --- a/tests/unit/delete-provider-connection-clears-combo-pins-8887.test.ts +++ b/tests/unit/delete-provider-connection-clears-combo-pins-8887.test.ts @@ -22,6 +22,9 @@ async function resetStorage(): Promise { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, + + maxRetries: 5, + retryDelay: 100, }); break; } catch (error: unknown) { @@ -84,6 +87,9 @@ test.after(() => { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, + + maxRetries: 5, + retryDelay: 100, }); }); diff --git a/tests/unit/delete-provider-connection-invalidates-lkgp-8887.test.ts b/tests/unit/delete-provider-connection-invalidates-lkgp-8887.test.ts index 83226544fe..04d4f52434 100644 --- a/tests/unit/delete-provider-connection-invalidates-lkgp-8887.test.ts +++ b/tests/unit/delete-provider-connection-invalidates-lkgp-8887.test.ts @@ -22,7 +22,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); break; } catch (error: unknown) { const code = @@ -60,7 +60,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8887: single delete removes only the matching LKGP pin", async () => { diff --git a/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts b/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts index 0d9cc7bc3a..6a13a008e1 100644 --- a/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts +++ b/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { core.resetDbInstance(); for (let attempt = 0; attempt < 10; attempt++) { try { - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); break; } catch (error: unknown) { const code = (error as { code?: string } | undefined)?.code; @@ -33,7 +33,7 @@ test.beforeEach(async () => { }); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7740: orphaned provider connection (id removed from catalog) keeps surfacing apiKeyHealth and 404s on click, but deleting purges in-memory key-health", async () => { diff --git a/tests/unit/devin-bridge-network-guard.test.ts b/tests/unit/devin-bridge-network-guard.test.ts index 2114311637..cd974f6a3d 100644 --- a/tests/unit/devin-bridge-network-guard.test.ts +++ b/tests/unit/devin-bridge-network-guard.test.ts @@ -125,7 +125,7 @@ test("HTTP proxy overwrites Host and strips proxy and hop-by-hop credentials", a } finally { await close(proxy); await close(upstream); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -163,7 +163,7 @@ test("CONNECT rejects mismatched SNI before opening an upstream socket", async ( assert.match(fs.readFileSync(logPath, "utf8"), /"reason":"sni_mismatch"/); } finally { await close(proxy); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -212,6 +212,6 @@ test("CONNECT forwards only after matching SNI is validated", async () => { } finally { await close(proxy); await close(upstream); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/dgrid-provider.test.ts b/tests/unit/dgrid-provider.test.ts index 4542afad33..77fc9c77c3 100644 --- a/tests/unit/dgrid-provider.test.ts +++ b/tests/unit/dgrid-provider.test.ts @@ -71,13 +71,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/dns-config-generic.test.ts b/tests/unit/dns-config-generic.test.ts index 44bf4ea142..cc4648f76b 100644 --- a/tests/unit/dns-config-generic.test.ts +++ b/tests/unit/dns-config-generic.test.ts @@ -272,7 +272,7 @@ test("addDNSEntries: generates both IPv4 and IPv6 lines per host", () => { // --------------------------------------------------------------------------- test.after(() => { try { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best effort } diff --git a/tests/unit/docker-llmlingua-optionals-9166.test.ts b/tests/unit/docker-llmlingua-optionals-9166.test.ts index ac57d0d362..bef7a46290 100644 --- a/tests/unit/docker-llmlingua-optionals-9166.test.ts +++ b/tests/unit/docker-llmlingua-optionals-9166.test.ts @@ -149,7 +149,7 @@ test("#9166 standalone assembly includes the complete LLMLingua runtime closure" "the complete LLMLingua package payload must be copied" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -208,7 +208,7 @@ test("#9166 standalone assembly never overwrites an already pinned transformers "missing dependencies from the transformers closure must still be copied" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -251,7 +251,7 @@ test("#9166 co-location completes a partially traced package (package.json witho "a partially traced package must be completed, not skipped as already present" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -302,7 +302,7 @@ test("#9166 co-location is not skipped when every closure dir exists but one is "the closure-wide early-exit must not fire while any member is partial" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/docs-validate-svg.test.ts b/tests/unit/docs-validate-svg.test.ts index a53ff75afd..89b73e073d 100644 --- a/tests/unit/docs-validate-svg.test.ts +++ b/tests/unit/docs-validate-svg.test.ts @@ -27,7 +27,7 @@ test("SVG validator ignores Mermaid data-id attributes when checking duplicate I assert.match(result.stdout, /PASS/); assert.doesNotMatch(`${result.stdout}${result.stderr}`, /WARN/); } finally { - rmSync(fixtureDir, { recursive: true, force: true }); + rmSync(fixtureDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -46,7 +46,7 @@ test("SVG validator rejects duplicate XML id attributes", () => { assert.equal(result.status, 1, `${result.stdout}${result.stderr}`); assert.match(result.stderr, /duplicate IDs: edge-a/); } finally { - rmSync(fixtureDir, { recursive: true, force: true }); + rmSync(fixtureDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -101,6 +101,6 @@ test("SVG validator adds explicit accessible naming when requested for a generat assert.equal([...updated.matchAll(/id="auto-combo-title"/g)].length, 1); assert.equal([...updated.matchAll(/id="auto-combo-desc"/g)].length, 1); } finally { - rmSync(fixtureDir, { recursive: true, force: true }); + rmSync(fixtureDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/domain-branch-hardening.test.ts b/tests/unit/domain-branch-hardening.test.ts index bf2319d440..d5cee8dbef 100644 --- a/tests/unit/domain-branch-hardening.test.ts +++ b/tests/unit/domain-branch-hardening.test.ts @@ -34,7 +34,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -63,7 +63,7 @@ test.after(async () => { fallbackPolicy.resetAllFallbacks(); providerExpiration.resetExpirations(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("resolveComboModel covers empty combos, priority, round-robin, random, least-used and default fallback", () => { diff --git a/tests/unit/domain-cost-rules.test.ts b/tests/unit/domain-cost-rules.test.ts index 6cab0a8015..94fe9b7bae 100644 --- a/tests/unit/domain-cost-rules.test.ts +++ b/tests/unit/domain-cost-rules.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -40,7 +40,7 @@ test.beforeEach(async () => { test.after(async () => { costRules.resetCostData(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("setBudget normalizes defaults and getBudget returns the stored config", () => { diff --git a/tests/unit/domain-fallback-policy.test.ts b/tests/unit/domain-fallback-policy.test.ts index 28730aebc6..d69556f693 100644 --- a/tests/unit/domain-fallback-policy.test.ts +++ b/tests/unit/domain-fallback-policy.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { fallbackPolicy.resetAllFallbacks(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("registerFallback sorts by priority and defaults missing flags to enabled", () => { diff --git a/tests/unit/domain-lockout-policy.test.ts b/tests/unit/domain-lockout-policy.test.ts index 758742dc87..bf5d492342 100644 --- a/tests/unit/domain-lockout-policy.test.ts +++ b/tests/unit/domain-lockout-policy.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { Date.now = originalDateNow; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("checkLockout starts unlocked and locks after reaching the configured threshold", () => { diff --git a/tests/unit/domain-persistence.test.ts b/tests/unit/domain-persistence.test.ts index 95ef343ad3..acbc196bfe 100644 --- a/tests/unit/domain-persistence.test.ts +++ b/tests/unit/domain-persistence.test.ts @@ -45,7 +45,7 @@ afterEach(async () => { after(() => { process.env.DATA_DIR = originalDataDir; - if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true }); + if (fs.existsSync(fileTmpDir)) fs.rmSync(fileTmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Fallback Policy Tests ──────────────────────── diff --git a/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts b/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts index 8b00ac5dc3..cd3871f59a 100644 --- a/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts +++ b/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts @@ -32,7 +32,7 @@ describe("#6996 DuckDuckGo VQD 429 misclassification", () => { after(() => { globalThis.fetch = originalFetch; resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("propagates upstream 429 instead of masking it as a generic 503", async () => { diff --git a/tests/unit/effort-thinking-standardization-6241.test.ts b/tests/unit/effort-thinking-standardization-6241.test.ts index 406cb82377..95d906df53 100644 --- a/tests/unit/effort-thinking-standardization-6241.test.ts +++ b/tests/unit/effort-thinking-standardization-6241.test.ts @@ -19,7 +19,7 @@ const registry = await import("../../src/lib/modelMetadataRegistry.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Schema ───────────────────────────────────────────────────────────── diff --git a/tests/unit/effort-tiers-loop-catalog-e2e.test.ts b/tests/unit/effort-tiers-loop-catalog-e2e.test.ts index 4e6b5c2663..a3818d8ca9 100644 --- a/tests/unit/effort-tiers-loop-catalog-e2e.test.ts +++ b/tests/unit/effort-tiers-loop-catalog-e2e.test.ts @@ -23,7 +23,7 @@ const { recordLearnedReasoningEffort, __test_resetLearnedReasoningEffortCaps } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("learned set flows end-to-end into /v1/models capabilities and variant entries", async () => { diff --git a/tests/unit/egress-ip-lock-10880.test.ts b/tests/unit/egress-ip-lock-10880.test.ts index c4b67cdb0d..34b17dedf4 100644 --- a/tests/unit/egress-ip-lock-10880.test.ts +++ b/tests/unit/egress-ip-lock-10880.test.ts @@ -55,7 +55,7 @@ let seedSeq = 0; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -97,7 +97,7 @@ function seedProxyLog(connectionId: string, egressIp: string, provider: string = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("siblings sharing the egress IP are cooled down with the same cooldown", async () => { diff --git a/tests/unit/electron-main.test.ts b/tests/unit/electron-main.test.ts index b8da073bdd..a378a3ba71 100644 --- a/tests/unit/electron-main.test.ts +++ b/tests/unit/electron-main.test.ts @@ -492,7 +492,7 @@ describe("Electron SQLite credential inspection", () => { fn(dbPath, db); } finally { db.close(); - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/electron-packaging.test.ts b/tests/unit/electron-packaging.test.ts index e08a2f9ee9..cbddd60bab 100644 --- a/tests/unit/electron-packaging.test.ts +++ b/tests/unit/electron-packaging.test.ts @@ -115,7 +115,7 @@ test("electron docs manifest prunes authoring payloads without removing runtime removedPaths: [], }); } finally { - rmSync(bundleRoot, { recursive: true, force: true }); + rmSync(bundleRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/electron-remote-server.test.ts b/tests/unit/electron-remote-server.test.ts index 9595a0d6fe..a3ed546cd9 100644 --- a/tests/unit/electron-remote-server.test.ts +++ b/tests/unit/electron-remote-server.test.ts @@ -33,7 +33,7 @@ function withTempDir(fn: (dir: string) => void) { try { fn(dir); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/electron-sqlite-prebuild.test.ts b/tests/unit/electron-sqlite-prebuild.test.ts index 9c344f7db6..8f9550c5b3 100644 --- a/tests/unit/electron-sqlite-prebuild.test.ts +++ b/tests/unit/electron-sqlite-prebuild.test.ts @@ -81,6 +81,6 @@ test("prebuild verification fails fast when the selected binary is missing", () fs.writeFileSync(expected, "napi"); assert.equal(assertSqlitePrebuildExists?.(moduleDir, "darwin", "arm64"), expected); } finally { - fs.rmSync(moduleDir, { recursive: true, force: true }); + fs.rmSync(moduleDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/elevenlabs-native-routes.test.ts b/tests/unit/elevenlabs-native-routes.test.ts index ded3468f31..dc47600016 100644 --- a/tests/unit/elevenlabs-native-routes.test.ts +++ b/tests/unit/elevenlabs-native-routes.test.ts @@ -53,7 +53,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /v1/voices forwards query and stored xi-api-key", async () => { diff --git a/tests/unit/embedding-account-cooldown-10347.test.ts b/tests/unit/embedding-account-cooldown-10347.test.ts index a9c1d8b5ce..9410c1577d 100644 --- a/tests/unit/embedding-account-cooldown-10347.test.ts +++ b/tests/unit/embedding-account-cooldown-10347.test.ts @@ -14,7 +14,7 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ async function seedConnection(provider: string): Promise { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10347: markAccountUnavailable triggers cooldown on embedding 402", async () => { diff --git a/tests/unit/embedding-cooldown-integration-10347.test.ts b/tests/unit/embedding-cooldown-integration-10347.test.ts index f7bff8ea7a..15fdbe768f 100644 --- a/tests/unit/embedding-cooldown-integration-10347.test.ts +++ b/tests/unit/embedding-cooldown-integration-10347.test.ts @@ -21,7 +21,7 @@ const auth = await import("../../src/sse/services/auth.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ async function seedConnection( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createEmbeddingResponse marks connection on upstream 402", async () => { diff --git a/tests/unit/embeddings-cost-telemetry-headers.test.ts b/tests/unit/embeddings-cost-telemetry-headers.test.ts index 30320a8f2a..1c78001ef3 100644 --- a/tests/unit/embeddings-cost-telemetry-headers.test.ts +++ b/tests/unit/embeddings-cost-telemetry-headers.test.ts @@ -15,7 +15,7 @@ const { OMNIROUTE_RESPONSE_HEADERS } = await import("../../src/shared/constants/ test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createEmbeddingResponse emits X-OmniRoute-* cost telemetry headers on success", async () => { diff --git a/tests/unit/embeddings-lan-noauth-6925.test.ts b/tests/unit/embeddings-lan-noauth-6925.test.ts index e2e07e5c0d..2b91a43c5d 100644 --- a/tests/unit/embeddings-lan-noauth-6925.test.ts +++ b/tests/unit/embeddings-lan-noauth-6925.test.ts @@ -14,7 +14,7 @@ const { createEmbeddingResponse } = await import("../../src/lib/embeddings/servi test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // #6925: a keyless LAN OpenAI-compatible embeddings provider (e.g. Ollama at diff --git a/tests/unit/embeddings-proxy-forwarding.test.ts b/tests/unit/embeddings-proxy-forwarding.test.ts index 2d93d066bf..8273ce6754 100644 --- a/tests/unit/embeddings-proxy-forwarding.test.ts +++ b/tests/unit/embeddings-proxy-forwarding.test.ts @@ -17,7 +17,7 @@ const { resolveProxyForRequest } = await import("../../open-sse/utils/proxyFetch test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function withHttpServer(handler: http.RequestListener, fn: (baseUrl: string) => Promise) { diff --git a/tests/unit/embeddings-route-apikeymeta-6929.test.ts b/tests/unit/embeddings-route-apikeymeta-6929.test.ts index 8e241d731c..d3e6862979 100644 --- a/tests/unit/embeddings-route-apikeymeta-6929.test.ts +++ b/tests/unit/embeddings-route-apikeymeta-6929.test.ts @@ -44,7 +44,7 @@ const PLAYGROUND_KEY_ID_HEADER = "x-omniroute-playground-key-id"; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function sessionCookie(): Promise { diff --git a/tests/unit/emergency-fallback-service.test.ts b/tests/unit/emergency-fallback-service.test.ts index b229fb7012..65b2d2458a 100644 --- a/tests/unit/emergency-fallback-service.test.ts +++ b/tests/unit/emergency-fallback-service.test.ts @@ -29,7 +29,7 @@ function restoreEnv(name: string, value: string | undefined) { function resetTestState() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); delete process.env.OMNIROUTE_EMERGENCY_FALLBACK; resetEmergencyFallbackEnvCache(); @@ -46,7 +46,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); restoreEnv("DATA_DIR", previousDataDir); restoreEnv("DISABLE_SQLITE_AUTO_BACKUP", previousDisableSqliteAutoBackup); }); diff --git a/tests/unit/empty-choices-no-inject.test.ts b/tests/unit/empty-choices-no-inject.test.ts index a252e0c294..3de851b328 100644 --- a/tests/unit/empty-choices-no-inject.test.ts +++ b/tests/unit/empty-choices-no-inject.test.ts @@ -28,7 +28,7 @@ async function readTransformed(chunks: string[], options: Record { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/endpoint-restrictions-policy.test.ts b/tests/unit/endpoint-restrictions-policy.test.ts index 5c5bba8ec5..fe7da11a89 100644 --- a/tests/unit/endpoint-restrictions-policy.test.ts +++ b/tests/unit/endpoint-restrictions-policy.test.ts @@ -30,7 +30,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -79,7 +79,7 @@ test.after(async () => { apiKeysDb.resetApiKeyState(); costRules.resetCostData(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Policy tests ───────────────────────────────────────────────────────── diff --git a/tests/unit/error-message-sanitization.test.ts b/tests/unit/error-message-sanitization.test.ts index 4c72677164..f33a74a591 100644 --- a/tests/unit/error-message-sanitization.test.ts +++ b/tests/unit/error-message-sanitization.test.ts @@ -32,7 +32,7 @@ function makeRequest(url: string, options: { method?: string; body?: unknown } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createCombo(name: string, model: string) { diff --git a/tests/unit/evals-history.test.ts b/tests/unit/evals-history.test.ts index c4ebe9104a..033c04cd98 100644 --- a/tests/unit/evals-history.test.ts +++ b/tests/unit/evals-history.test.ts @@ -12,7 +12,7 @@ const evalsDb = await import("../../src/lib/db/evals.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("eval run history persists target metadata and newest-first ordering", () => { diff --git a/tests/unit/evals-route.test.ts b/tests/unit/evals-route.test.ts index 4893d36971..c9e5b83e8c 100644 --- a/tests/unit/evals-route.test.ts +++ b/tests/unit/evals-route.test.ts @@ -25,7 +25,7 @@ const evalSuiteByIdRoute = await import("../../src/app/api/evals/suites/[suiteId function resetDb() { core.resetDbInstance(); localDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); localDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("evals GET returns suites, target options, api key metadata, and persisted history", async () => { diff --git a/tests/unit/exclusive-connection-leases.test.ts b/tests/unit/exclusive-connection-leases.test.ts index fcfceb71c7..b2ae14c28f 100644 --- a/tests/unit/exclusive-connection-leases.test.ts +++ b/tests/unit/exclusive-connection-leases.test.ts @@ -20,7 +20,7 @@ function at(seconds: number): string { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("hashes canonical owners and never persists the raw owner", () => { @@ -463,6 +463,6 @@ test("cross-process contenders never both acquire the same connection", async () assert.equal(results.filter((result) => result.kind === "ACQUIRED").length, 1); assert.equal(results.filter((result) => result.kind === "CONNECTION_BUSY").length, 1); } finally { - fs.rmSync(raceDir, { recursive: true, force: true }); + fs.rmSync(raceDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/exclusive-lease-api-key-policy.test.ts b/tests/unit/exclusive-lease-api-key-policy.test.ts index dfd6d4dc4b..d51f4d1527 100644 --- a/tests/unit/exclusive-lease-api-key-policy.test.ts +++ b/tests/unit/exclusive-lease-api-key-policy.test.ts @@ -17,7 +17,7 @@ const CONNECTION = "00000000-0000-4000-8000-000000000001"; async function resetStorage(): Promise { core.resetDbInstance(); apiKeys.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); apiKeys.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("managed API key create requires and atomically stores an explicit allowlist", async () => { diff --git a/tests/unit/exclusive-lease-auxiliary-isolation.test.ts b/tests/unit/exclusive-lease-auxiliary-isolation.test.ts index da6174648c..199c2aba7c 100644 --- a/tests/unit/exclusive-lease-auxiliary-isolation.test.ts +++ b/tests/unit/exclusive-lease-auxiliary-isolation.test.ts @@ -49,7 +49,7 @@ async function markLeaseOnly(connectionId: string): Promise { async function resetStorage(): Promise { core.resetDbInstance(); apiKeys.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); externalCalls = 0; } @@ -59,7 +59,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeys.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("translator send excludes a FREE lease-only connection before provider fetch", async () => { diff --git a/tests/unit/exclusive-lease-connection-test-isolation.test.ts b/tests/unit/exclusive-lease-connection-test-isolation.test.ts index 34e565836b..957f678dee 100644 --- a/tests/unit/exclusive-lease-connection-test-isolation.test.ts +++ b/tests/unit/exclusive-lease-connection-test-isolation.test.ts @@ -28,7 +28,7 @@ const OWNER = "vlo_TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT"; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("connection verification skips an ACTIVE exclusive lease before any probe or mutation", async () => { diff --git a/tests/unit/exclusive-lease-managed-set.test.ts b/tests/unit/exclusive-lease-managed-set.test.ts index 86e44ffb58..e5fdcc73f4 100644 --- a/tests/unit/exclusive-lease-managed-set.test.ts +++ b/tests/unit/exclusive-lease-managed-set.test.ts @@ -44,7 +44,7 @@ function insertKey(input: { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("derives the overlapping managed set from active scoped key allowlists", async () => { diff --git a/tests/unit/execute-chat-resource-pressure-breaker.test.ts b/tests/unit/execute-chat-resource-pressure-breaker.test.ts index 4bf1f54fe7..790f309eeb 100644 --- a/tests/unit/execute-chat-resource-pressure-breaker.test.ts +++ b/tests/unit/execute-chat-resource-pressure-breaker.test.ts @@ -25,7 +25,7 @@ const MiB = 1024 ** 2; async function resetStorage() { resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Restore a non-shedding resource pressure runtime between tests. reloadResourcePressureRuntime({ @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("executeChatWithBreaker returns typed pressure 503 before normal, bypass, and shadow breaker paths", async () => { diff --git a/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts b/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts index ae6a3a7072..c001072773 100644 --- a/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts +++ b/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts @@ -115,6 +115,6 @@ rl.on('line', (line) => { } else { delete process.env.CLI_DEVIN_BIN; } - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/executor-devin-cli-agentic-acp.test.ts b/tests/unit/executor-devin-cli-agentic-acp.test.ts index 5538d3a86e..3300983904 100644 --- a/tests/unit/executor-devin-cli-agentic-acp.test.ts +++ b/tests/unit/executor-devin-cli-agentic-acp.test.ts @@ -272,7 +272,7 @@ test("DevinCliAgenticExecutor returns Anthropic tool_use JSON and sends ACP fram } finally { if (oldBin === undefined) delete process.env.CLI_DEVIN_AGENTIC_BIN; else process.env.CLI_DEVIN_AGENTIC_BIN = oldBin; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -303,7 +303,7 @@ test("no-tools summarizer does not depend on mutable ACP permission modes", asyn const body = JSON.parse(await result.response.text()); assert.equal(body.content[0].text, "unsafe"); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -323,7 +323,7 @@ test("ACP client fails closed when session/new omits the session id", async () = const body = JSON.parse(await result.response.text()); assert.equal(body.error.code, "missing_session_id"); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -351,7 +351,7 @@ test("DevinCliAgenticExecutor returns Anthropic SSE for streaming Claude clients } finally { if (oldBin === undefined) delete process.env.CLI_DEVIN_AGENTIC_BIN; else process.env.CLI_DEVIN_AGENTIC_BIN = oldBin; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -382,7 +382,7 @@ test("ACP client handles fragmented frames, multiple chunks, and stderr", async const body = JSON.parse(await result.response.text()); assert.equal(body.content[0].text, "Hello"); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -408,7 +408,7 @@ test("ACP client fails closed when Devin attempts an internal tool call", async const body = JSON.parse(await result.response.text()); assert.equal(body.error.code, "devin_internal_tool_execution"); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -439,7 +439,7 @@ test("ACP client fails closed on protocol errors and early exit", async () => { const body = JSON.parse(await result.response.text()); assert.equal(body.error.code, scenario.code, scenario.name); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); @@ -463,7 +463,7 @@ test("ACP client times out, cancels, and terminates a stuck process", async () = } finally { if (oldTimeout === undefined) delete process.env.DEVIN_AGENTIC_ACP_TIMEOUT_MS; else process.env.DEVIN_AGENTIC_ACP_TIMEOUT_MS = oldTimeout; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -517,7 +517,7 @@ rl.on("line", (line) => { } finally { if (oldBin === undefined) delete process.env.CLI_DEVIN_AGENTIC_BIN; else process.env.CLI_DEVIN_AGENTIC_BIN = oldBin; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -572,6 +572,6 @@ rl.on("line", (line) => { } finally { if (oldBin === undefined) delete process.env.CLI_DEVIN_AGENTIC_BIN; else process.env.CLI_DEVIN_AGENTIC_BIN = oldBin; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/executor-map-golden.test.ts b/tests/unit/executor-map-golden.test.ts index ea83e56756..e9a1f01d2c 100644 --- a/tests/unit/executor-map-golden.test.ts +++ b/tests/unit/executor-map-golden.test.ts @@ -25,7 +25,7 @@ const { SEARCH_PROVIDERS } = await import("../../open-sse/config/searchRegistry. const { goldenSnapshot } = await import("../helpers/goldenSnapshot.ts"); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // The specialized keys are not exported; enumerate them through the public diff --git a/tests/unit/executor-registry.test.ts b/tests/unit/executor-registry.test.ts index c05128681b..d7e9c35da0 100644 --- a/tests/unit/executor-registry.test.ts +++ b/tests/unit/executor-registry.test.ts @@ -18,7 +18,7 @@ const { getExecutor, hasSpecializedExecutor, BaseExecutor, DefaultExecutor } = a ); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("built-ins are registered at module load and resolve through the registry", () => { diff --git a/tests/unit/feature-flags-settings.test.ts b/tests/unit/feature-flags-settings.test.ts index d53d9c199d..708ebed493 100644 --- a/tests/unit/feature-flags-settings.test.ts +++ b/tests/unit/feature-flags-settings.test.ts @@ -230,7 +230,7 @@ describe("featureFlagDefinitions", () => { describe("featureFlags DB module", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -240,7 +240,7 @@ describe("featureFlags DB module", () => { after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("getFeatureFlagOverrides returns empty object when no overrides", () => { @@ -289,7 +289,7 @@ describe("featureFlags DB module", () => { describe("resolveFeatureFlag", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -300,7 +300,7 @@ describe("resolveFeatureFlag", () => { after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env["REQUIRE_API_KEY"]; }); @@ -397,7 +397,7 @@ describe("resolveFeatureFlag", () => { console.error = () => {}; try { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); const blockerPath = path.join(tmpDir, "storage.sqlite"); fs.mkdirSync(blockerPath, { recursive: true }); @@ -405,7 +405,7 @@ describe("resolveFeatureFlag", () => { } finally { console.error = originalError; core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } }); @@ -460,7 +460,7 @@ describe("resolveFeatureFlag", () => { console.error = () => {}; try { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); const blockerPath = path.join(tmpDir, "storage.sqlite"); fs.mkdirSync(blockerPath, { recursive: true }); @@ -468,7 +468,7 @@ describe("resolveFeatureFlag", () => { } finally { console.error = originalError; core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } }); diff --git a/tests/unit/feature-triage/integration.test.mjs b/tests/unit/feature-triage/integration.test.mjs index b56b2c564e..bff7678cda 100644 --- a/tests/unit/feature-triage/integration.test.mjs +++ b/tests/unit/feature-triage/integration.test.mjs @@ -155,6 +155,6 @@ describe("feature-triage integration", () => { assert.equal(out.counts.skip_has_pr, 1); assert.equal(out.buckets.already_delivered[0].version, "v3.7.2"); - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); }); diff --git a/tests/unit/file-deletion.test.ts b/tests/unit/file-deletion.test.ts index 057d02f7b5..e74f480ef1 100644 --- a/tests/unit/file-deletion.test.ts +++ b/tests/unit/file-deletion.test.ts @@ -14,7 +14,7 @@ const { getDbInstance, resetDbInstance } = await import("@/lib/db/core"); after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/fix-bare-model-precedence.test.ts b/tests/unit/fix-bare-model-precedence.test.ts index 72107710d7..0c5c98523b 100644 --- a/tests/unit/fix-bare-model-precedence.test.ts +++ b/tests/unit/fix-bare-model-precedence.test.ts @@ -37,7 +37,7 @@ async function seedActiveCodexConnection() { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("CODEX_NATIVE_UNPREFIXED_MODELS includes gpt-5.6-sol tier set", () => { diff --git a/tests/unit/fix-bare-routing-fallback.test.ts b/tests/unit/fix-bare-routing-fallback.test.ts index 6a7f693c95..6bc228e19a 100644 --- a/tests/unit/fix-bare-routing-fallback.test.ts +++ b/tests/unit/fix-bare-routing-fallback.test.ts @@ -36,7 +36,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("bare gpt-5.6-sol routes to codex (precedence via CODEX_NATIVE_UNPREFIXED_MODELS)", async () => { diff --git a/tests/unit/fix-tls-client-node-binary-7802.test.ts b/tests/unit/fix-tls-client-node-binary-7802.test.ts index c4c1209949..ec59de5e33 100644 --- a/tests/unit/fix-tls-client-node-binary-7802.test.ts +++ b/tests/unit/fix-tls-client-node-binary-7802.test.ts @@ -22,7 +22,7 @@ test("no-ops when node_modules/tls-client-node is absent (module not installed)" await fixTlsClientNodeBinary({ rootDir, log }); assert.deepEqual(logs, []); } finally { - rmSync(rootDir, { recursive: true, force: true }); + rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -43,7 +43,7 @@ test("copies an already-populated root bin/ into the standalone dist bundle (#78 assert.ok(existsSync(distBin), "dist bin/ should have been created"); assert.deepEqual(readdirSync(distBin), ["tls-client-linux-ubuntu-amd64-1.0.0.so"]); } finally { - rmSync(rootDir, { recursive: true, force: true }); + rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -79,7 +79,7 @@ test("retries the download when root bin/ is empty, and stops once a file appear "expected a success log once the retry recovered" ); } finally { - rmSync(rootDir, { recursive: true, force: true }); + rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -110,6 +110,6 @@ test("warns without throwing when every retry leaves bin/ empty (still rate-limi "expected a clear warning pointing at the manual fix, not a silent no-op" ); } finally { - rmSync(rootDir, { recursive: true, force: true }); + rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/fixes-p1.test.ts b/tests/unit/fixes-p1.test.ts index 186cdd7eac..93d76898d2 100644 --- a/tests/unit/fixes-p1.test.ts +++ b/tests/unit/fixes-p1.test.ts @@ -57,7 +57,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -73,7 +73,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("token refresh dedupe key avoids collision for same-prefix tokens", async () => { diff --git a/tests/unit/free-provider-rankings-custom-models-6368.test.ts b/tests/unit/free-provider-rankings-custom-models-6368.test.ts index 98880f654a..25cb491b95 100644 --- a/tests/unit/free-provider-rankings-custom-models-6368.test.ts +++ b/tests/unit/free-provider-rankings-custom-models-6368.test.ts @@ -39,7 +39,7 @@ const CUSTOM_MODEL_ID = "claude-fable-5-6368"; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("mergeProviderModels: additively includes custom models, de-duping by id", () => { diff --git a/tests/unit/free-provider-rankings-usage-route.test.ts b/tests/unit/free-provider-rankings-usage-route.test.ts index e493ddca07..314d72b8d6 100644 --- a/tests/unit/free-provider-rankings-usage-route.test.ts +++ b/tests/unit/free-provider-rankings-usage-route.test.ts @@ -29,7 +29,7 @@ test.after(() => { core.resetDbInstance(); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("route: an unknown usageRange is rejected with 400, not coerced", async () => { diff --git a/tests/unit/free-proxies-add-to-pool.test.ts b/tests/unit/free-proxies-add-to-pool.test.ts index 3767762c5a..c16ea70e3a 100644 --- a/tests/unit/free-proxies-add-to-pool.test.ts +++ b/tests/unit/free-proxies-add-to-pool.test.ts @@ -21,7 +21,7 @@ const bulkAddRoute = async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/free-proxies-db.test.ts b/tests/unit/free-proxies-db.test.ts index 369f5fbb34..d09ddcd345 100644 --- a/tests/unit/free-proxies-db.test.ts +++ b/tests/unit/free-proxies-db.test.ts @@ -12,13 +12,13 @@ const freeProxiesDb = await import("../../src/lib/db/freeProxies.ts"); async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("upsertFreeProxy creates a new record", async () => { diff --git a/tests/unit/free-proxies-list-search.test.ts b/tests/unit/free-proxies-list-search.test.ts index 57dea9618b..e34fa0f37a 100644 --- a/tests/unit/free-proxies-list-search.test.ts +++ b/tests/unit/free-proxies-list-search.test.ts @@ -15,13 +15,13 @@ const freeProxiesDb = await import("../../src/lib/db/freeProxies.ts"); async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function make(host: string, quality: number, latency: number): FreeProxyItem { diff --git a/tests/unit/free-proxy-auto-sync-scheduler.test.ts b/tests/unit/free-proxy-auto-sync-scheduler.test.ts index c07652be65..d40571c3e4 100644 --- a/tests/unit/free-proxy-auto-sync-scheduler.test.ts +++ b/tests/unit/free-proxy-auto-sync-scheduler.test.ts @@ -45,7 +45,7 @@ function reset() { restoreEnv(); process.env.FREE_PROXY_AUTO_SYNC_ENABLED = "false"; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -57,7 +57,7 @@ test.after(() => { scheduler.stopFreeProxyAutoSync(); scheduler._setSyncCycleRunnerForTests(null); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); restoreEnv(); }); diff --git a/tests/unit/free-proxy-providers.test.ts b/tests/unit/free-proxy-providers.test.ts index 1faa53b9cf..4082cd4d0d 100644 --- a/tests/unit/free-proxy-providers.test.ts +++ b/tests/unit/free-proxy-providers.test.ts @@ -18,13 +18,13 @@ const { getProvider, getEnabledProviders, getAllProviders } = async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Registry ───────────────────────────────────────────────────────────────── diff --git a/tests/unit/free-proxy-sync-cycle.test.ts b/tests/unit/free-proxy-sync-cycle.test.ts index fd24efb432..35541ffe1f 100644 --- a/tests/unit/free-proxy-sync-cycle.test.ts +++ b/tests/unit/free-proxy-sync-cycle.test.ts @@ -25,7 +25,7 @@ const { runFreeProxySyncCycle } = await import("../../src/lib/freeProxyProviders function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makeProvider( diff --git a/tests/unit/fusion-vision-panel-3378.test.ts b/tests/unit/fusion-vision-panel-3378.test.ts index 572891d252..8911a4dc4e 100644 --- a/tests/unit/fusion-vision-panel-3378.test.ts +++ b/tests/unit/fusion-vision-panel-3378.test.ts @@ -92,7 +92,7 @@ test.after(() => { resetAllSemaphores(); clearModelsDevCapabilities(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/g13-combo-chatcore-golden.test.ts b/tests/unit/g13-combo-chatcore-golden.test.ts index 0cd7a4cd18..8b484b562b 100644 --- a/tests/unit/g13-combo-chatcore-golden.test.ts +++ b/tests/unit/g13-combo-chatcore-golden.test.ts @@ -392,6 +392,6 @@ test("G13 golden detects a public behavior mutation", () => { } finally { if (previousUpdateGolden === undefined) delete process.env.UPDATE_GOLDEN; else process.env.UPDATE_GOLDEN = previousUpdateGolden; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/gamification/aggregate-profile-3484.test.ts b/tests/unit/gamification/aggregate-profile-3484.test.ts index 59a1d156f1..55773ff524 100644 --- a/tests/unit/gamification/aggregate-profile-3484.test.ts +++ b/tests/unit/gamification/aggregate-profile-3484.test.ts @@ -29,7 +29,7 @@ test.after(() => { } catch { /* ignore */ } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3484 getAggregateXp on an empty ledger → zero XP, level 1, no throw", () => { diff --git a/tests/unit/gemini-web-image-account-fallback.test.ts b/tests/unit/gemini-web-image-account-fallback.test.ts index 3be797f6b6..3aad8b7726 100644 --- a/tests/unit/gemini-web-image-account-fallback.test.ts +++ b/tests/unit/gemini-web-image-account-fallback.test.ts @@ -39,7 +39,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Classification (unit) ─────────────────────────────────────────────────── diff --git a/tests/unit/github-copilot-retired-models.test.ts b/tests/unit/github-copilot-retired-models.test.ts index 6ce66556c0..fd8d2df10a 100644 --- a/tests/unit/github-copilot-retired-models.test.ts +++ b/tests/unit/github-copilot-retired-models.test.ts @@ -17,7 +17,7 @@ before(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GitHub Copilot sync rejects retired Gemini models", async () => { diff --git a/tests/unit/glm-provider-model-import-route.test.ts b/tests/unit/glm-provider-model-import-route.test.ts index b86c115e70..9f47f555c7 100644 --- a/tests/unit/glm-provider-model-import-route.test.ts +++ b/tests/unit/glm-provider-model-import-route.test.ts @@ -19,13 +19,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GLM import uses international coding endpoint when apiRegion is international", async () => { diff --git a/tests/unit/gpt-max-input-tokens-6191.test.ts b/tests/unit/gpt-max-input-tokens-6191.test.ts index df2a90fd60..3d8b8fb151 100644 --- a/tests/unit/gpt-max-input-tokens-6191.test.ts +++ b/tests/unit/gpt-max-input-tokens-6191.test.ts @@ -18,7 +18,7 @@ const modelCapabilities = await import("../../src/lib/modelCapabilities.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -28,7 +28,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("codex gpt-5.5 reports max_input_tokens smaller than its context window (#6191)", () => { diff --git a/tests/unit/grok-cli-device-route.test.ts b/tests/unit/grok-cli-device-route.test.ts index fc926a946c..1453f348d4 100644 --- a/tests/unit/grok-cli-device-route.test.ts +++ b/tests/unit/grok-cli-device-route.test.ts @@ -23,7 +23,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("grok-cli poll does not require a PKCE code verifier", async () => { diff --git a/tests/unit/grok-cli-provider-limits-ui.test.ts b/tests/unit/grok-cli-provider-limits-ui.test.ts index bee641c2bd..c3f3ca4c9d 100644 --- a/tests/unit/grok-cli-provider-limits-ui.test.ts +++ b/tests/unit/grok-cli-provider-limits-ui.test.ts @@ -30,7 +30,7 @@ const baseBilling = { }; test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Grok Build product aliases normalize to one stable row and preserve collisions", () => { diff --git a/tests/unit/grok-cli-provider-limits.test.ts b/tests/unit/grok-cli-provider-limits.test.ts index e3fb1689ff..081d403f5f 100644 --- a/tests/unit/grok-cli-provider-limits.test.ts +++ b/tests/unit/grok-cli-provider-limits.test.ts @@ -135,7 +135,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("grok-cli fetches the fixed read-only surfaces with the full Grok client profile", async () => { diff --git a/tests/unit/guardrails-api-3496.test.ts b/tests/unit/guardrails-api-3496.test.ts index 0a845effae..f1c1b92dc2 100644 --- a/tests/unit/guardrails-api-3496.test.ts +++ b/tests/unit/guardrails-api-3496.test.ts @@ -34,7 +34,7 @@ test.after(() => { } catch { /* ignore */ } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3496 GET /api/guardrails lists the registered guardrails with status", async () => { diff --git a/tests/unit/guardrails/videoBridgeFu07StructuralSampling.test.ts b/tests/unit/guardrails/videoBridgeFu07StructuralSampling.test.ts index 5c5695f018..477c00c58c 100644 --- a/tests/unit/guardrails/videoBridgeFu07StructuralSampling.test.ts +++ b/tests/unit/guardrails/videoBridgeFu07StructuralSampling.test.ts @@ -432,7 +432,7 @@ test("real FFmpeg evidence distinguishes a frozen dark segment from dense motion assert.equal(decision.timestamps.filter((timestamp) => timestamp < 6).length, 1); assert.equal(decision.timestamps.filter((timestamp) => timestamp > 6).length, 3); } finally { - await rm(directory, { force: true, recursive: true }); + await rm(directory, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -481,6 +481,6 @@ test("real FFmpeg abort stops preanalysis, skips frame extraction, and cleans th assert.notEqual(privateInputPath, ""); await assert.rejects(() => access(privateInputPath)); } finally { - await rm(directory, { force: true, recursive: true }); + await rm(directory, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/guardrails/videoBridgeRuntime.test.ts b/tests/unit/guardrails/videoBridgeRuntime.test.ts index 01f56f381d..9b5402bfc4 100644 --- a/tests/unit/guardrails/videoBridgeRuntime.test.ts +++ b/tests/unit/guardrails/videoBridgeRuntime.test.ts @@ -431,7 +431,7 @@ test("checks individual and aggregate frame byte caps before returning broker ou 6 ); } finally { - await rm(directory, { recursive: true, force: true }); + await rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/guardrails/vision-bridge-callmodel.test.ts b/tests/unit/guardrails/vision-bridge-callmodel.test.ts index 40a0e77699..2cf82efdc7 100644 --- a/tests/unit/guardrails/vision-bridge-callmodel.test.ts +++ b/tests/unit/guardrails/vision-bridge-callmodel.test.ts @@ -45,7 +45,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.afterEach(() => { diff --git a/tests/unit/guardrails/vision-bridge-credentials-alias-mismatch-10702.test.ts b/tests/unit/guardrails/vision-bridge-credentials-alias-mismatch-10702.test.ts index 942de03474..1fddc4e7b9 100644 --- a/tests/unit/guardrails/vision-bridge-credentials-alias-mismatch-10702.test.ts +++ b/tests/unit/guardrails/vision-bridge-credentials-alias-mismatch-10702.test.ts @@ -16,7 +16,7 @@ const { hasUsableCredentialsForModel } = await import( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("issue #10702: hasUsableCredentialsForModel resolves alias-prefixed model to the raw provider id (command-code / alias cmd)", async () => { diff --git a/tests/unit/guardrails/visionBridge-combo-reroute.test.ts b/tests/unit/guardrails/visionBridge-combo-reroute.test.ts index 7757d028b6..a2e4241bb3 100644 --- a/tests/unit/guardrails/visionBridge-combo-reroute.test.ts +++ b/tests/unit/guardrails/visionBridge-combo-reroute.test.ts @@ -32,7 +32,7 @@ const mappingsDb = await import("../../../src/lib/db/modelComboMappings.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createCombo(name, models, overrides = {}) { diff --git a/tests/unit/guardrails/visionBridgeCredentials.test.ts b/tests/unit/guardrails/visionBridgeCredentials.test.ts index 255c36603c..39e4b2474c 100644 --- a/tests/unit/guardrails/visionBridgeCredentials.test.ts +++ b/tests/unit/guardrails/visionBridgeCredentials.test.ts @@ -40,13 +40,13 @@ const { hasUsableCredentialsForModel, hasTerminalConnectionStatus } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── alias → canonical id resolution (#10702) ──────────────────────────────── diff --git a/tests/unit/guide-settings-route.test.ts b/tests/unit/guide-settings-route.test.ts index 0580a7c9c1..742a7b1543 100644 --- a/tests/unit/guide-settings-route.test.ts +++ b/tests/unit/guide-settings-route.test.ts @@ -55,7 +55,7 @@ test.beforeEach(async () => { }); test.afterEach(async () => { - await fs.rm(DUMMY_HOME, { recursive: true, force: true }).catch(() => {}); + await fs.rm(DUMMY_HOME, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }).catch(() => {}); if (originalXDG === undefined) delete process.env.XDG_CONFIG_HOME; else process.env.XDG_CONFIG_HOME = originalXDG; if (originalAppData === undefined) delete process.env.APPDATA; diff --git a/tests/unit/headroom-codex-quota-snapshot-6379.test.ts b/tests/unit/headroom-codex-quota-snapshot-6379.test.ts index 6472496b15..8027572af1 100644 --- a/tests/unit/headroom-codex-quota-snapshot-6379.test.ts +++ b/tests/unit/headroom-codex-quota-snapshot-6379.test.ts @@ -51,7 +51,7 @@ const { _clearSaturationCache } = await import("../../src/lib/quota/saturationSi async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); _clearSaturationCache(); } @@ -62,7 +62,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const silentLog = { warn: () => {} }; diff --git a/tests/unit/health-ping-route.test.ts b/tests/unit/health-ping-route.test.ts index d32b990c02..6cc09fcd53 100644 --- a/tests/unit/health-ping-route.test.ts +++ b/tests/unit/health-ping-route.test.ts @@ -17,7 +17,7 @@ const routeModule = await import("../../src/app/api/health/ping/route.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/health/ping returns 200 with status ok and ISO timestamp", async () => { diff --git a/tests/unit/helpers/decollidedMigrationsDir.ts b/tests/unit/helpers/decollidedMigrationsDir.ts index 00d0f42d8f..9aa11cabc8 100644 --- a/tests/unit/helpers/decollidedMigrationsDir.ts +++ b/tests/unit/helpers/decollidedMigrationsDir.ts @@ -71,7 +71,7 @@ export function useDecollidedMigrationsDir(): void { process.on("exit", () => { try { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // Best-effort cleanup — the OS reaps its temp dir eventually. } diff --git a/tests/unit/hermes-agent-settings-route-keyid-10711.test.ts b/tests/unit/hermes-agent-settings-route-keyid-10711.test.ts index 6651b8bdc4..7a74234796 100644 --- a/tests/unit/hermes-agent-settings-route-keyid-10711.test.ts +++ b/tests/unit/hermes-agent-settings-route-keyid-10711.test.ts @@ -40,7 +40,7 @@ const route = await import("../../src/app/api/cli-tools/hermes-agent-settings/ro test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function authCookie(): Promise { diff --git a/tests/unit/hidden-models-leak-v1-models-11300.test.ts b/tests/unit/hidden-models-leak-v1-models-11300.test.ts index c937d2464e..d9bcbd84bd 100644 --- a/tests/unit/hidden-models-leak-v1-models-11300.test.ts +++ b/tests/unit/hidden-models-leak-v1-models-11300.test.ts @@ -36,7 +36,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function fetchCatalogIds(): Promise { diff --git a/tests/unit/image-compat-node-alias-shadow.test.ts b/tests/unit/image-compat-node-alias-shadow.test.ts index 06d4d1db08..67d3debc21 100644 --- a/tests/unit/image-compat-node-alias-shadow.test.ts +++ b/tests/unit/image-compat-node-alias-shadow.test.ts @@ -50,7 +50,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("compatible node with prefix=cf must NOT shadow the built-in cloudflare-ai alias", async () => { diff --git a/tests/unit/image-edits-multipart-3273.test.ts b/tests/unit/image-edits-multipart-3273.test.ts index d7e3e390dd..c4c45f6584 100644 --- a/tests/unit/image-edits-multipart-3273.test.ts +++ b/tests/unit/image-edits-multipart-3273.test.ts @@ -68,7 +68,7 @@ test.after(() => { /* ignore */ } try { - fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true }); + fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/image-generation-route-auth.test.ts b/tests/unit/image-generation-route-auth.test.ts index e6f25631a7..03a2912832 100644 --- a/tests/unit/image-generation-route-auth.test.ts +++ b/tests/unit/image-generation-route-auth.test.ts @@ -30,7 +30,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -71,7 +71,7 @@ test.after(() => { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 image generation POST requires an API key when REQUIRE_API_KEY is enabled", async () => { diff --git a/tests/unit/image-generation-route.test.ts b/tests/unit/image-generation-route.test.ts index f136078704..bad24bae8a 100644 --- a/tests/unit/image-generation-route.test.ts +++ b/tests/unit/image-generation-route.test.ts @@ -72,7 +72,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // #6303 moved this route onto the shared unified catalog (getUnifiedModelsResponse), // which #6408 wrapped in a 1.5s TTL response cache keyed only by (prefix, isCodex @@ -120,7 +120,7 @@ test.after(() => { globalThis.fetch = originalFetch; apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("image routes expose CORS preflight handlers", async () => { diff --git a/tests/unit/image-model-not-in-chat-catalog-6457.test.ts b/tests/unit/image-model-not-in-chat-catalog-6457.test.ts index 84187fe2f7..0e02a4e615 100644 --- a/tests/unit/image-model-not-in-chat-catalog-6457.test.ts +++ b/tests/unit/image-model-not-in-chat-catalog-6457.test.ts @@ -33,7 +33,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function seedProviderConnection(provider: string) { diff --git a/tests/unit/image-routes-combo-edits-3214-3215.test.ts b/tests/unit/image-routes-combo-edits-3214-3215.test.ts index ce8ca36191..f896f09e73 100644 --- a/tests/unit/image-routes-combo-edits-3214-3215.test.ts +++ b/tests/unit/image-routes-combo-edits-3214-3215.test.ts @@ -35,7 +35,7 @@ const { createCombo } = await import("../../src/lib/db/combos.ts"); test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/inspector-agent-bridge-hook.test.ts b/tests/unit/inspector-agent-bridge-hook.test.ts index a1a0c75b69..ec36820cd7 100644 --- a/tests/unit/inspector-agent-bridge-hook.test.ts +++ b/tests/unit/inspector-agent-bridge-hook.test.ts @@ -27,7 +27,7 @@ const { recordRequestStart } = await import( async function resetStorage() { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); getDbInstance(); } @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("recordRequestStart: custom-host entry → source=custom-host, agent=undefined", async () => { diff --git a/tests/unit/instrumentation-warm-catalog-cache.test.ts b/tests/unit/instrumentation-warm-catalog-cache.test.ts index 84fa161e78..56861834de 100644 --- a/tests/unit/instrumentation-warm-catalog-cache.test.ts +++ b/tests/unit/instrumentation-warm-catalog-cache.test.ts @@ -47,7 +47,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -64,7 +64,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const REAL_FETCH = globalThis.fetch; diff --git a/tests/unit/intercept-fetch-resolver.test.ts b/tests/unit/intercept-fetch-resolver.test.ts index ff109d89e2..849cf4e5f1 100644 --- a/tests/unit/intercept-fetch-resolver.test.ts +++ b/tests/unit/intercept-fetch-resolver.test.ts @@ -18,7 +18,7 @@ const { setInterceptionRules, resolveInterceptFetch } = await import( describe("db/interceptionRules — resolveInterceptFetch precedence (#7339)", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -28,7 +28,7 @@ describe("db/interceptionRules — resolveInterceptFetch precedence (#7339)", () after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("returns undefined when no provider/model rule exists", () => { diff --git a/tests/unit/interception-rules.test.ts b/tests/unit/interception-rules.test.ts index bad1e0a281..1653ebbe18 100644 --- a/tests/unit/interception-rules.test.ts +++ b/tests/unit/interception-rules.test.ts @@ -20,7 +20,7 @@ const { describe("db/interceptionRules — per-model interception rules (#3384)", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -30,7 +30,7 @@ describe("db/interceptionRules — per-model interception rules (#3384)", () => after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("returns null for an unconfigured provider", () => { diff --git a/tests/unit/internal-service-auth.test.ts b/tests/unit/internal-service-auth.test.ts index 3ff053ab01..3bc5497c5b 100644 --- a/tests/unit/internal-service-auth.test.ts +++ b/tests/unit/internal-service-auth.test.ts @@ -61,6 +61,6 @@ test("internal service token file is read without exposing it to process env", ( [INTERNAL_SERVICE_AUTH_HEADER]: "file-backed-token-0123456789", }); } finally { - fs.rmSync(directory, { recursive: true, force: true }); + fs.rmSync(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/ip-filter-persistence-6131.test.ts b/tests/unit/ip-filter-persistence-6131.test.ts index 279193627e..b7f195f648 100644 --- a/tests/unit/ip-filter-persistence-6131.test.ts +++ b/tests/unit/ip-filter-persistence-6131.test.ts @@ -17,13 +17,13 @@ const ipFilter = await import("../../open-sse/services/ipFilter.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { // Fresh DB per test + fresh in-memory module state. core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); ipFilter.resetIPFilter(); }); diff --git a/tests/unit/ip-filter.test.ts b/tests/unit/ip-filter.test.ts index 4559bc6812..77bad1ea64 100644 --- a/tests/unit/ip-filter.test.ts +++ b/tests/unit/ip-filter.test.ts @@ -27,12 +27,12 @@ const { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); resetIPFilter(); }); diff --git a/tests/unit/issue-6343-v0-web-alias-collision.test.ts b/tests/unit/issue-6343-v0-web-alias-collision.test.ts index 15e672e3b2..75116efb3d 100644 --- a/tests/unit/issue-6343-v0-web-alias-collision.test.ts +++ b/tests/unit/issue-6343-v0-web-alias-collision.test.ts @@ -26,7 +26,7 @@ describe("#6343: v0-vercel-web credential detection (alias collision)", () => { } catch { // best-effort cleanup } - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("v0-vercel and v0-vercel-web no longer share an alias", async () => { diff --git a/tests/unit/issue-6686-quota-preflight-coverage.test.ts b/tests/unit/issue-6686-quota-preflight-coverage.test.ts index 488ee55f58..0b8d147d3c 100644 --- a/tests/unit/issue-6686-quota-preflight-coverage.test.ts +++ b/tests/unit/issue-6686-quota-preflight-coverage.test.ts @@ -86,7 +86,7 @@ test("#6686: getProviderCredentialsWithQuotaPreflight (now used by every credent core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); try { @@ -135,6 +135,6 @@ test("#6686: getProviderCredentialsWithQuotaPreflight (now used by every credent } finally { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/issue-agent-route-execution.test.ts b/tests/unit/issue-agent-route-execution.test.ts index 9f0c7e0b86..1d90b6d9ab 100644 --- a/tests/unit/issue-agent-route-execution.test.ts +++ b/tests/unit/issue-agent-route-execution.test.ts @@ -17,7 +17,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/json-migration-combos.test.ts b/tests/unit/json-migration-combos.test.ts index 978f9109ae..4cf15fb625 100644 --- a/tests/unit/json-migration-combos.test.ts +++ b/tests/unit/json-migration-combos.test.ts @@ -23,7 +23,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/key-health-402-disable-5239.test.ts b/tests/unit/key-health-402-disable-5239.test.ts index 5b3a5286e1..d41a441089 100644 --- a/tests/unit/key-health-402-disable-5239.test.ts +++ b/tests/unit/key-health-402-disable-5239.test.ts @@ -31,7 +31,7 @@ const { getValidApiKey, getAllKeyHealth, resetKeyStatus } = await import( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Two keys live on ONE connection as API Key Round-Robin (extraApiKeys[]). diff --git a/tests/unit/kimi-coding-billing.test.ts b/tests/unit/kimi-coding-billing.test.ts index 0269228878..6720b1436d 100644 --- a/tests/unit/kimi-coding-billing.test.ts +++ b/tests/unit/kimi-coding-billing.test.ts @@ -83,7 +83,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("kimi-coding exposes the official boosterWallet Extra Usage contract", async () => { diff --git a/tests/unit/kimi-quota-reset-recovery.test.ts b/tests/unit/kimi-quota-reset-recovery.test.ts index 8771cba187..5129037c2a 100644 --- a/tests/unit/kimi-quota-reset-recovery.test.ts +++ b/tests/unit/kimi-quota-reset-recovery.test.ts @@ -17,7 +17,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); test.after(() => { quotaCache.__clearForTests(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Kimi billing-cycle quota errors remain active and recover at the cached reset", async () => { diff --git a/tests/unit/kimi-web-models-discovery.test.ts b/tests/unit/kimi-web-models-discovery.test.ts index b565698418..dd0ae0cdc9 100644 --- a/tests/unit/kimi-web-models-discovery.test.ts +++ b/tests/unit/kimi-web-models-discovery.test.ts @@ -13,13 +13,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("kimi-web uses the curated registry catalog without remote discovery", async () => { diff --git a/tests/unit/kiro-auto-import-idc-2059.test.ts b/tests/unit/kiro-auto-import-idc-2059.test.ts index 331637ffb5..e215036ea5 100644 --- a/tests/unit/kiro-auto-import-idc-2059.test.ts +++ b/tests/unit/kiro-auto-import-idc-2059.test.ts @@ -57,7 +57,7 @@ let tmpHome: string; test.beforeEach(() => { tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-kiro-idc-2059-")); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.HOME = tmpHome; delete process.env.APPDATA; @@ -73,12 +73,12 @@ test.afterEach(() => { delete process.env.APPDATA; } globalThis.fetch = ORIGINAL_FETCH; - if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true }); + if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helpers ────────────────────────────────────────────────────────────────── diff --git a/tests/unit/kiro-auto-import-name-dedup-3615.test.ts b/tests/unit/kiro-auto-import-name-dedup-3615.test.ts index 748312a316..d8dac81347 100644 --- a/tests/unit/kiro-auto-import-name-dedup-3615.test.ts +++ b/tests/unit/kiro-auto-import-name-dedup-3615.test.ts @@ -24,7 +24,7 @@ process.env.API_KEY_SECRET = process.env.API_KEY_SECRET || "test-api-key-secret- test.after(() => { try { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best effort } diff --git a/tests/unit/kiro-builder-id-import-3333.test.ts b/tests/unit/kiro-builder-id-import-3333.test.ts index f9ba09772f..106d460b83 100644 --- a/tests/unit/kiro-builder-id-import-3333.test.ts +++ b/tests/unit/kiro-builder-id-import-3333.test.ts @@ -35,7 +35,7 @@ test.beforeEach(() => { test.afterEach(() => { process.env.HOME = ORIGINAL_HOME; globalThis.fetch = ORIGINAL_FETCH; - if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true }); + if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("validateImportToken uses cached Builder ID client creds + OIDC refresh path", async () => { diff --git a/tests/unit/kiro-import-error-3589.test.ts b/tests/unit/kiro-import-error-3589.test.ts index 4c789cae32..948b92c6af 100644 --- a/tests/unit/kiro-import-error-3589.test.ts +++ b/tests/unit/kiro-import-error-3589.test.ts @@ -23,7 +23,7 @@ const { buildKiroImportError } = await import("../../src/app/api/oauth/kiro/impo test.after(() => { try { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best effort } diff --git a/tests/unit/kiro-second-oauth-connection-10815.test.ts b/tests/unit/kiro-second-oauth-connection-10815.test.ts index 4b2640d99b..8128e9fa39 100644 --- a/tests/unit/kiro-second-oauth-connection-10815.test.ts +++ b/tests/unit/kiro-second-oauth-connection-10815.test.ts @@ -12,7 +12,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderConnection keeps two Kiro oauth connections with the same email but different profileArn separate (#10815)", async () => { diff --git a/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts b/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts index 0afef36614..197b0ed6c6 100644 --- a/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts +++ b/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts @@ -53,7 +53,7 @@ let tmpHome: string; test.beforeEach(() => { tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-kiro-1253-")); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); process.env.HOME = tmpHome; delete process.env.APPDATA; @@ -68,12 +68,12 @@ test.afterEach(() => { delete process.env.APPDATA; } globalThis.fetch = ORIGINAL_FETCH; - if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true }); + if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function cacheDirFor(home: string) { diff --git a/tests/unit/kiro-windows-auto-import-3363.test.ts b/tests/unit/kiro-windows-auto-import-3363.test.ts index cc1ebd4d8a..d6674270ff 100644 --- a/tests/unit/kiro-windows-auto-import-3363.test.ts +++ b/tests/unit/kiro-windows-auto-import-3363.test.ts @@ -44,7 +44,7 @@ test.beforeEach(() => { tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-kiro-3363-")); // Reset DB instance so each test gets a clean settings DB (no requireLogin). core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // Override HOME so homedir() returns a temp dir where no kiro-cli DB exists. process.env.HOME = tmpHome; @@ -69,12 +69,12 @@ test.afterEach(() => { delete process.env.APPDATA; } globalThis.fetch = ORIGINAL_FETCH; - if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true }); + if (tmpHome) fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Helper to call the GET handler and parse the JSON body. diff --git a/tests/unit/latency-stats-ttft-6875.test.ts b/tests/unit/latency-stats-ttft-6875.test.ts index 7a05d029ef..332dea2ed3 100644 --- a/tests/unit/latency-stats-ttft-6875.test.ts +++ b/tests/unit/latency-stats-ttft-6875.test.ts @@ -20,7 +20,7 @@ const clearPendingRequests = usageHistory.clearPendingRequests; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); clearPendingRequests(); } @@ -32,7 +32,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getModelLatencyStats aggregates avgTtftMs/avgE2ELatencyMs/avgTokensPerSecond over successful rows", async () => { diff --git a/tests/unit/least-used-rotation-10945.test.ts b/tests/unit/least-used-rotation-10945.test.ts index 6218697ce1..38730dec55 100644 --- a/tests/unit/least-used-rotation-10945.test.ts +++ b/tests/unit/least-used-rotation-10945.test.ts @@ -27,13 +27,13 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Three active apikey connections, distinct priorities, all last_used_at NULL. */ diff --git a/tests/unit/lib/consoleInterceptor-epipe.test.ts b/tests/unit/lib/consoleInterceptor-epipe.test.ts index 4a968e3bb3..251d4f48bf 100644 --- a/tests/unit/lib/consoleInterceptor-epipe.test.ts +++ b/tests/unit/lib/consoleInterceptor-epipe.test.ts @@ -155,7 +155,7 @@ test("a non-EPIPE stream error is still fatal: it must be re-raised (#8181)", as env: { ...process.env, DISABLE_SQLITE_AUTO_BACKUP: "true" }, }); - rmSync(childDir, { recursive: true, force: true }); + rmSync(childDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); assert.notEqual( result.status, @@ -197,7 +197,7 @@ test("the stdio guard is installed even when file logging is disabled (#8181)", env: { ...process.env, DISABLE_SQLITE_AUTO_BACKUP: "true", APP_LOG_TO_FILE: "false" }, }); - rmSync(childDir, { recursive: true, force: true }); + rmSync(childDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); assert.equal( result.status, @@ -259,5 +259,5 @@ test.after(() => { if (prevLogFilePath === undefined) delete process.env.APP_LOG_FILE_PATH; else process.env.APP_LOG_FILE_PATH = prevLogFilePath; - if (existsSync(dir)) rmSync(dir, { recursive: true, force: true }); + if (existsSync(dir)) rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/lib/consoleInterceptor-writes.test.ts b/tests/unit/lib/consoleInterceptor-writes.test.ts index 8a16c244d7..2cba3d5591 100644 --- a/tests/unit/lib/consoleInterceptor-writes.test.ts +++ b/tests/unit/lib/consoleInterceptor-writes.test.ts @@ -56,7 +56,7 @@ function runChild(body: string[]): ChildResult { .map((l) => JSON.parse(l) as Record) : []; - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return { status: result.status, stderr: String(result.stderr), lines }; } @@ -132,7 +132,7 @@ test("a log directory removed at runtime is recreated and logging recovers (#818 `const { dirname } = await import("node:path");`, `M.initConsoleInterceptor();`, `console.error("before removal");`, - `rmSync(dirname(LOG_FILE), { recursive: true, force: true });`, + `rmSync(dirname(LOG_FILE), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });`, `if (existsSync(LOG_FILE)) { process.exit(3); }`, `console.error("after removal");`, `setTimeout(() => process.exit(0), 200);`, @@ -154,7 +154,7 @@ test("the log-unavailable notice is emitted at most once, to the real stderr", ( `M.initConsoleInterceptor();`, // Make the directory unrecreatable so the retry fails and the notice path is exercised. `const parent = dirname(dirname(LOG_FILE));`, - `rmSync(dirname(LOG_FILE), { recursive: true, force: true });`, + `rmSync(dirname(LOG_FILE), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });`, `chmodSync(parent, 0o500);`, `for (let i = 0; i < 5; i++) console.error("unwritable " + i);`, `chmodSync(parent, 0o700);`, diff --git a/tests/unit/lib/jobRegistry/registry.test.ts b/tests/unit/lib/jobRegistry/registry.test.ts index 64ce9d2050..9be264d5b6 100644 --- a/tests/unit/lib/jobRegistry/registry.test.ts +++ b/tests/unit/lib/jobRegistry/registry.test.ts @@ -56,7 +56,7 @@ function resetAll() { } __resetJobRegistry(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -67,7 +67,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("register + start (interval) fires handler immediately", async () => { diff --git a/tests/unit/lib/jobs/backupScheduleJob.test.ts b/tests/unit/lib/jobs/backupScheduleJob.test.ts index b2d2266181..e581057b99 100644 --- a/tests/unit/lib/jobs/backupScheduleJob.test.ts +++ b/tests/unit/lib/jobs/backupScheduleJob.test.ts @@ -13,7 +13,7 @@ async function withTmpDataDir(fn: (dataDir: string) => Promise) { } finally { if (orig === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = orig; - rmSync(dataDir, { recursive: true, force: true }); + rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/lib/managementCliToken.test.ts b/tests/unit/lib/managementCliToken.test.ts index 638c4c3fd7..d2a87a5262 100644 --- a/tests/unit/lib/managementCliToken.test.ts +++ b/tests/unit/lib/managementCliToken.test.ts @@ -28,7 +28,7 @@ const { CLI_TOKEN_HEADER } = await import("../../../src/server/authz/headers.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/lib/quota-reset-events.test.ts b/tests/unit/lib/quota-reset-events.test.ts index 155d515b50..ee1ddb888a 100644 --- a/tests/unit/lib/quota-reset-events.test.ts +++ b/tests/unit/lib/quota-reset-events.test.ts @@ -25,7 +25,7 @@ const OBSERVED = "2026-01-15T00:05:00.000Z"; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("records a weekly window transition and getWindowStart returns the prior window start", () => { diff --git a/tests/unit/lib/warmupScheduler/circuitBreakerFactory.test.ts b/tests/unit/lib/warmupScheduler/circuitBreakerFactory.test.ts index c7808fd572..81c71ea387 100644 --- a/tests/unit/lib/warmupScheduler/circuitBreakerFactory.test.ts +++ b/tests/unit/lib/warmupScheduler/circuitBreakerFactory.test.ts @@ -21,7 +21,7 @@ const core = await import("../../../../src/lib/db/core.ts"); async function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("REDIS_URL unset → SqliteCircuitBreakerStore", async () => { diff --git a/tests/unit/lib/warmupScheduler/circuitBreakerFactoryConcurrency.test.ts b/tests/unit/lib/warmupScheduler/circuitBreakerFactoryConcurrency.test.ts index 0ab9c8b808..faca11da13 100644 --- a/tests/unit/lib/warmupScheduler/circuitBreakerFactoryConcurrency.test.ts +++ b/tests/unit/lib/warmupScheduler/circuitBreakerFactoryConcurrency.test.ts @@ -24,7 +24,7 @@ const core = await import("../../../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** diff --git a/tests/unit/lib/warmupScheduler/circuitBreakerFactoryRelease.test.ts b/tests/unit/lib/warmupScheduler/circuitBreakerFactoryRelease.test.ts index 97ec79116b..3ff651f4f4 100644 --- a/tests/unit/lib/warmupScheduler/circuitBreakerFactoryRelease.test.ts +++ b/tests/unit/lib/warmupScheduler/circuitBreakerFactoryRelease.test.ts @@ -24,7 +24,7 @@ const core = await import("../../../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** diff --git a/tests/unit/lib/warmupScheduler/sqliteCircuitBreakerStore.test.ts b/tests/unit/lib/warmupScheduler/sqliteCircuitBreakerStore.test.ts index da4dae94b5..161a02393a 100644 --- a/tests/unit/lib/warmupScheduler/sqliteCircuitBreakerStore.test.ts +++ b/tests/unit/lib/warmupScheduler/sqliteCircuitBreakerStore.test.ts @@ -23,7 +23,7 @@ const store = new SqliteCircuitBreakerStore(); async function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("recordResult(success): clears streak and records tokens", async () => { diff --git a/tests/unit/limiter-lifecycle.test.ts b/tests/unit/limiter-lifecycle.test.ts index c70981d90c..bc4f612715 100644 --- a/tests/unit/limiter-lifecycle.test.ts +++ b/tests/unit/limiter-lifecycle.test.ts @@ -50,7 +50,7 @@ await flushBackgroundWork(); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -67,7 +67,7 @@ test.after(async () => { await rateLimitManager.__resetRateLimitManagerForTests(); await flushBackgroundWork(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** diff --git a/tests/unit/live-model-catalog-reconciliation-8926.test.ts b/tests/unit/live-model-catalog-reconciliation-8926.test.ts index 5294c830fc..e8a7bcf6a9 100644 --- a/tests/unit/live-model-catalog-reconciliation-8926.test.ts +++ b/tests/unit/live-model-catalog-reconciliation-8926.test.ts @@ -58,7 +58,7 @@ function seedActiveLiveCatalog() { test.beforeEach(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); assert.ok( @@ -71,7 +71,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8926: bare inference excludes a stale static model absent from the active live catalog", async () => { diff --git a/tests/unit/live-ws-public-url.test.ts b/tests/unit/live-ws-public-url.test.ts index deff8cb926..16fd8f7bb6 100644 --- a/tests/unit/live-ws-public-url.test.ts +++ b/tests/unit/live-ws-public-url.test.ts @@ -20,7 +20,7 @@ const wsRoute = await import("../../src/app/api/v1/ws/route.ts"); function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(() => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/llamacpp-model-delete.test.ts b/tests/unit/llamacpp-model-delete.test.ts index 9379cfee8f..29c8180fc3 100644 --- a/tests/unit/llamacpp-model-delete.test.ts +++ b/tests/unit/llamacpp-model-delete.test.ts @@ -12,7 +12,7 @@ const modelsDb = await import("../../src/lib/db/models.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -22,7 +22,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("removeSyncedAvailableModel deletes a single model from syncedAvailableModels", async () => { diff --git a/tests/unit/llm7-byteplus-models-fetch-3976.test.ts b/tests/unit/llm7-byteplus-models-fetch-3976.test.ts index 0223191799..d154ff066d 100644 --- a/tests/unit/llm7-byteplus-models-fetch-3976.test.ts +++ b/tests/unit/llm7-byteplus-models-fetch-3976.test.ts @@ -27,13 +27,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/lmstudio-connection-baseurl-11233.test.ts b/tests/unit/lmstudio-connection-baseurl-11233.test.ts index 78af8690e4..1d8ad7afdd 100644 --- a/tests/unit/lmstudio-connection-baseurl-11233.test.ts +++ b/tests/unit/lmstudio-connection-baseurl-11233.test.ts @@ -15,7 +15,7 @@ const { createEmbeddingResponse } = await import("../../src/lib/embeddings/servi test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Issue #11233: the dashboard stores LM Studio connections under the provider diff --git a/tests/unit/local-corpus-index.test.ts b/tests/unit/local-corpus-index.test.ts index fc26e9802b..12851efeb5 100644 --- a/tests/unit/local-corpus-index.test.ts +++ b/tests/unit/local-corpus-index.test.ts @@ -21,7 +21,7 @@ async function withCorpus( try { await run(root, index); } finally { - await fs.rm(root, { recursive: true, force: true }); + await fs.rm(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/local-rerank-logging.test.ts b/tests/unit/local-rerank-logging.test.ts index 3c6ec62794..820a1f7694 100644 --- a/tests/unit/local-rerank-logging.test.ts +++ b/tests/unit/local-rerank-logging.test.ts @@ -35,7 +35,7 @@ test.describe("Local rerank provider logging and fallback", () => { globalThis.fetch = originalFetch; core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore } diff --git a/tests/unit/log-export-routes.test.mjs b/tests/unit/log-export-routes.test.mjs index 3ff34a36ac..12bdecbcf3 100644 --- a/tests/unit/log-export-routes.test.mjs +++ b/tests/unit/log-export-routes.test.mjs @@ -17,7 +17,7 @@ const exportAllRoute = await import("../../src/app/api/db-backups/exportAll/rout async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.updateSettings({ requireLogin: false }); } @@ -28,7 +28,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/logs/export returns explicit detailed payloads from artifact storage", async () => { diff --git a/tests/unit/log-retention.test.ts b/tests/unit/log-retention.test.ts index f9d83d4c8d..16558ed6e5 100644 --- a/tests/unit/log-retention.test.ts +++ b/tests/unit/log-retention.test.ts @@ -16,7 +16,7 @@ const compliance = await import("../../src/lib/compliance/index.ts"); function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/logger-write-after-datadir-removed-6360.test.ts b/tests/unit/logger-write-after-datadir-removed-6360.test.ts index 26c6c2858c..ea9a8bea42 100644 --- a/tests/unit/logger-write-after-datadir-removed-6360.test.ts +++ b/tests/unit/logger-write-after-datadir-removed-6360.test.ts @@ -70,7 +70,7 @@ test("logger must not crash the process when its worker transport reports a writ // Simulate the teardown every test file already does: rip out DATA_DIR // while the logger's worker-thread transport is still alive. - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); assert.equal(existsSync(dir), false, "sanity: DATA_DIR must actually be gone"); // Simulate the worker thread reporting the resulting write failure back to @@ -104,6 +104,6 @@ test("logger must not crash the process when its worker transport reports a writ test.after(async () => { await flushLogger(); if (existsSync(dir)) { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/login-bootstrap-route.test.ts b/tests/unit/login-bootstrap-route.test.ts index c51bd9870a..8df1f6ccae 100644 --- a/tests/unit/login-bootstrap-route.test.ts +++ b/tests/unit/login-bootstrap-route.test.ts @@ -22,7 +22,7 @@ type BootstrapResponse = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ test.afterEach(() => { test.after(() => { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const originalHash = bcrypt.hash; diff --git a/tests/unit/managed-available-models.test.ts b/tests/unit/managed-available-models.test.ts index 2635867568..db79cbcab7 100644 --- a/tests/unit/managed-available-models.test.ts +++ b/tests/unit/managed-available-models.test.ts @@ -21,7 +21,7 @@ const { getModelsByProviderId } = await import("../../src/shared/constants/model async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("CC compatible fallback models mirror the OAuth Claude Code registry list", () => { diff --git a/tests/unit/managed-model-import.test.ts b/tests/unit/managed-model-import.test.ts index e6e3bc04b7..5e75583c71 100644 --- a/tests/unit/managed-model-import.test.ts +++ b/tests/unit/managed-model-import.test.ts @@ -16,7 +16,7 @@ const { mergeProviderModelListing } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -26,7 +26,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("sync mode builds aliases from provider-level synced available models", async () => { diff --git a/tests/unit/management-password-insecure-default.test.ts b/tests/unit/management-password-insecure-default.test.ts index 752c15e30c..43114c44ce 100644 --- a/tests/unit/management-password-insecure-default.test.ts +++ b/tests/unit/management-password-insecure-default.test.ts @@ -23,13 +23,13 @@ function makeLogger() { test.afterEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("warns when bootstrapping the management password with the CHANGEME default (Seg2)", async () => { diff --git a/tests/unit/management-password.test.ts b/tests/unit/management-password.test.ts index eb5af4034d..1f12a3bd03 100644 --- a/tests/unit/management-password.test.ts +++ b/tests/unit/management-password.test.ts @@ -26,7 +26,7 @@ const managementPassword = await import("../../src/lib/auth/managementPassword.t async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -70,7 +70,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; } else { diff --git a/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts b/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts index 130481f5ad..ed964ea459 100644 --- a/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts +++ b/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts @@ -31,7 +31,7 @@ const { markAccountUnavailable } = await import("../../src/sse/services/auth.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const HOUR = 3_600_000; diff --git a/tests/unit/masked-200-exhaustion-fallback-6427.test.ts b/tests/unit/masked-200-exhaustion-fallback-6427.test.ts index 531c3401a3..afffdff049 100644 --- a/tests/unit/masked-200-exhaustion-fallback-6427.test.ts +++ b/tests/unit/masked-200-exhaustion-fallback-6427.test.ts @@ -56,7 +56,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: unknown) { lastError = error; diff --git a/tests/unit/materialize-bundled-symlinks.test.ts b/tests/unit/materialize-bundled-symlinks.test.ts index a83dc980bd..d7d11440de 100644 --- a/tests/unit/materialize-bundled-symlinks.test.ts +++ b/tests/unit/materialize-bundled-symlinks.test.ts @@ -44,7 +44,7 @@ test("materializeBundledSymlinks dereferences a live symlink into a real directo assert.equal(lstatSync(target).isDirectory(), true); assert.equal(JSON.parse(readFileSync(join(target, "package.json"), "utf8")).marker, "real-ws"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -69,7 +69,7 @@ test("materializeBundledSymlinks relinks a dangling hashed symlink to its siblin assert.equal(lstatSync(target).isSymbolicLink(), false); assert.equal(JSON.parse(readFileSync(join(target, "package.json"), "utf8")).marker, "real-bsq"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -89,7 +89,7 @@ test("materializeBundledSymlinks drops a dangling link with no resolvable siblin assert.equal(summary.removed, 1); assert.equal(existsSync(join(nm, "mystery-deadbeefcafe0001")), false); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -115,7 +115,7 @@ test("materializeBundledSymlinks handles scoped-package symlinks", () => { assert.equal(lstatSync(target).isSymbolicLink(), false); assert.equal(JSON.parse(readFileSync(join(target, "package.json"), "utf8")).marker, "real-hf"); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -133,7 +133,7 @@ test("materializeBundledSymlinks leaves real directories untouched and no-ops on const missing = materializeBundledSymlinks(join(root, "does-not-exist")); assert.deepEqual(missing, { materialized: 0, relinked: 0, removed: 0 }); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -154,7 +154,7 @@ test("syncRebuiltNativeModuleIntoHashedEntries overwrites a hashed entry with th "electron-abi-rebuilt" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -174,7 +174,7 @@ test("syncRebuiltNativeModuleIntoHashedEntries overwrites a plain-named entry to "electron-abi-rebuilt" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -195,7 +195,7 @@ test("syncRebuiltNativeModuleIntoHashedEntries no-ops when root module or nested ); assert.deepEqual(missingNm, { synced: 0 }); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -220,6 +220,6 @@ test("syncRebuiltNativeModuleIntoHashedEntries leaves unrelated entries untouche "unrelated-package" ); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/mcp-connect-scope.test.ts b/tests/unit/mcp-connect-scope.test.ts index 35734a27ff..2266ae3e0c 100644 --- a/tests/unit/mcp-connect-scope.test.ts +++ b/tests/unit/mcp-connect-scope.test.ts @@ -37,7 +37,7 @@ const ORIGINAL_INITIAL = process.env.INITIAL_PASSWORD; function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; @@ -49,7 +49,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = ORIGINAL_JWT; if (ORIGINAL_INITIAL === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/mcp-memory-tools-strategy.test.ts b/tests/unit/mcp-memory-tools-strategy.test.ts index ba740797ca..8aa3fd4b51 100644 --- a/tests/unit/mcp-memory-tools-strategy.test.ts +++ b/tests/unit/mcp-memory-tools-strategy.test.ts @@ -29,7 +29,7 @@ const core = await import("../../src/lib/db/core.ts"); function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/mcp-route-scope-carveout.test.ts b/tests/unit/mcp-route-scope-carveout.test.ts index d64dbc7922..f35d7f8d40 100644 --- a/tests/unit/mcp-route-scope-carveout.test.ts +++ b/tests/unit/mcp-route-scope-carveout.test.ts @@ -30,7 +30,7 @@ const ORIGINAL_INITIAL = process.env.INITIAL_PASSWORD; function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; @@ -42,7 +42,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_JWT === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = ORIGINAL_JWT; if (ORIGINAL_INITIAL === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/media-cost-headers-handlers.test.ts b/tests/unit/media-cost-headers-handlers.test.ts index 341c2871c7..4e8d54822b 100644 --- a/tests/unit/media-cost-headers-handlers.test.ts +++ b/tests/unit/media-cost-headers-handlers.test.ts @@ -31,7 +31,7 @@ test.afterEach(() => { test.after(() => { restoreGlobals(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 video generation failure preserves provider status and error payload", async () => { diff --git a/tests/unit/media-cost-headers.test.ts b/tests/unit/media-cost-headers.test.ts index 41ad5542fb..cdb1cfd6b5 100644 --- a/tests/unit/media-cost-headers.test.ts +++ b/tests/unit/media-cost-headers.test.ts @@ -36,7 +36,7 @@ test.afterEach(() => { test.after(() => { restoreGlobals(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Shared assertions: every successful media Response must carry the diff --git a/tests/unit/memory-engine-status.test.ts b/tests/unit/memory-engine-status.test.ts index a3921b74a9..fa5696ff47 100644 --- a/tests/unit/memory-engine-status.test.ts +++ b/tests/unit/memory-engine-status.test.ts @@ -33,7 +33,7 @@ const { MemoryEngineStatusSchema } = await import("../../src/shared/schemas/memo function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -41,7 +41,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-needs-reindex.test.ts b/tests/unit/memory-needs-reindex.test.ts index 8818358a48..c82ed6e8e9 100644 --- a/tests/unit/memory-needs-reindex.test.ts +++ b/tests/unit/memory-needs-reindex.test.ts @@ -39,7 +39,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -61,7 +61,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ──────────────── markMemoryNeedsReindex ──────────────── diff --git a/tests/unit/memory-reindex-batch.test.ts b/tests/unit/memory-reindex-batch.test.ts index 26d99247d3..82e96824d0 100644 --- a/tests/unit/memory-reindex-batch.test.ts +++ b/tests/unit/memory-reindex-batch.test.ts @@ -36,7 +36,7 @@ const { runReindexBatch, getReindexPending } = await import("../../src/lib/memor function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-retrieval-hybrid.test.ts b/tests/unit/memory-retrieval-hybrid.test.ts index 0c0daa119e..5614cef312 100644 --- a/tests/unit/memory-retrieval-hybrid.test.ts +++ b/tests/unit/memory-retrieval-hybrid.test.ts @@ -28,7 +28,7 @@ async function removeTestDataDir() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } return; } catch (error: unknown) { diff --git a/tests/unit/memory-retrieval-rerank.test.ts b/tests/unit/memory-retrieval-rerank.test.ts index 22c4e4121b..12454aba1a 100644 --- a/tests/unit/memory-retrieval-rerank.test.ts +++ b/tests/unit/memory-retrieval-rerank.test.ts @@ -32,7 +32,7 @@ const core = await import("../../src/lib/db/core.ts"); function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -40,7 +40,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-retrieval-semantic.test.ts b/tests/unit/memory-retrieval-semantic.test.ts index 806c2ee397..442ef2d683 100644 --- a/tests/unit/memory-retrieval-semantic.test.ts +++ b/tests/unit/memory-retrieval-semantic.test.ts @@ -30,7 +30,7 @@ const core = await import("../../src/lib/db/core.ts"); function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -38,7 +38,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-retrieve-preview.test.ts b/tests/unit/memory-retrieve-preview.test.ts index e4de63cb72..8b576662da 100644 --- a/tests/unit/memory-retrieve-preview.test.ts +++ b/tests/unit/memory-retrieve-preview.test.ts @@ -28,7 +28,7 @@ const core = await import("../../src/lib/db/core.ts"); function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ function cleanup() { test.afterEach(() => cleanup()); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-route.test.ts b/tests/unit/memory-route.test.ts index 7ee3621394..bcc462a94c 100644 --- a/tests/unit/memory-route.test.ts +++ b/tests/unit/memory-route.test.ts @@ -14,7 +14,7 @@ const { MemoryType } = await import("../../src/lib/memory/types.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/memory filters by q and returns matching stats", async () => { diff --git a/tests/unit/memory-store-sync.test.ts b/tests/unit/memory-store-sync.test.ts index f0d8955a69..dbd8a9c61f 100644 --- a/tests/unit/memory-store-sync.test.ts +++ b/tests/unit/memory-store-sync.test.ts @@ -43,7 +43,7 @@ const memoryVec = await import("../../src/lib/db/memoryVec.ts"); function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.afterEach(() => { test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-store.test.ts b/tests/unit/memory-store.test.ts index 1699955136..b48eb7b3ad 100644 --- a/tests/unit/memory-store.test.ts +++ b/tests/unit/memory-store.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -76,7 +76,7 @@ test.afterEach(async () => { test.after(async () => { await drainSetImmediate(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("memory store CRUD round-trip persists to the memories table and invalidates cache on update/delete", async () => { diff --git a/tests/unit/memory-summarization-older-than.test.ts b/tests/unit/memory-summarization-older-than.test.ts index 03c618a4f4..a6057de0e0 100644 --- a/tests/unit/memory-summarization-older-than.test.ts +++ b/tests/unit/memory-summarization-older-than.test.ts @@ -29,7 +29,7 @@ const { summarizeMemoriesOlderThan } = await import("../../src/lib/memory/summar function cleanup() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.afterEach(async () => { }); test.after(() => { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-summarization.test.ts b/tests/unit/memory-summarization.test.ts index 381e1a22bb..d8cdc62923 100644 --- a/tests/unit/memory-summarization.test.ts +++ b/tests/unit/memory-summarization.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -62,7 +62,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("summarizeMemories returns zeroed metrics for empty conversations", async () => { diff --git a/tests/unit/memory-tools.test.ts b/tests/unit/memory-tools.test.ts index 4e021834ce..aadbf6b433 100644 --- a/tests/unit/memory-tools.test.ts +++ b/tests/unit/memory-tools.test.ts @@ -16,7 +16,7 @@ const { invalidateMemorySettingsCache } = await import("../../src/lib/memory/set function resetStorage() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); core.getDbInstance(); } @@ -34,7 +34,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); process.env.DATA_DIR = originalDataDir; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("memory add stores entries with default session and metadata", async () => { diff --git a/tests/unit/memory-vec-meta.test.ts b/tests/unit/memory-vec-meta.test.ts index 49db9ace00..9404e2b0fa 100644 --- a/tests/unit/memory-vec-meta.test.ts +++ b/tests/unit/memory-vec-meta.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ──────────────── getMemoryVecMeta initial state ──────────────── diff --git a/tests/unit/memory-vectorstore-crud.test.ts b/tests/unit/memory-vectorstore-crud.test.ts index a1d489e186..1f6020ee9f 100644 --- a/tests/unit/memory-vectorstore-crud.test.ts +++ b/tests/unit/memory-vectorstore-crud.test.ts @@ -49,7 +49,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -61,7 +61,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-vectorstore-ensure-ready.test.ts b/tests/unit/memory-vectorstore-ensure-ready.test.ts index 36052ead83..c07649c4f6 100644 --- a/tests/unit/memory-vectorstore-ensure-ready.test.ts +++ b/tests/unit/memory-vectorstore-ensure-ready.test.ts @@ -42,7 +42,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-vectorstore-int8-quant.test.ts b/tests/unit/memory-vectorstore-int8-quant.test.ts index e301298649..01603ab510 100644 --- a/tests/unit/memory-vectorstore-int8-quant.test.ts +++ b/tests/unit/memory-vectorstore-int8-quant.test.ts @@ -70,7 +70,7 @@ function exactNearestIds(query: number[], k: number): string[] { function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -81,7 +81,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function getStoreOrSkip(t: { skip: (msg: string) => void }): ReturnType { diff --git a/tests/unit/memory-vectorstore-load.test.ts b/tests/unit/memory-vectorstore-load.test.ts index 7aec414cd9..2400e7b6b0 100644 --- a/tests/unit/memory-vectorstore-load.test.ts +++ b/tests/unit/memory-vectorstore-load.test.ts @@ -31,7 +31,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -43,7 +43,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-vectorstore-rrf.test.ts b/tests/unit/memory-vectorstore-rrf.test.ts index 4261ca6df2..40bb94ead5 100644 --- a/tests/unit/memory-vectorstore-rrf.test.ts +++ b/tests/unit/memory-vectorstore-rrf.test.ts @@ -50,7 +50,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -62,7 +62,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-vectorstore-stats.test.ts b/tests/unit/memory-vectorstore-stats.test.ts index 5491fdde03..df02e24e09 100644 --- a/tests/unit/memory-vectorstore-stats.test.ts +++ b/tests/unit/memory-vectorstore-stats.test.ts @@ -58,7 +58,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -70,7 +70,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory-vectorstore-upsert-self-heal.test.ts b/tests/unit/memory-vectorstore-upsert-self-heal.test.ts index de8657ff60..dd11e7b95f 100644 --- a/tests/unit/memory-vectorstore-upsert-self-heal.test.ts +++ b/tests/unit/memory-vectorstore-upsert-self-heal.test.ts @@ -59,7 +59,7 @@ function cleanup() { _resetVectorStoreSingleton(); core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -71,7 +71,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/memory/typed-decay.test.ts b/tests/unit/memory/typed-decay.test.ts index adab781960..6b5eb31985 100644 --- a/tests/unit/memory/typed-decay.test.ts +++ b/tests/unit/memory/typed-decay.test.ts @@ -51,7 +51,7 @@ after(() => { } catch { /* ignore */ } - if (dataDir) rmSync(dataDir, { recursive: true, force: true }); + if (dataDir) rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("typedDecay — pure predicates", () => { diff --git a/tests/unit/merge-train-plan.test.ts b/tests/unit/merge-train-plan.test.ts index f3b7954521..cb53558313 100644 --- a/tests/unit/merge-train-plan.test.ts +++ b/tests/unit/merge-train-plan.test.ts @@ -121,7 +121,7 @@ test("--plan shell-quotes a hostile base before the gate command is evaluated", await assert.rejects(access(marker), { code: "ENOENT" }); } } finally { - await rm(tempDir, { recursive: true, force: true }); + await rm(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/messages-count-tokens-route.test.ts b/tests/unit/messages-count-tokens-route.test.ts index f3a345a433..fd2d0a6d3f 100644 --- a/tests/unit/messages-count-tokens-route.test.ts +++ b/tests/unit/messages-count-tokens-route.test.ts @@ -20,7 +20,7 @@ type CountTokensResponse = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("messages/count_tokens uses real provider count when Claude-compatible upstream supports it", async () => { diff --git a/tests/unit/migration-135-numbering-collision.test.ts b/tests/unit/migration-135-numbering-collision.test.ts index 1a6474f450..d8fd6b0e6f 100644 --- a/tests/unit/migration-135-numbering-collision.test.ts +++ b/tests/unit/migration-135-numbering-collision.test.ts @@ -34,7 +34,7 @@ before(async () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; }); diff --git a/tests/unit/migration-159-remove-mimocode-provider.test.ts b/tests/unit/migration-159-remove-mimocode-provider.test.ts index ce62675fde..970c70ef18 100644 --- a/tests/unit/migration-159-remove-mimocode-provider.test.ts +++ b/tests/unit/migration-159-remove-mimocode-provider.test.ts @@ -11,7 +11,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("migration 159 removes stale MiMoCode provider state and is idempotent", () => { diff --git a/tests/unit/minimax-m3-maxtokens.test.ts b/tests/unit/minimax-m3-maxtokens.test.ts index 93a63d9b40..b0d1e284fb 100644 --- a/tests/unit/minimax-m3-maxtokens.test.ts +++ b/tests/unit/minimax-m3-maxtokens.test.ts @@ -31,7 +31,7 @@ const { getModelSpec } = await import("../../src/shared/constants/modelSpecs.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const DEFAULT_CAP = 8192; diff --git a/tests/unit/mitm-cert-install-mode-9442.test.ts b/tests/unit/mitm-cert-install-mode-9442.test.ts index 4128719c5c..dd415ce67f 100644 --- a/tests/unit/mitm-cert-install-mode-9442.test.ts +++ b/tests/unit/mitm-cert-install-mode-9442.test.ts @@ -80,7 +80,7 @@ test.after(() => { else process.env.OMNIROUTE_NO_SUDO = originalNoSudo; if (originalSkipSystemTrust === undefined) delete process.env.OMNIROUTE_SKIP_SYSTEM_TRUST; else process.env.OMNIROUTE_SKIP_SYSTEM_TRUST = originalSkipSystemTrust; - fs.rmSync(tmpRoot, { recursive: true, force: true }); + fs.rmSync(tmpRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function resetCaptured(): void { diff --git a/tests/unit/mitm-cert-migration-6684.test.ts b/tests/unit/mitm-cert-migration-6684.test.ts index 111eef5369..415b86884a 100644 --- a/tests/unit/mitm-cert-migration-6684.test.ts +++ b/tests/unit/mitm-cert-migration-6684.test.ts @@ -26,7 +26,7 @@ test("decideCertMigration: existing legacy leaf, no CA pair, flag off → stay o touch(path.join(certDir, "server.key")); assert.equal(decideCertMigration(certDir, false), "use-legacy-leaf"); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -35,7 +35,7 @@ test("decideCertMigration: no legacy leaf and no CA pair (fresh install) → use try { assert.equal(decideCertMigration(certDir, false), "use-root-ca"); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -46,7 +46,7 @@ test("decideCertMigration: legacy leaf present but explicit opt-in flag on → u touch(path.join(certDir, "server.key")); assert.equal(decideCertMigration(certDir, true), "use-root-ca"); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -59,7 +59,7 @@ test("decideCertMigration: CA pair already persisted → use root CA even withou touch(path.join(certDir, "ca.key")); assert.equal(decideCertMigration(certDir, false), "use-root-ca"); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -69,6 +69,6 @@ test("decideCertMigration: partial legacy pair (only server.crt) is treated as n touch(path.join(certDir, "server.crt")); assert.equal(decideCertMigration(certDir, false), "use-root-ca"); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/mitm-hosts-cleanup-on-exit.test.ts b/tests/unit/mitm-hosts-cleanup-on-exit.test.ts index f39ac88574..5bb5620937 100644 --- a/tests/unit/mitm-hosts-cleanup-on-exit.test.ts +++ b/tests/unit/mitm-hosts-cleanup-on-exit.test.ts @@ -30,7 +30,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("handleExitCleanup: with a cached sudo password, best-effort reverts managed /etc/hosts entries", async () => { diff --git a/tests/unit/mitm-manager-bypass-json.test.ts b/tests/unit/mitm-manager-bypass-json.test.ts index 47dca8a683..01451603a4 100644 --- a/tests/unit/mitm-manager-bypass-json.test.ts +++ b/tests/unit/mitm-manager-bypass-json.test.ts @@ -27,7 +27,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -48,7 +48,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("writeBypassJson — creates mitm/ dir and writes JSON file", () => { diff --git a/tests/unit/mitm-manager-cleanup-symmetry.test.ts b/tests/unit/mitm-manager-cleanup-symmetry.test.ts index 1175da20c4..29eefebf79 100644 --- a/tests/unit/mitm-manager-cleanup-symmetry.test.ts +++ b/tests/unit/mitm-manager-cleanup-symmetry.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -49,7 +49,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("collectManagedHosts includes every host of every agent target", () => { diff --git a/tests/unit/mitm-manager-repair.test.ts b/tests/unit/mitm-manager-repair.test.ts index 4a72a7f1f4..648bb142be 100644 --- a/tests/unit/mitm-manager-repair.test.ts +++ b/tests/unit/mitm-manager-repair.test.ts @@ -27,7 +27,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -48,7 +48,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("buildRepairPlan enumerates DNS hosts and the CA + proxy teardown steps", () => { diff --git a/tests/unit/mitm-privileged-steps-sudo-gate.test.ts b/tests/unit/mitm-privileged-steps-sudo-gate.test.ts index 30701c7ad3..2d314b8b91 100644 --- a/tests/unit/mitm-privileged-steps-sudo-gate.test.ts +++ b/tests/unit/mitm-privileged-steps-sudo-gate.test.ts @@ -20,7 +20,7 @@ const manager = await import("../../src/mitm/manager.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("canRunPrivilegedMitmSteps is false when isMitmSudoPasswordRequired is true", () => { diff --git a/tests/unit/mitm-root-ca-persistence-6684.test.ts b/tests/unit/mitm-root-ca-persistence-6684.test.ts index 63d08a91c3..18d6b04630 100644 --- a/tests/unit/mitm-root-ca-persistence-6684.test.ts +++ b/tests/unit/mitm-root-ca-persistence-6684.test.ts @@ -25,7 +25,7 @@ test("loadOrCreateMitmCa: first call with an empty dir generates and persists a assert.equal(fs.existsSync(path.join(certDir, "ca.key")), true); assert.equal(fs.existsSync(path.join(certDir, "ca.crt")), true); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -37,7 +37,7 @@ test("loadOrCreateMitmCa: a second call loads the same CA instead of regeneratin assert.equal(second.key, first.key); assert.equal(second.cert, first.cert); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -48,7 +48,7 @@ test("loadOrCreateMitmCa: the written CA private key file mode is 0o600", { skip const mode = fs.statSync(ca.keyPath).mode & 0o777; assert.equal(mode, 0o600); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -60,6 +60,6 @@ test("loadOrCreateMitmCa: the CA cert carries CA basicConstraints (matches gener const cert = new X509Certificate(ca.cert); assert.equal(cert.ca, true); } finally { - fs.rmSync(certDir, { recursive: true, force: true }); + fs.rmSync(certDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/mitm-start-guard.test.ts b/tests/unit/mitm-start-guard.test.ts index 91eb572336..b298ac51f1 100644 --- a/tests/unit/mitm-start-guard.test.ts +++ b/tests/unit/mitm-start-guard.test.ts @@ -44,7 +44,7 @@ const manager = await import("../../src/mitm/manager.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Belt-and-braces: never leave the module-level lock held across tests. diff --git a/tests/unit/mitm-stop-dns-before-kill-1809.test.ts b/tests/unit/mitm-stop-dns-before-kill-1809.test.ts index 3dd92dcaad..e160978ff8 100644 --- a/tests/unit/mitm-stop-dns-before-kill-1809.test.ts +++ b/tests/unit/mitm-stop-dns-before-kill-1809.test.ts @@ -32,7 +32,7 @@ const manager = await import("../../src/mitm/manager.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("stopMitm removes DNS entries before killing the MITM server process (#1809)", async () => { diff --git a/tests/unit/mitm-upstream-ca-wiring.test.ts b/tests/unit/mitm-upstream-ca-wiring.test.ts index a98c3688a6..2a6d347caa 100644 --- a/tests/unit/mitm-upstream-ca-wiring.test.ts +++ b/tests/unit/mitm-upstream-ca-wiring.test.ts @@ -205,7 +205,7 @@ test("POST upstream-ca route — error response does not leak stack trace when c test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore } diff --git a/tests/unit/modality-bridge-video-runtime-route.test.ts b/tests/unit/modality-bridge-video-runtime-route.test.ts index b210aa7ed5..9077086517 100644 --- a/tests/unit/modality-bridge-video-runtime-route.test.ts +++ b/tests/unit/modality-bridge-video-runtime-route.test.ts @@ -25,7 +25,7 @@ async function withLocality(request: Request, locality: "loopback" | "lan"): Pro test.beforeEach(async () => { core.resetDbInstance(); - fs.rmSync(dataDirectory, { force: true, recursive: true }); + fs.rmSync(dataDirectory, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(dataDirectory, { recursive: true }); process.env.INITIAL_PASSWORD = "video-runtime-test-password"; await settings.updateSettings({ requireLogin: true, password: "" }); @@ -33,7 +33,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(dataDirectory, { force: true, recursive: true }); + fs.rmSync(dataDirectory, { force: true, recursive: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDirectory === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDirectory; if (originalInitialPassword === undefined) delete process.env.INITIAL_PASSWORD; diff --git a/tests/unit/model-alias-route.test.ts b/tests/unit/model-alias-route.test.ts index 5517defc44..6bf42b4db3 100644 --- a/tests/unit/model-alias-route.test.ts +++ b/tests/unit/model-alias-route.test.ts @@ -20,7 +20,7 @@ const v1Catalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -30,7 +30,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("model alias route resolves a stored alias and emits diagnostics headers", async () => { diff --git a/tests/unit/model-alias-seed-fallback.test.ts b/tests/unit/model-alias-seed-fallback.test.ts index 25f9513fb9..7838049f7a 100644 --- a/tests/unit/model-alias-seed-fallback.test.ts +++ b/tests/unit/model-alias-seed-fallback.test.ts @@ -22,7 +22,7 @@ async function withEmptyAliasDb(fn: () => Promise) { resetDbInstance?.(); await fn(); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); const { resetDbInstance } = await import("../../src/lib/db/core"); resetDbInstance?.(); if (prevDataDir === undefined) delete process.env.DATA_DIR; diff --git a/tests/unit/model-alias-seed.test.ts b/tests/unit/model-alias-seed.test.ts index 3a56098def..e7b77f4f0d 100644 --- a/tests/unit/model-alias-seed.test.ts +++ b/tests/unit/model-alias-seed.test.ts @@ -15,7 +15,7 @@ const { DEFAULT_MODEL_ALIAS_SEED, seedDefaultModelAliases } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -25,7 +25,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("default model alias seed writes missing aliases and is idempotent", async () => { diff --git a/tests/unit/model-aliases-settings-route-selfheal.test.ts b/tests/unit/model-aliases-settings-route-selfheal.test.ts index 30167fdce0..2655a43ecd 100644 --- a/tests/unit/model-aliases-settings-route-selfheal.test.ts +++ b/tests/unit/model-aliases-settings-route-selfheal.test.ts @@ -29,7 +29,7 @@ const route = await import("../../src/app/api/settings/model-aliases/route.ts"); async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/settings/model-aliases hydrates custom aliases from DB when in-memory state is empty", async () => { diff --git a/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts b/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts index 4e4175c476..95bff213ef 100644 --- a/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts +++ b/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts @@ -53,7 +53,7 @@ function buildCapability(overrides = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -113,7 +113,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8250 kimi-coding-apikey/k3: attachment=false + image modalities → vision=true and fields agree", () => { diff --git a/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts b/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts index 2cdc3092aa..b891e408db 100644 --- a/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts +++ b/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts @@ -57,7 +57,7 @@ function buildCapability(overrides = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -98,7 +98,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4073 mistral/pixtral-12b-latest resolves vision via the synced `-latest` alias (not the heuristic)", () => { diff --git a/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts b/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts index ae53ebef86..3d836e7f9c 100644 --- a/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts +++ b/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts @@ -43,7 +43,7 @@ function buildCapability(overrides: Record = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8032 cp/cline-pass/kimi-k3: attachment=false empty modalities → vision via leaf/registry", () => { diff --git a/tests/unit/model-capabilities-registry.test.ts b/tests/unit/model-capabilities-registry.test.ts index ce75e9342a..e75e8ffbef 100644 --- a/tests/unit/model-capabilities-registry.test.ts +++ b/tests/unit/model-capabilities-registry.test.ts @@ -37,7 +37,7 @@ function buildCapability(overrides = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("canonical model capability resolver lets exact synced metadata override global specs", () => { diff --git a/tests/unit/model-capability-overrides.test.ts b/tests/unit/model-capability-overrides.test.ts index 5053ed7520..72891d27c0 100644 --- a/tests/unit/model-capability-overrides.test.ts +++ b/tests/unit/model-capability-overrides.test.ts @@ -15,14 +15,14 @@ const route = await import("../../src/app/api/model-capability-overrides/route.t beforeEach(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); coreDb.getDbInstance(); }); after(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function patchOverride(key: string, value: unknown) { diff --git a/tests/unit/model-capability-resolution-snapshot-9199.test.ts b/tests/unit/model-capability-resolution-snapshot-9199.test.ts index 2e63420b4f..4c42ffd6d0 100644 --- a/tests/unit/model-capability-resolution-snapshot-9199.test.ts +++ b/tests/unit/model-capability-resolution-snapshot-9199.test.ts @@ -38,7 +38,7 @@ test.after(() => { } for (const [key, value] of originalContextLengthEnv) process.env[key] = value; try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } @@ -46,7 +46,7 @@ test.after(() => { function seedFixture() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); core.getDbInstance(); @@ -223,7 +223,7 @@ function assertOrdinarySnapshotParity( test("#9199 bulk capability rows treat prototype-shaped keys as data", () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); core.getDbInstance(); diff --git a/tests/unit/model-catalog-cache-swr-8728.test.ts b/tests/unit/model-catalog-cache-swr-8728.test.ts index 5e5265b804..464986347f 100644 --- a/tests/unit/model-catalog-cache-swr-8728.test.ts +++ b/tests/unit/model-catalog-cache-swr-8728.test.ts @@ -53,7 +53,7 @@ test.beforeEach(() => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the SWR window is a bounded constant, not an unbounded accessor", () => { diff --git a/tests/unit/model-catalog-policy-invalidation-8728.test.ts b/tests/unit/model-catalog-policy-invalidation-8728.test.ts index e23b672e97..8332a1453a 100644 --- a/tests/unit/model-catalog-policy-invalidation-8728.test.ts +++ b/tests/unit/model-catalog-policy-invalidation-8728.test.ts @@ -26,7 +26,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeys.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("updateApiKeyPermissions increments only on catalog-affecting fields", async () => { diff --git a/tests/unit/model-catalog-runtime-invalidation.test.ts b/tests/unit/model-catalog-runtime-invalidation.test.ts index c37b9831c4..4c3abe2099 100644 --- a/tests/unit/model-catalog-runtime-invalidation.test.ts +++ b/tests/unit/model-catalog-runtime-invalidation.test.ts @@ -25,7 +25,7 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -77,7 +77,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("session-affinity bookkeeping preserves the published model catalog", async () => { diff --git a/tests/unit/model-catalog-source-invalidation-8728.test.ts b/tests/unit/model-catalog-source-invalidation-8728.test.ts index 50dfa86eff..1d16ea92ce 100644 --- a/tests/unit/model-catalog-source-invalidation-8728.test.ts +++ b/tests/unit/model-catalog-source-invalidation-8728.test.ts @@ -22,7 +22,7 @@ const openRouterCatalog = await import("../../src/lib/catalog/openrouterCatalog. function resetStorage() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -57,7 +57,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); restoreRealFetch(); }); diff --git a/tests/unit/model-combo-mappings-db.test.ts b/tests/unit/model-combo-mappings-db.test.ts index 9470884eb4..2ce0b1bb90 100644 --- a/tests/unit/model-combo-mappings-db.test.ts +++ b/tests/unit/model-combo-mappings-db.test.ts @@ -13,7 +13,7 @@ const mappingsDb = await import("../../src/lib/db/modelComboMappings.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createCombo(name, model, overrides = {}) { diff --git a/tests/unit/model-connid-prefix-normalization-6772.test.ts b/tests/unit/model-connid-prefix-normalization-6772.test.ts index 430aa1a7c0..137dbd1781 100644 --- a/tests/unit/model-connid-prefix-normalization-6772.test.ts +++ b/tests/unit/model-connid-prefix-normalization-6772.test.ts @@ -50,7 +50,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6772 baseline: bare alias form `custpfx6772/vova/gpt-5.5` resolves to the raw model id", async () => { diff --git a/tests/unit/model-context-override-readpath.test.ts b/tests/unit/model-context-override-readpath.test.ts index 9cd6a6ea3e..b22e279006 100644 --- a/tests/unit/model-context-override-readpath.test.ts +++ b/tests/unit/model-context-override-readpath.test.ts @@ -15,14 +15,14 @@ const caps = await import("../../src/lib/modelCapabilities.ts"); beforeEach(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); coreDb.getDbInstance(); }); after(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("getModelContextLimit override precedence (5004)", () => { diff --git a/tests/unit/model-cooldowns-route-auth.test.ts b/tests/unit/model-cooldowns-route-auth.test.ts index 77ebf02ea4..c648c03465 100644 --- a/tests/unit/model-cooldowns-route-auth.test.ts +++ b/tests/unit/model-cooldowns-route-auth.test.ts @@ -23,7 +23,7 @@ const { clearModelLock, lockModel } = accountFallback; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { clearModelLock("cooldown-auth-provider", "cooldown-auth-conn", "cooldown-auth-model"); await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/model-intelligence-db.test.ts b/tests/unit/model-intelligence-db.test.ts index ba15f9f805..9088a8d842 100644 --- a/tests/unit/model-intelligence-db.test.ts +++ b/tests/unit/model-intelligence-db.test.ts @@ -23,7 +23,7 @@ function resetStorage(): void { core.resetDbInstance(); try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } catch { /* EBUSY — ignore */ } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); diff --git a/tests/unit/model-latency-stats-route.test.ts b/tests/unit/model-latency-stats-route.test.ts index 15cbc0650a..6d444ca7ac 100644 --- a/tests/unit/model-latency-stats-route.test.ts +++ b/tests/unit/model-latency-stats-route.test.ts @@ -20,7 +20,7 @@ const route = await import("../../src/app/api/usage/model-latency-stats/route.ts async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/model-lifecycle-integration.test.ts b/tests/unit/model-lifecycle-integration.test.ts index 2676e0d880..7bcdb0f96e 100644 --- a/tests/unit/model-lifecycle-integration.test.ts +++ b/tests/unit/model-lifecycle-integration.test.ts @@ -22,7 +22,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -47,7 +47,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("chatCore rejects a shutdown OpenAI model before an upstream request", async () => { diff --git a/tests/unit/model-lockout-max-cooldown.test.ts b/tests/unit/model-lockout-max-cooldown.test.ts index a5912985f6..064bfa7034 100644 --- a/tests/unit/model-lockout-max-cooldown.test.ts +++ b/tests/unit/model-lockout-max-cooldown.test.ts @@ -48,7 +48,7 @@ async function seedConnection(provider: string, overrides: any = {}): Promise { clearAllModelLockouts(); try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/model-metadata-registry.test.ts b/tests/unit/model-metadata-registry.test.ts index a85673b625..707202f8dd 100644 --- a/tests/unit/model-metadata-registry.test.ts +++ b/tests/unit/model-metadata-registry.test.ts @@ -14,7 +14,7 @@ const registry = await import("../../src/lib/modelMetadataRegistry.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -24,7 +24,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("canonical model metadata merges static and synced capabilities into one record", async () => { diff --git a/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts b/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts index 378a9914c5..8a4d600409 100644 --- a/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts +++ b/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts @@ -78,7 +78,7 @@ function buildCapability(overrides: Record = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // The synced-capabilities module keeps an in-memory cache across DB resets // (`cachedCapabilitiesLoadedAll`) — clear it too so each test starts from a @@ -92,7 +92,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6714 synced row present but limit_output missing falls through to the registry output cap", () => { diff --git a/tests/unit/model-overrides-provider-prefix-9557.test.ts b/tests/unit/model-overrides-provider-prefix-9557.test.ts index a78bb6b7ad..e6f2b506ff 100644 --- a/tests/unit/model-overrides-provider-prefix-9557.test.ts +++ b/tests/unit/model-overrides-provider-prefix-9557.test.ts @@ -22,14 +22,14 @@ const sseModel = await import("../../src/sse/services/model.ts"); beforeEach(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(moduleDataDir, { recursive: true }); coreDb.getDbInstance(); }); after(() => { coreDb.resetDbInstance(); - fs.rmSync(moduleDataDir, { recursive: true, force: true }); + fs.rmSync(moduleDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const NODE_ID = "openai-compatible-chat-02669115-2545-4896-b003-cb4dac09d441"; diff --git a/tests/unit/model-resolver.test.ts b/tests/unit/model-resolver.test.ts index d7d0d0e739..10fd78c698 100644 --- a/tests/unit/model-resolver.test.ts +++ b/tests/unit/model-resolver.test.ts @@ -38,7 +38,7 @@ test.after(async () => { const { invalidateDbCache } = await import("../../src/lib/db/readCache.ts"); core.resetDbInstance(); invalidateDbCache(); - fs.rmSync(modelResolverDataDir, { recursive: true, force: true }); + fs.rmSync(modelResolverDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (previousDataDir === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/model-sync-custom-preservation.test.ts b/tests/unit/model-sync-custom-preservation.test.ts index c8f8fc7e67..759c329614 100644 --- a/tests/unit/model-sync-custom-preservation.test.ts +++ b/tests/unit/model-sync-custom-preservation.test.ts @@ -21,7 +21,7 @@ const originalFetch = globalThis.fetch; test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("model sync preserves response-only custom models during discovery", async () => { diff --git a/tests/unit/model-sync-route.test.ts b/tests/unit/model-sync-route.test.ts index ece60f730d..73f199a1ec 100644 --- a/tests/unit/model-sync-route.test.ts +++ b/tests/unit/model-sync-route.test.ts @@ -34,7 +34,7 @@ async function resetStorage() { modelSyncRoute.__resetLoopbackReadinessForTests(); core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function enableAuth() { diff --git a/tests/unit/model-sync-scheduler.test.ts b/tests/unit/model-sync-scheduler.test.ts index 449c91475b..c8a6e2bfd4 100644 --- a/tests/unit/model-sync-scheduler.test.ts +++ b/tests/unit/model-sync-scheduler.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -107,7 +107,7 @@ test.beforeEach(async () => { test.after(async () => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("modelSyncScheduler: internal auth headers validate only for scheduler requests", async () => { diff --git a/tests/unit/model-test-route.test.ts b/tests/unit/model-test-route.test.ts index 1c8efe137c..5e1c1174e5 100644 --- a/tests/unit/model-test-route.test.ts +++ b/tests/unit/model-test-route.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { core.resetDbInstance(); delete process.env.INITIAL_PASSWORD; delete process.env.REQUIRE_API_KEY; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ test.afterEach(() => { test.after(async () => { globalThis.fetch = originalFetch; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/model-token-limit-catalog.test.ts b/tests/unit/model-token-limit-catalog.test.ts index b456ce42ad..7d36565f0b 100644 --- a/tests/unit/model-token-limit-catalog.test.ts +++ b/tests/unit/model-token-limit-catalog.test.ts @@ -20,14 +20,14 @@ const LIMITS = { context: 372000, input: 353400, output: 128000 }; test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); catalog.__resetCatalogBuilderRunsForTest(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function getModel(target = TARGET) { diff --git a/tests/unit/models-catalog-auto-combos-4164.test.ts b/tests/unit/models-catalog-auto-combos-4164.test.ts index b83fc174a3..fef7115de4 100644 --- a/tests/unit/models-catalog-auto-combos-4164.test.ts +++ b/tests/unit/models-catalog-auto-combos-4164.test.ts @@ -25,7 +25,7 @@ const builtinCatalog = await import("../../open-sse/services/autoCombo/builtinCa function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4164 /v1/models advertises every built-in auto/* combo", async () => { diff --git a/tests/unit/models-catalog-block-auto-5192.test.ts b/tests/unit/models-catalog-block-auto-5192.test.ts index 44de506b65..256e4930d9 100644 --- a/tests/unit/models-catalog-block-auto-5192.test.ts +++ b/tests/unit/models-catalog-block-auto-5192.test.ts @@ -28,7 +28,7 @@ type ModelsResponseBody = { data: Array<{ id: string }> }; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5192 baseline: built-in auto/* combos are listed when Auto is not blocked", async () => { diff --git a/tests/unit/models-catalog-combo-metadata.test.ts b/tests/unit/models-catalog-combo-metadata.test.ts index 1ab884f3d3..c64b46bd1a 100644 --- a/tests/unit/models-catalog-combo-metadata.test.ts +++ b/tests/unit/models-catalog-combo-metadata.test.ts @@ -19,7 +19,7 @@ const catalog = await import("../../src/app/api/v1/models/catalog.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("single-target combo preserves its direct model metadata", async () => { diff --git a/tests/unit/models-catalog-envkey-6406.test.ts b/tests/unit/models-catalog-envkey-6406.test.ts index 824fd8a081..5127c9d501 100644 --- a/tests/unit/models-catalog-envkey-6406.test.ts +++ b/tests/unit/models-catalog-envkey-6406.test.ts @@ -29,7 +29,7 @@ interface ModelsCatalogResponseBody { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.OMNIROUTE_API_KEY; }); diff --git a/tests/unit/models-catalog-functional-gateway-permissions.test.ts b/tests/unit/models-catalog-functional-gateway-permissions.test.ts index ccdcfb1903..f7f0aad41c 100644 --- a/tests/unit/models-catalog-functional-gateway-permissions.test.ts +++ b/tests/unit/models-catalog-functional-gateway-permissions.test.ts @@ -20,7 +20,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -65,7 +65,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 models catalog requires independent permission for functional gateway mirrors", async () => { diff --git a/tests/unit/models-catalog-hidden-combo-leaves.test.ts b/tests/unit/models-catalog-hidden-combo-leaves.test.ts index 670ef653b4..44e7e264d0 100644 --- a/tests/unit/models-catalog-hidden-combo-leaves.test.ts +++ b/tests/unit/models-catalog-hidden-combo-leaves.test.ts @@ -55,7 +55,7 @@ async function getCatalogData(): Promise { test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); }); @@ -64,7 +64,7 @@ test.after(() => { modelsDevSync.saveModelsDevCapabilities({}); core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 models catalog keeps partially hidden combos and derives metadata from visible targets", async () => { diff --git a/tests/unit/models-catalog-hide-paid.test.ts b/tests/unit/models-catalog-hide-paid.test.ts index 4f2f8db674..8df5176bb0 100644 --- a/tests/unit/models-catalog-hide-paid.test.ts +++ b/tests/unit/models-catalog-hide-paid.test.ts @@ -31,7 +31,7 @@ async function fetchCatalog(): Promise> { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best-effort */ } diff --git a/tests/unit/models-catalog-low-noise-flag.test.ts b/tests/unit/models-catalog-low-noise-flag.test.ts index b3e6f1d8c2..a5c7db6e67 100644 --- a/tests/unit/models-catalog-low-noise-flag.test.ts +++ b/tests/unit/models-catalog-low-noise-flag.test.ts @@ -22,7 +22,7 @@ type ModelsResponseBody = { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("MODELS_CATALOG_PREFIX_MODE=alias suppresses canonical provider-id prefixes", async () => { diff --git a/tests/unit/models-catalog-route.test.ts b/tests/unit/models-catalog-route.test.ts index 7c2ed395d9..e6216899f0 100644 --- a/tests/unit/models-catalog-route.test.ts +++ b/tests/unit/models-catalog-route.test.ts @@ -21,7 +21,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // #6408 added a 1.5s TTL response cache to getUnifiedModelsResponse keyed only by // (prefix, isCodex client, apiKey) — NOT by DB/settings state. Without clearing it @@ -73,7 +73,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 models catalog requires auth when the route is protected and login is enabled", async () => { diff --git a/tests/unit/models-dev-pricing-caching-9300.test.ts b/tests/unit/models-dev-pricing-caching-9300.test.ts index a1d62025e3..0f1c1057aa 100644 --- a/tests/unit/models-dev-pricing-caching-9300.test.ts +++ b/tests/unit/models-dev-pricing-caching-9300.test.ts @@ -57,7 +57,7 @@ describe("getModelsDevPricing caching (#9300)", () => { // Clean up DB handles dbCore.resetDbInstance(); try { - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore } diff --git a/tests/unit/models-test-error-shape.test.ts b/tests/unit/models-test-error-shape.test.ts index 54f98ed493..cbe01c2143 100644 --- a/tests/unit/models-test-error-shape.test.ts +++ b/tests/unit/models-test-error-shape.test.ts @@ -26,7 +26,7 @@ test.before(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function post(body: unknown, rawText?: string) { diff --git a/tests/unit/modelsDevSync-extended.test.ts b/tests/unit/modelsDevSync-extended.test.ts index 3d0f26266e..4a6edc3dc0 100644 --- a/tests/unit/modelsDevSync-extended.test.ts +++ b/tests/unit/modelsDevSync-extended.test.ts @@ -101,7 +101,7 @@ function restoreEnv() { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -142,7 +142,7 @@ test.afterEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.describe("modelsDevSync-extended", { concurrency: 1 }, async () => { diff --git a/tests/unit/monitoring-health-public-view.test.ts b/tests/unit/monitoring-health-public-view.test.ts index 5b7249066d..20d386b296 100644 --- a/tests/unit/monitoring-health-public-view.test.ts +++ b/tests/unit/monitoring-health-public-view.test.ts @@ -20,7 +20,7 @@ const route = await import("../../src/app/api/monitoring/health/route.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("anonymous health GET is reduced to liveness only (GHSA-mvf8)", async () => { diff --git a/tests/unit/native-binary-compat.test.ts b/tests/unit/native-binary-compat.test.ts index 120c5e7853..a8867d8888 100644 --- a/tests/unit/native-binary-compat.test.ts +++ b/tests/unit/native-binary-compat.test.ts @@ -70,7 +70,7 @@ describe("isNativeBinaryCompatible", () => { try { callback(file); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/noauth-autocombo-allowlist.test.ts b/tests/unit/noauth-autocombo-allowlist.test.ts index 21b3ad98af..57d9f2bf15 100644 --- a/tests/unit/noauth-autocombo-allowlist.test.ts +++ b/tests/unit/noauth-autocombo-allowlist.test.ts @@ -27,7 +27,7 @@ const virtualFactory = await import("../../open-sse/services/autoCombo/virtualFa async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/noauth-autocombo-exclude-7622.test.ts b/tests/unit/noauth-autocombo-exclude-7622.test.ts index 0d8362cd8c..f784f21394 100644 --- a/tests/unit/noauth-autocombo-exclude-7622.test.ts +++ b/tests/unit/noauth-autocombo-exclude-7622.test.ts @@ -23,7 +23,7 @@ const virtualFactory = await import("../../open-sse/services/autoCombo/virtualFa async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/noauth-autocombo-hidden-7620.test.ts b/tests/unit/noauth-autocombo-hidden-7620.test.ts index 630b7fe564..6ec9dea149 100644 --- a/tests/unit/noauth-autocombo-hidden-7620.test.ts +++ b/tests/unit/noauth-autocombo-hidden-7620.test.ts @@ -25,7 +25,7 @@ const virtualFactory = await import("../../open-sse/services/autoCombo/virtualFa async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/noauth-autocombo-lockout-7623.test.ts b/tests/unit/noauth-autocombo-lockout-7623.test.ts index dea6d7b231..49c6fd0259 100644 --- a/tests/unit/noauth-autocombo-lockout-7623.test.ts +++ b/tests/unit/noauth-autocombo-lockout-7623.test.ts @@ -21,7 +21,7 @@ const accountFallback = await import("../../open-sse/services/accountFallback.ts async function resetStorage() { core.resetDbInstance(); accountFallback.clearAllModelLockouts(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/noauth-imported-models-3200.test.ts b/tests/unit/noauth-imported-models-3200.test.ts index cf23a57f8d..9f6a24d1b4 100644 --- a/tests/unit/noauth-imported-models-3200.test.ts +++ b/tests/unit/noauth-imported-models-3200.test.ts @@ -28,7 +28,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3200 imported model on a noAuth provider (theoldllm) appears in /api/v1/models", async () => { diff --git a/tests/unit/notion-web-models-discovery.test.ts b/tests/unit/notion-web-models-discovery.test.ts index 9c3b1c3d63..e6594fbf05 100644 --- a/tests/unit/notion-web-models-discovery.test.ts +++ b/tests/unit/notion-web-models-discovery.test.ts @@ -14,13 +14,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const SAMPLE_RESPONSE = { diff --git a/tests/unit/nvidia-410-model-scope.test.ts b/tests/unit/nvidia-410-model-scope.test.ts index 13fbaa6ef6..0d72fe1345 100644 --- a/tests/unit/nvidia-410-model-scope.test.ts +++ b/tests/unit/nvidia-410-model-scope.test.ts @@ -28,7 +28,7 @@ const GONE_BODY = JSON.stringify({ async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("NVIDIA 410 Gone stays model-scoped and leaves the connection usable", async () => { diff --git a/tests/unit/oauth-400-recovery.test.ts b/tests/unit/oauth-400-recovery.test.ts index 66d40db46c..fa041ea56d 100644 --- a/tests/unit/oauth-400-recovery.test.ts +++ b/tests/unit/oauth-400-recovery.test.ts @@ -231,7 +231,7 @@ test("isReactive400Recoverable fixtures compile with the real helper signature", }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("isTokenExpired treats a corrupt expiresAt string as expired (refreshable)", () => { diff --git a/tests/unit/oauth-connection-persistence-codex-dedup.test.ts b/tests/unit/oauth-connection-persistence-codex-dedup.test.ts index 30d5a29adf..0a422fc0cd 100644 --- a/tests/unit/oauth-connection-persistence-codex-dedup.test.ts +++ b/tests/unit/oauth-connection-persistence-codex-dedup.test.ts @@ -16,7 +16,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -36,7 +36,7 @@ test.beforeEach(async () => { }); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("persistOAuthConnection must not merge two distinct Codex accounts that share an email but have different chatgptUserId and no workspaceId", async () => { diff --git a/tests/unit/oauth-device-code-region-ssrf.test.ts b/tests/unit/oauth-device-code-region-ssrf.test.ts index bc57659f79..c5f7f1c5e1 100644 --- a/tests/unit/oauth-device-code-region-ssrf.test.ts +++ b/tests/unit/oauth-device-code-region-ssrf.test.ts @@ -21,7 +21,7 @@ const route = await import("../../src/app/api/oauth/[provider]/[action]/route.ts test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function deviceCode(provider: string, region: string) { diff --git a/tests/unit/oauth-grok-cli-browser.test.ts b/tests/unit/oauth-grok-cli-browser.test.ts index 3e23d57a06..e7f722df36 100644 --- a/tests/unit/oauth-grok-cli-browser.test.ts +++ b/tests/unit/oauth-grok-cli-browser.test.ts @@ -32,7 +32,7 @@ test.before(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.afterEach(() => { diff --git a/tests/unit/oauth-import-manage-scope.test.ts b/tests/unit/oauth-import-manage-scope.test.ts index 070515c02a..779834a7f1 100644 --- a/tests/unit/oauth-import-manage-scope.test.ts +++ b/tests/unit/oauth-import-manage-scope.test.ts @@ -30,7 +30,7 @@ test.before(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; }); diff --git a/tests/unit/oauth-keychain-import-only-6041.test.ts b/tests/unit/oauth-keychain-import-only-6041.test.ts index d2363ea225..8d95641de4 100644 --- a/tests/unit/oauth-keychain-import-only-6041.test.ts +++ b/tests/unit/oauth-keychain-import-only-6041.test.ts @@ -28,7 +28,7 @@ test.before(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function get(provider: string, action: string) { diff --git a/tests/unit/oauth-paste-credentials-route.test.ts b/tests/unit/oauth-paste-credentials-route.test.ts index 43793bf08d..653b03ac20 100644 --- a/tests/unit/oauth-paste-credentials-route.test.ts +++ b/tests/unit/oauth-paste-credentials-route.test.ts @@ -33,7 +33,7 @@ test.before(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function postPaste(provider: string, body: unknown) { diff --git a/tests/unit/oauth-refresh-connection-dedup-8059.test.ts b/tests/unit/oauth-refresh-connection-dedup-8059.test.ts index 5724dadcb0..d0dee409e0 100644 --- a/tests/unit/oauth-refresh-connection-dedup-8059.test.ts +++ b/tests/unit/oauth-refresh-connection-dedup-8059.test.ts @@ -26,14 +26,14 @@ const { persistOAuthConnection, findExistingOAuthConnectionMatch } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); type ProviderConnection = Awaited>[number]; diff --git a/tests/unit/obsidian-config.test.ts b/tests/unit/obsidian-config.test.ts index 71239c0c7a..8f7c9e3a98 100644 --- a/tests/unit/obsidian-config.test.ts +++ b/tests/unit/obsidian-config.test.ts @@ -13,7 +13,7 @@ const { getObsidianConfigForApiKey, setObsidianToken, setObsidianBaseUrl } = awa async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -30,7 +30,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("apiKeyContextSources: returns null for unknown apiKeyId", () => { diff --git a/tests/unit/obsidian-webdav-route.test.ts b/tests/unit/obsidian-webdav-route.test.ts index cfb9363492..f855696390 100644 --- a/tests/unit/obsidian-webdav-route.test.ts +++ b/tests/unit/obsidian-webdav-route.test.ts @@ -37,7 +37,7 @@ const obsidianDb = await import("../../src/lib/db/obsidian.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; @@ -119,7 +119,7 @@ test("POST with a valid temp dir → returns { username, password }, GET shows e assert.equal(getBody.webdavPassword, null); assert.equal(getBody.webdavPasswordSet, true); } finally { - fs.rmSync(vaultDir, { recursive: true, force: true }); + fs.rmSync(vaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -155,7 +155,7 @@ test("GET masks the WebDAV password for anonymous callers but reveals it to a ma "a management session must still receive the plaintext password" ); } finally { - fs.rmSync(vaultDir, { recursive: true, force: true }); + fs.rmSync(vaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -217,7 +217,7 @@ test("DELETE after enable → webdavEnabled:false, creds cleared in GET", async assert.equal(getBody.webdavUsername, null); assert.equal(getBody.webdavPassword, null); } finally { - fs.rmSync(vaultDir, { recursive: true, force: true }); + fs.rmSync(vaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -243,7 +243,7 @@ test("GET when disabled does not leak password even if stale data exists", async assert.equal(getBody.webdavEnabled, false); assert.equal(getBody.webdavPassword, null); } finally { - fs.rmSync(vaultDir, { recursive: true, force: true }); + fs.rmSync(vaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -272,7 +272,7 @@ test("Unauthenticated POST → 401 when auth is required", async () => { const res = await route.POST(req); assert.equal(res.status, 401); } finally { - fs.rmSync(vaultDir, { recursive: true, force: true }); + fs.rmSync(vaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/oidc-callback.test.ts b/tests/unit/oidc-callback.test.ts index 5d41701e42..0659edf58c 100644 --- a/tests/unit/oidc-callback.test.ts +++ b/tests/unit/oidc-callback.test.ts @@ -32,7 +32,7 @@ let capturedCookies: Record = {}; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); capturedCookies = {}; } @@ -61,7 +61,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.JWT_SECRET; }); diff --git a/tests/unit/oidc-login-state.test.ts b/tests/unit/oidc-login-state.test.ts index ea9c4e56fb..341ba53932 100644 --- a/tests/unit/oidc-login-state.test.ts +++ b/tests/unit/oidc-login-state.test.ts @@ -20,7 +20,7 @@ const loginRoute = await import("../../src/app/api/auth/oidc/login/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -30,7 +30,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.JWT_SECRET; }); diff --git a/tests/unit/ollama-404-model-lockout-11071.test.ts b/tests/unit/ollama-404-model-lockout-11071.test.ts index f58c29c07b..9269c05208 100644 --- a/tests/unit/ollama-404-model-lockout-11071.test.ts +++ b/tests/unit/ollama-404-model-lockout-11071.test.ts @@ -14,13 +14,13 @@ const { hasPerModelQuota, isModelLocked } = await import("../../open-sse/service async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("hasPerModelQuota returns true for ollama-local and ollama providers", () => { diff --git a/tests/unit/ollama-local-capabilities-routing.test.ts b/tests/unit/ollama-local-capabilities-routing.test.ts index 0ce75a2983..25c1f61906 100644 --- a/tests/unit/ollama-local-capabilities-routing.test.ts +++ b/tests/unit/ollama-local-capabilities-routing.test.ts @@ -23,7 +23,7 @@ const originalFetch = globalThis.fetch; function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ test.beforeEach(resetStorage); test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Ollama discovery maps /api/show capabilities into connection-scoped model metadata", async () => { diff --git a/tests/unit/ollama-local-embedding-2824.test.ts b/tests/unit/ollama-local-embedding-2824.test.ts index 2cb4c18e2f..400f30fa8e 100644 --- a/tests/unit/ollama-local-embedding-2824.test.ts +++ b/tests/unit/ollama-local-embedding-2824.test.ts @@ -16,7 +16,7 @@ const { createEmbeddingResponse } = await import("../../src/lib/embeddings/servi test.after(() => { core.resetDbInstance(); - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("ollama-local exposes a static no-auth embedding registry entry", () => { diff --git a/tests/unit/openai-style-providers-4239-4155-3841.test.ts b/tests/unit/openai-style-providers-4239-4155-3841.test.ts index 4783262345..f5e744c96e 100644 --- a/tests/unit/openai-style-providers-4239-4155-3841.test.ts +++ b/tests/unit/openai-style-providers-4239-4155-3841.test.ts @@ -51,13 +51,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ProviderSpec { diff --git a/tests/unit/openapi-try-route.test.ts b/tests/unit/openapi-try-route.test.ts index 4ab2edab5a..bb29d2e815 100644 --- a/tests/unit/openapi-try-route.test.ts +++ b/tests/unit/openapi-try-route.test.ts @@ -21,7 +21,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -57,7 +57,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/opencode-free-tier-routing-shortcircuit-10571.test.ts b/tests/unit/opencode-free-tier-routing-shortcircuit-10571.test.ts index 76bfd17922..75a17b1603 100644 --- a/tests/unit/opencode-free-tier-routing-shortcircuit-10571.test.ts +++ b/tests/unit/opencode-free-tier-routing-shortcircuit-10571.test.ts @@ -39,7 +39,7 @@ const { getModelInfoCore } = await import("../../open-sse/services/model.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("bare big-pickle routes to an opencode-family provider when an opencode connection is active", async () => { diff --git a/tests/unit/opencode-noauth-models-route.test.ts b/tests/unit/opencode-noauth-models-route.test.ts index 6965c485ea..2b4abeaee8 100644 --- a/tests/unit/opencode-noauth-models-route.test.ts +++ b/tests/unit/opencode-noauth-models-route.test.ts @@ -13,7 +13,7 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // #3047 — OpenCode Free (no-auth) has no connection row, so the diff --git a/tests/unit/opencode-zen-alias-combo-e2e.test.ts b/tests/unit/opencode-zen-alias-combo-e2e.test.ts index 40f4cb7065..f9adbf73a2 100644 --- a/tests/unit/opencode-zen-alias-combo-e2e.test.ts +++ b/tests/unit/opencode-zen-alias-combo-e2e.test.ts @@ -120,7 +120,7 @@ before(async () => { after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Tests ────────────────────────────────────────────────────────────── diff --git a/tests/unit/openrouter-embeddings-catalog-6976.test.ts b/tests/unit/openrouter-embeddings-catalog-6976.test.ts index 3e2f27b394..235bb98d28 100644 --- a/tests/unit/openrouter-embeddings-catalog-6976.test.ts +++ b/tests/unit/openrouter-embeddings-catalog-6976.test.ts @@ -22,7 +22,7 @@ type ModelsResponseBody = { source: string; models: DiscoveredModel[] }; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("embeddingRegistry curated openrouter catalog carries the refreshed lineup with dimensions (#6976)", () => { diff --git a/tests/unit/openrouter-free-model-credits-exhausted.test.ts b/tests/unit/openrouter-free-model-credits-exhausted.test.ts index 129d2fac6d..6a56646594 100644 --- a/tests/unit/openrouter-free-model-credits-exhausted.test.ts +++ b/tests/unit/openrouter-free-model-credits-exhausted.test.ts @@ -29,13 +29,13 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getProviderCredentials still serves a :free OpenRouter model after the connection is credits_exhausted", async () => { diff --git a/tests/unit/openrouter-provider-stats.test.ts b/tests/unit/openrouter-provider-stats.test.ts index f2d0d3ec4f..4e0550a841 100644 --- a/tests/unit/openrouter-provider-stats.test.ts +++ b/tests/unit/openrouter-provider-stats.test.ts @@ -139,7 +139,7 @@ describe("getOpenRouterProviderStats / refreshOpenRouterProviderStats (cache + T afterEach(() => { restoreFetch(); - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = originalDataDir; if (originalTtl === undefined) delete process.env.OPENROUTER_PROVIDER_STATS_TTL_MS; diff --git a/tests/unit/openrouter-vision-sync-4264.test.ts b/tests/unit/openrouter-vision-sync-4264.test.ts index ac00c42e68..2612c07c62 100644 --- a/tests/unit/openrouter-vision-sync-4264.test.ts +++ b/tests/unit/openrouter-vision-sync-4264.test.ts @@ -24,7 +24,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4264 normalizeDiscoveredModels captures vision from OpenRouter architecture", () => { diff --git a/tests/unit/ops-scripts.test.ts b/tests/unit/ops-scripts.test.ts index 2b37aae0cd..8bfb6d3e1c 100644 --- a/tests/unit/ops-scripts.test.ts +++ b/tests/unit/ops-scripts.test.ts @@ -136,7 +136,7 @@ describe("ops runbook scripts (bin/*.sh)", () => { ); db.close(); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -187,7 +187,7 @@ describe("ops runbook scripts (bin/*.sh)", () => { ); db.close(); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } ); diff --git a/tests/unit/optional-packs.test.ts b/tests/unit/optional-packs.test.ts index 5ff6eb84f6..47947c8eab 100644 --- a/tests/unit/optional-packs.test.ts +++ b/tests/unit/optional-packs.test.ts @@ -33,7 +33,7 @@ test("packs dirs derive from DATA_DIR override without touching the real home", packNodeModulesDir("browser-runtime", dataDir), path.join(dataDir, "packs", "browser-runtime", "node_modules") ); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("installedPackNodePaths lists only packs with an existing node_modules dir, in manifest order", () => { @@ -51,7 +51,7 @@ test("installedPackNodePaths lists only packs with an existing node_modules dir, path.join(dataDir, "packs", "ml-runtime", "node_modules"), path.join(dataDir, "packs", "browser-runtime", "node_modules"), ]); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("packMemberInstalled probes installed pack trees with optional node_modules prefix", () => { @@ -83,7 +83,7 @@ test("packMemberInstalled probes installed pack trees with optional node_modules packMemberInstalled("@atjsh/llmlingua-2/package.json", path.join(dataDir, "absent")), false ); - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("manifest and runtime pack lists stay in sync", async () => { diff --git a/tests/unit/paid-model-target-routes-6540.test.ts b/tests/unit/paid-model-target-routes-6540.test.ts index 63e216e84a..d7ab318a78 100644 --- a/tests/unit/paid-model-target-routes-6540.test.ts +++ b/tests/unit/paid-model-target-routes-6540.test.ts @@ -26,7 +26,7 @@ const UNKNOWN_TARGET = "my-combo-alias"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── PATCH /api/settings — webSearchRouteModel ────────────────────────────── diff --git a/tests/unit/param-filters-db.test.ts b/tests/unit/param-filters-db.test.ts index 2b6f83b77f..71a82aa762 100644 --- a/tests/unit/param-filters-db.test.ts +++ b/tests/unit/param-filters-db.test.ts @@ -24,7 +24,7 @@ const { stripUnsupportedParams } = await import("../../open-sse/translator/param test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/payload-rules-restart-persistence.test.ts b/tests/unit/payload-rules-restart-persistence.test.ts index e08bee0870..b57f0256f2 100644 --- a/tests/unit/payload-rules-restart-persistence.test.ts +++ b/tests/unit/payload-rules-restart-persistence.test.ts @@ -27,7 +27,7 @@ const payloadRulesService = await import("../../open-sse/services/payloadRules.t test.after(() => { payloadRulesService.resetPayloadRulesConfigForTests(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#2986 payload rules survive a restart (DB fallback when override is cleared)", async () => { diff --git a/tests/unit/payload-rules-route.test.ts b/tests/unit/payload-rules-route.test.ts index 9db6cf0117..22b2b44515 100644 --- a/tests/unit/payload-rules-route.test.ts +++ b/tests/unit/payload-rules-route.test.ts @@ -21,7 +21,7 @@ async function resetStorage() { core.resetDbInstance(); payloadRulesService.resetPayloadRulesConfigForTests(); delete process.env.INITIAL_PASSWORD; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/payload-rules.test.ts b/tests/unit/payload-rules.test.ts index 1e059d4402..df9d40908b 100644 --- a/tests/unit/payload-rules.test.ts +++ b/tests/unit/payload-rules.test.ts @@ -138,5 +138,5 @@ test("payload rules load from JSON file and reload changed content", async () => assert.equal(second.defaultRaw.length, 1); assert.deepEqual(second.defaultRaw[0].params.response_format, { type: "json_object" }); - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/persist-429-cooldown-account-fallback.test.ts b/tests/unit/persist-429-cooldown-account-fallback.test.ts index e5fa987a24..37edee0dda 100644 --- a/tests/unit/persist-429-cooldown-account-fallback.test.ts +++ b/tests/unit/persist-429-cooldown-account-fallback.test.ts @@ -44,7 +44,7 @@ import { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helpers ──────────────────────────────────────────────────────────────── diff --git a/tests/unit/pick-internal-api-key-6372.test.ts b/tests/unit/pick-internal-api-key-6372.test.ts index 483235feec..569f7879e6 100644 --- a/tests/unit/pick-internal-api-key-6372.test.ts +++ b/tests/unit/pick-internal-api-key-6372.test.ts @@ -19,14 +19,14 @@ const apiKeysDb = await import("../../src/lib/db/apiKeys.ts"); function reset() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(() => reset()); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6372: returns null when there are no keys", async () => { diff --git a/tests/unit/piiReproduction.test.ts b/tests/unit/piiReproduction.test.ts index a1c984b911..109fb348d6 100644 --- a/tests/unit/piiReproduction.test.ts +++ b/tests/unit/piiReproduction.test.ts @@ -137,5 +137,5 @@ test("PII Reproduction Tests", async (t) => { test.after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/piiSanitizer.test.ts b/tests/unit/piiSanitizer.test.ts index 8a035b358d..042ad5c45a 100644 --- a/tests/unit/piiSanitizer.test.ts +++ b/tests/unit/piiSanitizer.test.ts @@ -96,7 +96,7 @@ test("sanitizePII checks resolveFeatureFlag, not process.env", async (t) => { test.after(async () => { const coreDb = await import("@/lib/db/core"); coreDb.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getMode returns redact for invalid flag values", async () => { diff --git a/tests/unit/piiSanitizerIpv6.test.ts b/tests/unit/piiSanitizerIpv6.test.ts index 03fdb4c353..f5fecbbfe1 100644 --- a/tests/unit/piiSanitizerIpv6.test.ts +++ b/tests/unit/piiSanitizerIpv6.test.ts @@ -198,5 +198,5 @@ test("IPv6 address inside SSE JSON content is redacted end-to-end", async () => test.after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); \ No newline at end of file diff --git a/tests/unit/playground-key-policy-3503.test.ts b/tests/unit/playground-key-policy-3503.test.ts index fd6a87850c..816e69da6e 100644 --- a/tests/unit/playground-key-policy-3503.test.ts +++ b/tests/unit/playground-key-policy-3503.test.ts @@ -48,7 +48,7 @@ function req(headers: Record) { } test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#3503 — authenticated session + key-id header resolves the key secret server-side", async () => { diff --git a/tests/unit/plugins-config-route.test.ts b/tests/unit/plugins-config-route.test.ts index 0b90bb65b3..076f9e3d9f 100644 --- a/tests/unit/plugins-config-route.test.ts +++ b/tests/unit/plugins-config-route.test.ts @@ -66,13 +66,13 @@ function validateConfig( test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); // ── Test schema ── diff --git a/tests/unit/plugins-dev-mode.test.ts b/tests/unit/plugins-dev-mode.test.ts index 2795930c3a..daea026272 100644 --- a/tests/unit/plugins-dev-mode.test.ts +++ b/tests/unit/plugins-dev-mode.test.ts @@ -10,7 +10,7 @@ describe("devMode", () => { afterEach(() => { stopDevMode(); - try { rmSync(testDir, { recursive: true, force: true }); } catch {} + try { rmSync(testDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); it("startDevMode creates watcher without throwing", () => { diff --git a/tests/unit/plugins-doctor.test.ts b/tests/unit/plugins-doctor.test.ts index 3f2dd5d4c9..43eb10912e 100644 --- a/tests/unit/plugins-doctor.test.ts +++ b/tests/unit/plugins-doctor.test.ts @@ -21,7 +21,7 @@ describe("runPluginDoctor", () => { }); afterEach(() => { - try { rmSync(testDir, { recursive: true, force: true }); } catch {} + try { rmSync(testDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); it("healthy plugin with valid manifest and entry point", async () => { diff --git a/tests/unit/plugins-edge-cases.test.ts b/tests/unit/plugins-edge-cases.test.ts index a76383c3ab..feab027d97 100644 --- a/tests/unit/plugins-edge-cases.test.ts +++ b/tests/unit/plugins-edge-cases.test.ts @@ -28,7 +28,7 @@ const activeSourceDirs: string[] = []; function cleanupSourceDirs() { for (const dir of activeSourceDirs) { - try { fs.rmSync(dir, { recursive: true, force: true }); } catch {} + try { fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeSourceDirs.length = 0; } @@ -94,7 +94,7 @@ test.beforeEach(() => { // Production DB may not have the plugins table — ignore; fresh DB created below. } resetHooks(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); cleanupSourceDirs(); }); @@ -102,7 +102,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); cleanupSourceDirs(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); // ══════════════════════════════════════════ diff --git a/tests/unit/plugins-fs-safety.test.ts b/tests/unit/plugins-fs-safety.test.ts index 2e2d695fb0..962050728f 100644 --- a/tests/unit/plugins-fs-safety.test.ts +++ b/tests/unit/plugins-fs-safety.test.ts @@ -110,14 +110,14 @@ function cleanInstalledPluginDirs() { // Remove final dir and any staging remnants const base = path.join(DEFAULT_PLUGIN_DIR, name); try { - fs.rmSync(base, { recursive: true, force: true }); + fs.rmSync(base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} // Also clean any .staging-* leftovers if (fs.existsSync(DEFAULT_PLUGIN_DIR)) { for (const entry of fs.readdirSync(DEFAULT_PLUGIN_DIR)) { if (entry.startsWith(`${name}.staging-`)) { try { - fs.rmSync(path.join(DEFAULT_PLUGIN_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(DEFAULT_PLUGIN_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } } @@ -128,7 +128,7 @@ function cleanInstalledPluginDirs() { function cleanSourceDirs() { for (const d of activeDirs) { try { - fs.rmSync(d, { recursive: true, force: true }); + fs.rmSync(d, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeDirs.length = 0; @@ -137,7 +137,7 @@ function cleanSourceDirs() { test.beforeEach(() => { core.resetDbInstance(); hooks.resetHooks(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); cleanSourceDirs(); cleanInstalledPluginDirs(); @@ -148,7 +148,7 @@ test.after(() => { cleanSourceDirs(); cleanInstalledPluginDirs(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); diff --git a/tests/unit/plugins-loader.test.ts b/tests/unit/plugins-loader.test.ts index 90b5c6ed48..c7211c69ac 100644 --- a/tests/unit/plugins-loader.test.ts +++ b/tests/unit/plugins-loader.test.ts @@ -88,7 +88,7 @@ test( t.after(async () => { loaded?.cleanup(); - await rm(pluginDir, { recursive: true, force: true }); + await rm(pluginDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); await writeFile( @@ -148,7 +148,7 @@ test( t.after(async () => { loaded?.cleanup(); - await rm(pluginDir, { recursive: true, force: true }); + await rm(pluginDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); await writeFile( @@ -224,8 +224,8 @@ test( if (value === undefined) delete process.env[key]; else process.env[key] = value; } - await rm(pluginDir, { recursive: true, force: true }); - await rm(hostScriptDir, { recursive: true, force: true }); + await rm(pluginDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + await rm(hostScriptDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); await writeFile(entryPoint, "export async function onRequest() { return {}; }\n", "utf-8"); diff --git a/tests/unit/plugins-logger.test.ts b/tests/unit/plugins-logger.test.ts index da3b96d2a9..7d3e7f9a4e 100644 --- a/tests/unit/plugins-logger.test.ts +++ b/tests/unit/plugins-logger.test.ts @@ -9,7 +9,7 @@ describe("PluginLogger", () => { const testDir = join(tmpdir(), `plugin-logger-test-${Date.now()}`); afterEach(() => { - try { rmSync(testDir, { recursive: true, force: true }); } catch {} + try { rmSync(testDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); it("creates log file and writes JSON entries", () => { diff --git a/tests/unit/plugins-manager-lifecycle.test.ts b/tests/unit/plugins-manager-lifecycle.test.ts index be2139cf00..85fe8eb8af 100644 --- a/tests/unit/plugins-manager-lifecycle.test.ts +++ b/tests/unit/plugins-manager-lifecycle.test.ts @@ -58,7 +58,7 @@ describe("pluginManager lifecycle", () => { assert.ok(dbRow); assert.equal(dbRow!.status, "installed"); } finally { - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -81,7 +81,7 @@ describe("pluginManager lifecycle", () => { // the plugin's child process — without it the child outlives the test and its // IPC channel keeps this process's event loop alive after the suite finishes. await mod.pluginManager.deactivate("activate-test").catch(() => {}); - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -95,7 +95,7 @@ describe("pluginManager lifecycle", () => { const dbRow = db.getPluginByName("deactivate-test"); assert.equal(dbRow!.status, "inactive"); } finally { - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -114,7 +114,7 @@ describe("pluginManager lifecycle", () => { const dbRow = db.getPluginByName("uninstall-test"); assert.equal(dbRow, null); } finally { - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); }); diff --git a/tests/unit/plugins-manager-restart-reload-7806.test.ts b/tests/unit/plugins-manager-restart-reload-7806.test.ts index 31e4c18b80..79c16537c9 100644 --- a/tests/unit/plugins-manager-restart-reload-7806.test.ts +++ b/tests/unit/plugins-manager-restart-reload-7806.test.ts @@ -103,7 +103,7 @@ describe("pluginManager reload after restart (#7806)", () => { // Deactivate to kill the reloaded child process — otherwise it dangles and // keeps the test runner's event loop alive after the suite finishes. await mod.pluginManager.deactivate(name).catch(() => {}); - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -130,7 +130,7 @@ describe("pluginManager reload after restart (#7806)", () => { // Deactivate to kill the reloaded child process — otherwise it dangles and // keeps the test runner's event loop alive after the suite finishes. await mod.pluginManager.deactivate(name).catch(() => {}); - rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true }); + rmSync(dir.split("/").slice(0, -1).join("/"), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); }); diff --git a/tests/unit/plugins-metrics.test.ts b/tests/unit/plugins-metrics.test.ts index a9780c9001..9139d3bd64 100644 --- a/tests/unit/plugins-metrics.test.ts +++ b/tests/unit/plugins-metrics.test.ts @@ -18,7 +18,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); test("recordPluginMetric stores call count", async () => { diff --git a/tests/unit/plugins-scanner.test.ts b/tests/unit/plugins-scanner.test.ts index eab34574f9..e2636a128d 100644 --- a/tests/unit/plugins-scanner.test.ts +++ b/tests/unit/plugins-scanner.test.ts @@ -36,7 +36,7 @@ describe("plugin scanner", () => { assert.ok(result.plugins[0].manifest); assert.ok(result.plugins[0].pluginDir); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -48,7 +48,7 @@ describe("plugin scanner", () => { const result = await mod.scanPluginDir(tmp); assert.equal(result.plugins.length, 0); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -59,7 +59,7 @@ describe("plugin scanner", () => { const result = await mod.scanPluginDir(tmp); assert.equal(result.plugins.length, 0); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -76,7 +76,7 @@ describe("plugin scanner", () => { const result = await mod.scanPluginDir(tmp); assert.equal(result.plugins.length, 2); } finally { - rmSync(tmp, { recursive: true, force: true }); + rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); }); diff --git a/tests/unit/plugins-signing.test.ts b/tests/unit/plugins-signing.test.ts index d24b5a57fc..894982a172 100644 --- a/tests/unit/plugins-signing.test.ts +++ b/tests/unit/plugins-signing.test.ts @@ -29,7 +29,7 @@ function writePlugin(dir: string, name: string, source: string, integrity?: stri const activeDirs: string[] = []; function cleanupDirs() { for (const d of activeDirs) { - try { fs.rmSync(d, { recursive: true, force: true }); } catch {} + try { fs.rmSync(d, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeDirs.length = 0; } @@ -44,7 +44,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); cleanupDirs(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); test("computeIntegrity returns correct format", async () => { diff --git a/tests/unit/plugins-tools.test.ts b/tests/unit/plugins-tools.test.ts index 8b6a37203b..03ea2f8c86 100644 --- a/tests/unit/plugins-tools.test.ts +++ b/tests/unit/plugins-tools.test.ts @@ -56,7 +56,7 @@ const activeSourceDirs: string[] = []; function cleanupSourceDirs() { for (const dir of activeSourceDirs) { - try { fs.rmSync(dir, { recursive: true, force: true }); } catch {} + try { fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeSourceDirs.length = 0; } @@ -66,7 +66,7 @@ function cleanupSourceDirs() { test.beforeEach(() => { core.resetDbInstance(); hooks.resetHooks(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); cleanupSourceDirs(); }); @@ -74,7 +74,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); cleanupSourceDirs(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); // ── plugin_list ── diff --git a/tests/unit/plugins-upgrade.test.ts b/tests/unit/plugins-upgrade.test.ts index 51a2f8b7c2..4be9bdd653 100644 --- a/tests/unit/plugins-upgrade.test.ts +++ b/tests/unit/plugins-upgrade.test.ts @@ -69,7 +69,7 @@ function writePluginWithConfig(version: string, name = "upgrade-config-test") { const activeDirs: string[] = []; function cleanupDirs() { for (const dir of activeDirs) { - try { fs.rmSync(dir, { recursive: true, force: true }); } catch {} + try { fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } activeDirs.length = 0; } @@ -84,7 +84,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); cleanupDirs(); - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch {} + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} }); // ── Tests ── diff --git a/tests/unit/plugins-welcome-banner-e2e.test.ts b/tests/unit/plugins-welcome-banner-e2e.test.ts index 59295b07ad..e03efd1576 100644 --- a/tests/unit/plugins-welcome-banner-e2e.test.ts +++ b/tests/unit/plugins-welcome-banner-e2e.test.ts @@ -455,7 +455,7 @@ test("full lifecycle: install → activate → hook fires → deactivate → uni test("cleanup fixture directory", () => { if (existsSync(FIXTURE_DIR)) { - rmSync(FIXTURE_DIR, { recursive: true, force: true }); + rmSync(FIXTURE_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } assert.ok(!existsSync(FIXTURE_DIR)); }); diff --git a/tests/unit/poe-api-executor-regression.test.ts b/tests/unit/poe-api-executor-regression.test.ts index 8ce969b981..b7ea9dd263 100644 --- a/tests/unit/poe-api-executor-regression.test.ts +++ b/tests/unit/poe-api-executor-regression.test.ts @@ -34,7 +34,7 @@ test.after(() => { } catch { // ignore } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const CHAT_URL = "https://api.poe.com/v1/chat/completions"; diff --git a/tests/unit/poe-provider-models-baseurl.test.ts b/tests/unit/poe-provider-models-baseurl.test.ts index 7043e4ae44..9d81cce5a3 100644 --- a/tests/unit/poe-provider-models-baseurl.test.ts +++ b/tests/unit/poe-provider-models-baseurl.test.ts @@ -24,7 +24,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider models route resolves the built-in Poe registry base URL instead of failing with 'No base URL configured for provider' (#8082)", async () => { diff --git a/tests/unit/policy-engine.test.ts b/tests/unit/policy-engine.test.ts index 79e12befc3..ad98f12867 100644 --- a/tests/unit/policy-engine.test.ts +++ b/tests/unit/policy-engine.test.ts @@ -18,7 +18,7 @@ beforeEach(() => { afterEach(() => { delete process.env.DATA_DIR; - if (tmpDir) fs.rmSync(tmpDir, { recursive: true, force: true }); + if (tmpDir) fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("policyEngine", async () => { diff --git a/tests/unit/postinstall-support.test.ts b/tests/unit/postinstall-support.test.ts index c007b35ae0..7784f2b66a 100644 --- a/tests/unit/postinstall-support.test.ts +++ b/tests/unit/postinstall-support.test.ts @@ -13,7 +13,7 @@ test("hasStandaloneAppBundle returns false for source checkout without standalon mkdirSync(join(root, "src", "app"), { recursive: true }); assert.equal(hasStandaloneAppBundle(root), false); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -25,7 +25,7 @@ test("hasStandaloneAppBundle returns true for published standalone app bundle", writeFileSync(join(root, "app", "server.js"), "export {};\n"); assert.equal(hasStandaloneAppBundle(root), true); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/pricing-route-sources.test.ts b/tests/unit/pricing-route-sources.test.ts index 1398a10ef5..348bd63c62 100644 --- a/tests/unit/pricing-route-sources.test.ts +++ b/tests/unit/pricing-route-sources.test.ts @@ -18,7 +18,7 @@ const pricingRoute = await import("../../src/app/api/pricing/route.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -28,7 +28,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("pricing GET keeps legacy payload by default and exposes source metadata on demand", async () => { diff --git a/tests/unit/pricing-sync-cross-instance.test.ts b/tests/unit/pricing-sync-cross-instance.test.ts index 1e123835c6..3b7b1d95cd 100644 --- a/tests/unit/pricing-sync-cross-instance.test.ts +++ b/tests/unit/pricing-sync-cross-instance.test.ts @@ -41,7 +41,7 @@ function buildLiteLLMFixture() { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("manual sync history remains visible without advertising a disabled future sync", async () => { diff --git a/tests/unit/pricing-sync-extended.test.ts b/tests/unit/pricing-sync-extended.test.ts index ae85d28f03..0f669e6533 100644 --- a/tests/unit/pricing-sync-extended.test.ts +++ b/tests/unit/pricing-sync-extended.test.ts @@ -33,7 +33,7 @@ function buildLiteLLMFixture() { async function resetStorage() { pricingSync.stopPeriodicSync(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.after(async () => { globalThis.fetch = originalFetch; console.warn = originalWarn; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("fetchLiteLLMPricing parses JSON and rejects invalid payloads", async () => { diff --git a/tests/unit/probe-6835-cyclebreaker.test.ts b/tests/unit/probe-6835-cyclebreaker.test.ts index fda653124d..a93d1e8ae0 100644 --- a/tests/unit/probe-6835-cyclebreaker.test.ts +++ b/tests/unit/probe-6835-cyclebreaker.test.ts @@ -24,5 +24,5 @@ test("getDbInstance() caps the probe-failed/restore cycle at 3 attempts (#6835)" const abortIndex = errors.findIndex((e) => e.includes("Aborting startup")); assert.notEqual(abortIndex, -1, "Expected the cap to trip; got: " + errors.join(" | ")); assert.ok(abortIndex <= 4, "Expected cap by call #4; took until #" + abortIndex); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/probe-6835-oom-uncapped.test.ts b/tests/unit/probe-6835-oom-uncapped.test.ts index 9b91101646..89e6007124 100644 --- a/tests/unit/probe-6835-oom-uncapped.test.ts +++ b/tests/unit/probe-6835-oom-uncapped.test.ts @@ -54,5 +54,5 @@ test("getDbInstance() eventually caps a persistently-OOMing sql.js probe (#6835) "already does for generic corruption (#6632). Instead every call re-threw an identical, " + "uncapped OOM error:\n" + errors.map((e, i) => ` [${i}] ${e}`).join("\n") ); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/probe-9541-repro.test.ts b/tests/unit/probe-9541-repro.test.ts index 1faab99844..1a1caa76a6 100644 --- a/tests/unit/probe-9541-repro.test.ts +++ b/tests/unit/probe-9541-repro.test.ts @@ -107,7 +107,7 @@ test("BUG-CONFIRMED (regression guard): probe failure renames DB and loses persi ); } finally { try { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ok */ } diff --git a/tests/unit/probe-autodisable-isolation.test.ts b/tests/unit/probe-autodisable-isolation.test.ts index 5cb4479b67..d2e3e2da91 100644 --- a/tests/unit/probe-autodisable-isolation.test.ts +++ b/tests/unit/probe-autodisable-isolation.test.ts @@ -16,7 +16,7 @@ const { runAsProbe } = await import("../../src/shared/utils/probeOrigin.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function readIsActive(connId: string): unknown { diff --git a/tests/unit/probe-gate-autodisable.test.ts b/tests/unit/probe-gate-autodisable.test.ts index a4cb5755fb..e2340059ea 100644 --- a/tests/unit/probe-gate-autodisable.test.ts +++ b/tests/unit/probe-gate-autodisable.test.ts @@ -28,7 +28,7 @@ test.beforeEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function readConnectionRow(connId: string) { diff --git a/tests/unit/probe-policy.test.ts b/tests/unit/probe-policy.test.ts index bed1fc6f55..12403a6034 100644 --- a/tests/unit/probe-policy.test.ts +++ b/tests/unit/probe-policy.test.ts @@ -15,7 +15,7 @@ const { runAsProbe, shouldIsolateProbeFailures, isProbeContext } = test.after(() => { delete process.env.PROBE_CAN_DISABLE; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("outside a probe context the decision is always false (real path)", async () => { diff --git a/tests/unit/probe-production-path.test.ts b/tests/unit/probe-production-path.test.ts index 3b099b99dc..cc61c597d7 100644 --- a/tests/unit/probe-production-path.test.ts +++ b/tests/unit/probe-production-path.test.ts @@ -14,7 +14,7 @@ const { markAccountUnavailable } = await import("../../src/sse/services/auth.ts" test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function readConnectionRow(connId: string) { diff --git a/tests/unit/probe-testall-isolation.test.ts b/tests/unit/probe-testall-isolation.test.ts index 40016fec82..201fafc909 100644 --- a/tests/unit/probe-testall-isolation.test.ts +++ b/tests/unit/probe-testall-isolation.test.ts @@ -29,7 +29,7 @@ test.beforeEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function readConnectionRow(connId: string) { diff --git a/tests/unit/prompt-injection-guard-db-flag.test.ts b/tests/unit/prompt-injection-guard-db-flag.test.ts index a50b011a64..951a3f55d6 100644 --- a/tests/unit/prompt-injection-guard-db-flag.test.ts +++ b/tests/unit/prompt-injection-guard-db-flag.test.ts @@ -22,7 +22,7 @@ const ATTACK = { describe("prompt injection guard — DB feature flag override (INJECTION_GUARD_MODE)", () => { function resetDb() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); } @@ -36,7 +36,7 @@ describe("prompt injection guard — DB feature flag override (INJECTION_GUARD_M after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.INPUT_SANITIZER_ENABLED; delete process.env.INPUT_SANITIZER_MODE; delete process.env.INJECTION_GUARD_MODE; diff --git a/tests/unit/prompt-required-routes.test.ts b/tests/unit/prompt-required-routes.test.ts index b1faa3ae01..562d70326f 100644 --- a/tests/unit/prompt-required-routes.test.ts +++ b/tests/unit/prompt-required-routes.test.ts @@ -15,7 +15,7 @@ type ErrorResponseBody = { error: { message: string } }; test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 video generation POST rejects requests without a prompt", async () => { diff --git a/tests/unit/provider-connection-apikey-dedup.test.ts b/tests/unit/provider-connection-apikey-dedup.test.ts index b0e05a0d5d..0ef654c553 100644 --- a/tests/unit/provider-connection-apikey-dedup.test.ts +++ b/tests/unit/provider-connection-apikey-dedup.test.ts @@ -13,7 +13,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -21,7 +21,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function apiKeyConnections(provider: string) { diff --git a/tests/unit/provider-connection-healthcheck-interval-zero.test.ts b/tests/unit/provider-connection-healthcheck-interval-zero.test.ts index 0633f7e7d1..d37262bbda 100644 --- a/tests/unit/provider-connection-healthcheck-interval-zero.test.ts +++ b/tests/unit/provider-connection-healthcheck-interval-zero.test.ts @@ -19,7 +19,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -35,7 +35,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression: the `_insertConnectionRow` and `_updateConnectionRow` bind helpers diff --git a/tests/unit/provider-connections-pagination-2998.test.ts b/tests/unit/provider-connections-pagination-2998.test.ts index ed2025b153..3810cfff5b 100644 --- a/tests/unit/provider-connections-pagination-2998.test.ts +++ b/tests/unit/provider-connections-pagination-2998.test.ts @@ -17,7 +17,7 @@ const providersRoute = await import("../../src/app/api/providers/route.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(resetDb); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/providers filters and counts before applying limit/offset", async () => { diff --git a/tests/unit/provider-connections-quota-threshold.test.ts b/tests/unit/provider-connections-quota-threshold.test.ts index e7812557e9..16e98173cd 100644 --- a/tests/unit/provider-connections-quota-threshold.test.ts +++ b/tests/unit/provider-connections-quota-threshold.test.ts @@ -17,7 +17,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -38,7 +38,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderConnection persists quotaWindowThresholds map", async () => { diff --git a/tests/unit/provider-health-matrix.test.ts b/tests/unit/provider-health-matrix.test.ts index 7e4edd12ab..d3509935da 100644 --- a/tests/unit/provider-health-matrix.test.ts +++ b/tests/unit/provider-health-matrix.test.ts @@ -27,7 +27,7 @@ const CANONICAL_ALIAS_PROVIDER = "nous-research"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); for (const lockout of accountFallback.getAllModelLockouts()) { if (lockout.provider === PROVIDER) { @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts b/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts index ac0a285133..c3bc8e9efa 100644 --- a/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts +++ b/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts @@ -27,7 +27,7 @@ const originalFetch = globalThis.fetch; test.beforeEach(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.PROVIDER_LIMITS_SYNC_SPACING_MS; }); @@ -35,7 +35,7 @@ test.beforeEach(() => { test.after(() => { globalThis.fetch = originalFetch; delete process.env.PROVIDER_LIMITS_SYNC_SPACING_MS; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createGlmApiKeyConnection(i: number) { diff --git a/tests/unit/provider-limits-oauth-sequential-sync.test.ts b/tests/unit/provider-limits-oauth-sequential-sync.test.ts index d1c99ca088..075b226501 100644 --- a/tests/unit/provider-limits-oauth-sequential-sync.test.ts +++ b/tests/unit/provider-limits-oauth-sequential-sync.test.ts @@ -29,13 +29,13 @@ const originalFetch = globalThis.fetch; test.beforeEach(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { globalThis.fetch = originalFetch; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createClaudeOAuth(i: number) { diff --git a/tests/unit/provider-limits-proxy-fail-closed.test.ts b/tests/unit/provider-limits-proxy-fail-closed.test.ts index f32cc36f1e..eb3a923fd9 100644 --- a/tests/unit/provider-limits-proxy-fail-closed.test.ts +++ b/tests/unit/provider-limits-proxy-fail-closed.test.ts @@ -17,7 +17,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -84,7 +84,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Claude provider limits fail closed when an account proxy is unreachable", async () => { diff --git a/tests/unit/provider-limits-recovery.test.ts b/tests/unit/provider-limits-recovery.test.ts index eb2bcd0ea6..2a2b0a1e59 100644 --- a/tests/unit/provider-limits-recovery.test.ts +++ b/tests/unit/provider-limits-recovery.test.ts @@ -17,7 +17,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -79,7 +79,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("successful GLM quota refresh clears transient rate-limit state", async () => { diff --git a/tests/unit/provider-limits-rotating-expired-guard.test.ts b/tests/unit/provider-limits-rotating-expired-guard.test.ts index daca704d08..74ad93f080 100644 --- a/tests/unit/provider-limits-rotating-expired-guard.test.ts +++ b/tests/unit/provider-limits-rotating-expired-guard.test.ts @@ -13,7 +13,7 @@ const { quotaPathShouldMarkExpired, shouldAttemptRotatingRefresh } = await import("../../src/lib/usage/providerLimits.ts"); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression: the quota sync reuses a rotating provider's (possibly expired) diff --git a/tests/unit/provider-limits-sanitize-scope-3821.test.ts b/tests/unit/provider-limits-sanitize-scope-3821.test.ts index 60c29f0098..5b802ff38c 100644 --- a/tests/unit/provider-limits-sanitize-scope-3821.test.ts +++ b/tests/unit/provider-limits-sanitize-scope-3821.test.ts @@ -35,13 +35,13 @@ const providerLimits = await import("../../src/lib/usage/providerLimits.ts"); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function cacheEntry(quotas: Record) { diff --git a/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts b/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts index 64800fbfee..aa10617c62 100644 --- a/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts +++ b/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts @@ -14,7 +14,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider limits sync scheduler public surface excludes unused stop helper", () => { diff --git a/tests/unit/provider-metrics-deleted-provider.test.ts b/tests/unit/provider-metrics-deleted-provider.test.ts index 2cfbbbbf7a..25a5761088 100644 --- a/tests/unit/provider-metrics-deleted-provider.test.ts +++ b/tests/unit/provider-metrics-deleted-provider.test.ts @@ -20,7 +20,7 @@ type ProviderMetricsResponse = { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.beforeEach(() => { }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; }); diff --git a/tests/unit/provider-metrics-route.test.ts b/tests/unit/provider-metrics-route.test.ts index 2d0b2d2543..d2bf2d40bd 100644 --- a/tests/unit/provider-metrics-route.test.ts +++ b/tests/unit/provider-metrics-route.test.ts @@ -33,7 +33,7 @@ type ProviderMetricsResponse = { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -43,7 +43,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/provider-models-context-window-override-4125.test.ts b/tests/unit/provider-models-context-window-override-4125.test.ts index f7488cd04e..aa405e747c 100644 --- a/tests/unit/provider-models-context-window-override-4125.test.ts +++ b/tests/unit/provider-models-context-window-override-4125.test.ts @@ -32,7 +32,7 @@ const providerModelsRoute = await import("../../src/app/api/provider-models/rout async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function buildRequest(method: string, body: unknown) { diff --git a/tests/unit/provider-models-custom-merge-6247.test.ts b/tests/unit/provider-models-custom-merge-6247.test.ts index c6341ba8fb..eb5cf88b1c 100644 --- a/tests/unit/provider-models-custom-merge-6247.test.ts +++ b/tests/unit/provider-models-custom-merge-6247.test.ts @@ -30,7 +30,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -71,7 +71,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("per-connection models route includes user-added custom models on the local_catalog path (#6247)", async () => { diff --git a/tests/unit/provider-models-management-route.test.ts b/tests/unit/provider-models-management-route.test.ts index 3fee3b7132..a3039c0426 100644 --- a/tests/unit/provider-models-management-route.test.ts +++ b/tests/unit/provider-models-management-route.test.ts @@ -15,7 +15,7 @@ const providerModelsRoute = await import("../../src/app/api/provider-models/rout async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider-models GET returns an empty hiddenModelsByProvider map with no hidden models", async () => { diff --git a/tests/unit/provider-models-qwen-web-redirect-6267.test.ts b/tests/unit/provider-models-qwen-web-redirect-6267.test.ts index 0618c8ab9f..62e83c0d13 100644 --- a/tests/unit/provider-models-qwen-web-redirect-6267.test.ts +++ b/tests/unit/provider-models-qwen-web-redirect-6267.test.ts @@ -28,7 +28,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -69,7 +69,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("qwen-web model import degrades to the local catalog when the /models endpoint 307s (#6267)", async () => { diff --git a/tests/unit/provider-models-route-codex.test.ts b/tests/unit/provider-models-route-codex.test.ts index 0d4587218d..5a0ea5e792 100644 --- a/tests/unit/provider-models-route-codex.test.ts +++ b/tests/unit/provider-models-route-codex.test.ts @@ -47,7 +47,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; codexDiscovery.clearCodexGithubCatalogCacheForTests(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -79,7 +79,7 @@ test.after(async () => { globalThis.fetch = originalFetch; codexDiscovery.clearCodexGithubCatalogCacheForTests(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider models route merges live Codex models with the local catalog then filters denylist", async () => { diff --git a/tests/unit/provider-models-route-lan-guard.test.ts b/tests/unit/provider-models-route-lan-guard.test.ts index 92330febdd..48c7bb718b 100644 --- a/tests/unit/provider-models-route-lan-guard.test.ts +++ b/tests/unit/provider-models-route-lan-guard.test.ts @@ -38,7 +38,7 @@ async function resetStorage() { process.env.OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS = originalAllowLocalProviderUrls; } core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -69,7 +69,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6939: getProviderOutboundGuard() and getProviderValidationGuard() agree for LAN hosts under the default local-first setting", () => { diff --git a/tests/unit/provider-models-route.test.ts b/tests/unit/provider-models-route.test.ts index 237e3bc3b1..a8d6d2dd80 100644 --- a/tests/unit/provider-models-route.test.ts +++ b/tests/unit/provider-models-route.test.ts @@ -26,7 +26,7 @@ async function resetStorage() { } antigravityVersion.clearAntigravityVersionCaches(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider models route returns a static local catalog for non-LLM search/agent providers (#5569/#5571/#5573/#5575)", async () => { diff --git a/tests/unit/provider-models-token-limits.test.ts b/tests/unit/provider-models-token-limits.test.ts index aada0b2f87..13902a16f1 100644 --- a/tests/unit/provider-models-token-limits.test.ts +++ b/tests/unit/provider-models-token-limits.test.ts @@ -15,7 +15,7 @@ const providerModelsRoute = await import("../../src/app/api/provider-models/rout async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // #1294: POST /api/provider-models must persist max_input_tokens / max_output_tokens diff --git a/tests/unit/provider-models-v1-route.test.ts b/tests/unit/provider-models-v1-route.test.ts index c20eda3544..d6d15b56a8 100644 --- a/tests/unit/provider-models-v1-route.test.ts +++ b/tests/unit/provider-models-v1-route.test.ts @@ -36,7 +36,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /v1/providers/:provider/models returns 400 for completely unknown provider", async () => { diff --git a/tests/unit/provider-models-vision-override-1904.test.ts b/tests/unit/provider-models-vision-override-1904.test.ts index 508c6a1399..b3e7bed0e3 100644 --- a/tests/unit/provider-models-vision-override-1904.test.ts +++ b/tests/unit/provider-models-vision-override-1904.test.ts @@ -31,7 +31,7 @@ const catalogVision = await import("../../src/app/api/v1/models/catalogVision.ts async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function buildRequest(method: string, body: unknown) { diff --git a/tests/unit/provider-node-icon-url.test.ts b/tests/unit/provider-node-icon-url.test.ts index be4b14f0db..40ad7dad1a 100644 --- a/tests/unit/provider-node-icon-url.test.ts +++ b/tests/unit/provider-node-icon-url.test.ts @@ -19,7 +19,7 @@ const { createProviderNodeSchema, updateProviderNodeSchema } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createProviderNodeSchema accepts a valid iconUrl", () => { diff --git a/tests/unit/provider-node-reserved-prefix.test.ts b/tests/unit/provider-node-reserved-prefix.test.ts index e0c6655974..6c8e57def2 100644 --- a/tests/unit/provider-node-reserved-prefix.test.ts +++ b/tests/unit/provider-node-reserved-prefix.test.ts @@ -35,7 +35,7 @@ const { RESERVED_PROVIDER_PREFIXES, isReservedProviderPrefix, RESERVED_PREFIX_CO async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -80,7 +80,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ──── Shared module ──── diff --git a/tests/unit/provider-nodes-route.test.ts b/tests/unit/provider-nodes-route.test.ts index eb21fa0578..681304538f 100644 --- a/tests/unit/provider-nodes-route.test.ts +++ b/tests/unit/provider-nodes-route.test.ts @@ -30,7 +30,7 @@ async function resetStorage() { process.env.OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS = originalAllowLocalProviderUrls; } core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -48,7 +48,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider nodes route lists stored nodes and exposes the CC feature flag", async () => { diff --git a/tests/unit/provider-nodes-validate-modelid.test.ts b/tests/unit/provider-nodes-validate-modelid.test.ts index f0e51a6d0e..5c644b5426 100644 --- a/tests/unit/provider-nodes-validate-modelid.test.ts +++ b/tests/unit/provider-nodes-validate-modelid.test.ts @@ -17,7 +17,7 @@ const originalFetch = globalThis.fetch; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -29,7 +29,7 @@ test.afterEach(async () => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); type FetchCall = { url: string; init: any }; diff --git a/tests/unit/provider-nodes-vibeproxy-preset.test.ts b/tests/unit/provider-nodes-vibeproxy-preset.test.ts index 59830e8650..869f7b9afe 100644 --- a/tests/unit/provider-nodes-vibeproxy-preset.test.ts +++ b/tests/unit/provider-nodes-vibeproxy-preset.test.ts @@ -36,7 +36,7 @@ async function resetStorage() { delete process.env.OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS; delete process.env.OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("vibeproxy-openai preset creates a node with defaulted name/prefix/apiType", async () => { diff --git a/tests/unit/provider-patch-ratelimit-protection-11278.test.ts b/tests/unit/provider-patch-ratelimit-protection-11278.test.ts index b41f067d25..d3f5e03fb6 100644 --- a/tests/unit/provider-patch-ratelimit-protection-11278.test.ts +++ b/tests/unit/provider-patch-ratelimit-protection-11278.test.ts @@ -38,7 +38,7 @@ const rateLimitManager = await import("../../open-sse/services/rateLimitManager. function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -48,7 +48,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createConnection(rateLimitProtection: boolean) { diff --git a/tests/unit/provider-probe-target.test.ts b/tests/unit/provider-probe-target.test.ts index 2fff1cafcc..c1995c1fae 100644 --- a/tests/unit/provider-probe-target.test.ts +++ b/tests/unit/provider-probe-target.test.ts @@ -26,7 +26,7 @@ const probeTarget = await import("../../src/lib/proxyHealth/providerProbeTarget. test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function seedProxy(name: string) { diff --git a/tests/unit/provider-request-failure-pipeline.test.ts b/tests/unit/provider-request-failure-pipeline.test.ts index 34bac642f4..e2fcb447a3 100644 --- a/tests/unit/provider-request-failure-pipeline.test.ts +++ b/tests/unit/provider-request-failure-pipeline.test.ts @@ -63,7 +63,7 @@ async function resetStorage() { // under load this cache is evicted at unpredictable times, so tests that rely // on the stale cache flake. Make the reset honest and deterministic here. invalidateDbCache("settings"); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -88,7 +88,7 @@ test.after(async () => { clearPendingRequests(); resetAccountSemaphores(); await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("network failure persisted call log includes providerRequest in pipeline payloads", async () => { diff --git a/tests/unit/provider-scoped-models-route.test.ts b/tests/unit/provider-scoped-models-route.test.ts index 4d41d2cce5..cc90dc3a39 100644 --- a/tests/unit/provider-scoped-models-route.test.ts +++ b/tests/unit/provider-scoped-models-route.test.ts @@ -36,7 +36,7 @@ type ProviderModelsResponse = { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -59,7 +59,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("provider models route returns only selected provider models with unprefixed ids", async () => { diff --git a/tests/unit/provider-sweep-live-discovery.test.ts b/tests/unit/provider-sweep-live-discovery.test.ts index 2431179fa7..7063d12311 100644 --- a/tests/unit/provider-sweep-live-discovery.test.ts +++ b/tests/unit/provider-sweep-live-discovery.test.ts @@ -31,13 +31,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/provider-translate-path-golden.test.ts b/tests/unit/provider-translate-path-golden.test.ts index 7cffac3d66..36e81677d1 100644 --- a/tests/unit/provider-translate-path-golden.test.ts +++ b/tests/unit/provider-translate-path-golden.test.ts @@ -171,6 +171,6 @@ test("GOLDEN guard catches translate-path drift", () => { assert.throws(() => goldenSnapshot("provider/translate-path", mutated, tmpDir)); } finally { delete process.env.UPDATE_GOLDEN; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/provider-validation-unsupported-neutral.test.ts b/tests/unit/provider-validation-unsupported-neutral.test.ts index d26433dfb0..ae5ea68627 100644 --- a/tests/unit/provider-validation-unsupported-neutral.test.ts +++ b/tests/unit/provider-validation-unsupported-neutral.test.ts @@ -53,6 +53,9 @@ test.after(() => { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, + + maxRetries: 5, + retryDelay: 100, }); }); diff --git a/tests/unit/provider-window-costs.test.ts b/tests/unit/provider-window-costs.test.ts index 63ac2e23ec..46f42f5e7c 100644 --- a/tests/unit/provider-window-costs.test.ts +++ b/tests/unit/provider-window-costs.test.ts @@ -22,7 +22,7 @@ async function resetStorage() { core.resetDbInstance(); apiKeys.resetApiKeyState(); costRules.resetCostData(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.after(() => { core.resetDbInstance(); apiKeys.resetApiKeyState(); costRules.resetCostData(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex provider window costs use the weekly reset window and API key USD limit", async () => { diff --git a/tests/unit/providers-batch-update.test.ts b/tests/unit/providers-batch-update.test.ts index a45e3cd405..4f0c31373d 100644 --- a/tests/unit/providers-batch-update.test.ts +++ b/tests/unit/providers-batch-update.test.ts @@ -23,7 +23,7 @@ function getConnectionId(connection: Connection): string { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -45,7 +45,7 @@ beforeEach(async () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("batchUpdateProviderConnectionsSchema", () => { diff --git a/tests/unit/providers-route-codex-account-pool.test.ts b/tests/unit/providers-route-codex-account-pool.test.ts index 1ee23a74fd..8f13b01228 100644 --- a/tests/unit/providers-route-codex-account-pool.test.ts +++ b/tests/unit/providers-route-codex-account-pool.test.ts @@ -16,7 +16,7 @@ const providersRoute = await import("../../src/app/api/providers/route.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET keeps one parent row and projects raw Codex state without exposing credentials", async () => { diff --git a/tests/unit/providers-route-managed-catalog.test.ts b/tests/unit/providers-route-managed-catalog.test.ts index 8e380dae84..02e8012d20 100644 --- a/tests/unit/providers-route-managed-catalog.test.ts +++ b/tests/unit/providers-route-managed-catalog.test.ts @@ -16,7 +16,7 @@ const modelsDb = await import("../../src/lib/db/models.ts"); function resetDb() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -26,7 +26,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("providers route accepts managed local, audio, web-cookie and search providers", async () => { diff --git a/tests/unit/providers-validate-route.test.ts b/tests/unit/providers-validate-route.test.ts index ba31957781..83b3a7bead 100644 --- a/tests/unit/providers-validate-route.test.ts +++ b/tests/unit/providers-validate-route.test.ts @@ -16,13 +16,13 @@ const validateRoute = await import("../../src/app/api/providers/validate/route.t async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalAllowPrivateProviderUrls === undefined) { delete process.env.OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS; } else { diff --git a/tests/unit/proxy-10348-log-redaction.test.ts b/tests/unit/proxy-10348-log-redaction.test.ts index 615cbc3adf..11bc401fb4 100644 --- a/tests/unit/proxy-10348-log-redaction.test.ts +++ b/tests/unit/proxy-10348-log-redaction.test.ts @@ -16,7 +16,7 @@ const proxyLogger = await import("../../src/lib/proxyLogger.ts"); function resetStorage() { proxyLogger.clearProxyLogs(); core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/proxy-assigned-unavailable-6246.test.ts b/tests/unit/proxy-assigned-unavailable-6246.test.ts index 396949108e..0f829b25e8 100644 --- a/tests/unit/proxy-assigned-unavailable-6246.test.ts +++ b/tests/unit/proxy-assigned-unavailable-6246.test.ts @@ -28,7 +28,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -51,7 +51,7 @@ async function makeConnection(): Promise { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("BLOCKS: an account proxy assigned but marked inactive (the IP-leak case)", async () => { diff --git a/tests/unit/proxy-autoselect-optin-3332.test.ts b/tests/unit/proxy-autoselect-optin-3332.test.ts index 35f58c77fe..f7a4ba6e6b 100644 --- a/tests/unit/proxy-autoselect-optin-3332.test.ts +++ b/tests/unit/proxy-autoselect-optin-3332.test.ts @@ -48,7 +48,7 @@ test.after(() => { /* ignore */ } try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/proxy-batch-routes-5918.test.ts b/tests/unit/proxy-batch-routes-5918.test.ts index b5ca6ae98f..36d3c39a9c 100644 --- a/tests/unit/proxy-batch-routes-5918.test.ts +++ b/tests/unit/proxy-batch-routes-5918.test.ts @@ -38,13 +38,13 @@ function jsonRequest(body: unknown): Request { async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("batch-delete removes multiple existing proxies in one request", async () => { diff --git a/tests/unit/proxy-bulk-import-dedup-7594.test.ts b/tests/unit/proxy-bulk-import-dedup-7594.test.ts index bec2a9660f..0a7bb0c91f 100644 --- a/tests/unit/proxy-bulk-import-dedup-7594.test.ts +++ b/tests/unit/proxy-bulk-import-dedup-7594.test.ts @@ -22,7 +22,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("upsertProxy creates distinct entries for same host:port with different credentials (#7594)", async () => { diff --git a/tests/unit/proxy-egress-route-summary.test.ts b/tests/unit/proxy-egress-route-summary.test.ts index 19cbd0be6c..bc39b55cce 100644 --- a/tests/unit/proxy-egress-route-summary.test.ts +++ b/tests/unit/proxy-egress-route-summary.test.ts @@ -24,7 +24,7 @@ const route = await import("../../src/app/api/settings/proxies/egress/route.ts") function resetStorage() { core.resetDbInstance(); proxyLogger.clearProxyLogs(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -41,7 +41,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("GET /api/settings/proxies/egress adds an anonymous summary to the existing payload", async () => { diff --git a/tests/unit/proxy-egress-validate-pool-default.test.ts b/tests/unit/proxy-egress-validate-pool-default.test.ts index 423406e48a..e27b401ec6 100644 --- a/tests/unit/proxy-egress-validate-pool-default.test.ts +++ b/tests/unit/proxy-egress-validate-pool-default.test.ts @@ -29,7 +29,7 @@ const { validateProxyPool, _setEgressProbeForTests, clearEgressCache } = egress async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(() => { _setEgressProbeForTests(null); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("validateProxyPool() with no injected deps does not crash on the real listProxies() {items,total} shape", async () => { diff --git a/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts b/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts index 7194a69f1b..2014da7361 100644 --- a/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts +++ b/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts @@ -23,7 +23,7 @@ const { getProxyCandidates } = await import("../../open-sse/utils/proxyFallback. test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getProxyCandidates() surfaces user-configured proxies against the real listProxies() {items,total} shape", async () => { diff --git a/tests/unit/proxy-fallback-ssrf.test.ts b/tests/unit/proxy-fallback-ssrf.test.ts index cc90a0fef9..805f620bb9 100644 --- a/tests/unit/proxy-fallback-ssrf.test.ts +++ b/tests/unit/proxy-fallback-ssrf.test.ts @@ -13,7 +13,7 @@ const { isRetryableProxyTarget } = await import("../../src/lib/providers/validat const { isPrivateHost } = await import("../../src/shared/network/outboundUrlGuard.ts"); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** diff --git a/tests/unit/proxy-health-6246.test.ts b/tests/unit/proxy-health-6246.test.ts index 72668761bf..eb40c9d553 100644 --- a/tests/unit/proxy-health-6246.test.ts +++ b/tests/unit/proxy-health-6246.test.ts @@ -41,13 +41,13 @@ function resetStorage() { delete process.env.INITIAL_PASSWORD; delete process.env.PROXY_HEALTH_AUTO_DEACTIVATE; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── status-write policy ─────────────────────────────────────────────────────── diff --git a/tests/unit/proxy-health-egress-line.test.ts b/tests/unit/proxy-health-egress-line.test.ts index bf75be5122..d0afb8709a 100644 --- a/tests/unit/proxy-health-egress-line.test.ts +++ b/tests/unit/proxy-health-egress-line.test.ts @@ -33,13 +33,13 @@ import type { EgressSharingSummary } from "../../src/lib/proxyEgress.ts"; function resetStorage() { core.resetDbInstance(); proxyLogger.clearProxyLogs(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.PROXY_LOG_INCLUDE_IPS; }); diff --git a/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts b/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts index 5b9057cca1..a0c5996271 100644 --- a/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts +++ b/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts @@ -31,13 +31,13 @@ const { forceProxyHealthSweep } = await import("../../src/lib/proxyHealth/schedu function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("forceProxyHealthSweep() actually probes seeded proxies against the real listProxies() {items,total} shape", async () => { diff --git a/tests/unit/proxy-logger-client-ip.test.ts b/tests/unit/proxy-logger-client-ip.test.ts index 6c7829a3e0..2301ceb945 100644 --- a/tests/unit/proxy-logger-client-ip.test.ts +++ b/tests/unit/proxy-logger-client-ip.test.ts @@ -13,7 +13,7 @@ const proxyLogger = await import("../../src/lib/proxyLogger.ts"); function resetStorage() { proxyLogger.clearProxyLogs(); core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } diff --git a/tests/unit/proxy-logs-egress-ip.test.ts b/tests/unit/proxy-logs-egress-ip.test.ts index e3ca2a6331..0ff3c81565 100644 --- a/tests/unit/proxy-logs-egress-ip.test.ts +++ b/tests/unit/proxy-logs-egress-ip.test.ts @@ -20,7 +20,7 @@ const proxyLogger = await import("../../src/lib/proxyLogger.ts"); function resetStorage() { proxyLogger.clearProxyLogs(); core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -30,7 +30,7 @@ test.beforeEach(() => { test.after(() => { core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("fresh install exposes egress_ip and the reconciler is idempotent", async () => { diff --git a/tests/unit/proxy-logs-egress-lookup-10880.test.ts b/tests/unit/proxy-logs-egress-lookup-10880.test.ts index 91f9b99a13..c179bba8b3 100644 --- a/tests/unit/proxy-logs-egress-lookup-10880.test.ts +++ b/tests/unit/proxy-logs-egress-lookup-10880.test.ts @@ -17,14 +17,14 @@ const { getRecentEgressIpForConnection } = await import("../../src/lib/db/proxyL function resetStorage() { proxyLogger.clearProxyLogs(); core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(() => resetStorage()); test.after(() => { core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("returns the LAST known egress IP of the connection in the window", () => { diff --git a/tests/unit/proxy-logs-route.test.ts b/tests/unit/proxy-logs-route.test.ts index 1589e640b1..663015faf4 100644 --- a/tests/unit/proxy-logs-route.test.ts +++ b/tests/unit/proxy-logs-route.test.ts @@ -13,14 +13,14 @@ const proxyLogsRoute = await import("../../src/app/api/usage/proxy-logs/route.ts test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); proxyLogger.clearProxyLogs(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("proxy logger public surface excludes removed stats helper", () => { diff --git a/tests/unit/proxy-management-v1-route.test.ts b/tests/unit/proxy-management-v1-route.test.ts index 9dfdd43aa3..8dca4bc168 100644 --- a/tests/unit/proxy-management-v1-route.test.ts +++ b/tests/unit/proxy-management-v1-route.test.ts @@ -39,7 +39,7 @@ async function withEnv(name, value, fn) { async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -65,7 +65,7 @@ async function withPrepareFailure(match, message, fn) { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 management proxies supports create/list/pagination", async () => { diff --git a/tests/unit/proxy-noauth-provider-6272.test.ts b/tests/unit/proxy-noauth-provider-6272.test.ts index 610caa4214..ec64dd731c 100644 --- a/tests/unit/proxy-noauth-provider-6272.test.ts +++ b/tests/unit/proxy-noauth-provider-6272.test.ts @@ -15,7 +15,7 @@ const { safeResolveProxy } = await import("../../src/sse/handlers/chatHelpers.ts test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) delete process.env.INITIAL_PASSWORD; else process.env.INITIAL_PASSWORD = ORIGINAL_INITIAL_PASSWORD; }); diff --git a/tests/unit/proxy-pool-rotation-6365.test.ts b/tests/unit/proxy-pool-rotation-6365.test.ts index 02c21457a8..6b202c09ea 100644 --- a/tests/unit/proxy-pool-rotation-6365.test.ts +++ b/tests/unit/proxy-pool-rotation-6365.test.ts @@ -31,7 +31,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -60,7 +60,7 @@ async function makeConnection(): Promise { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("round-robin (default for >1) cycles through the whole pool across calls", async () => { diff --git a/tests/unit/proxy-pool-route-6365.test.ts b/tests/unit/proxy-pool-route-6365.test.ts index 0cb2041e0e..eb5fcb03e3 100644 --- a/tests/unit/proxy-pool-route-6365.test.ts +++ b/tests/unit/proxy-pool-route-6365.test.ts @@ -44,7 +44,7 @@ function getRequest(query: Record): Request { async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -64,7 +64,7 @@ async function makeProxy() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("add → list → remove round-trips a scope pool", async () => { diff --git a/tests/unit/proxy-pool-sync-4878.test.ts b/tests/unit/proxy-pool-sync-4878.test.ts index 787a2a0b50..73f707f533 100644 --- a/tests/unit/proxy-pool-sync-4878.test.ts +++ b/tests/unit/proxy-pool-sync-4878.test.ts @@ -21,7 +21,7 @@ const rateLimiter = await import("../../src/shared/utils/rateLimiter.ts"); function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/proxy-registry-route-handlers.test.ts b/tests/unit/proxy-registry-route-handlers.test.ts index b1b66b9c10..a039477fd1 100644 --- a/tests/unit/proxy-registry-route-handlers.test.ts +++ b/tests/unit/proxy-registry-route-handlers.test.ts @@ -24,13 +24,13 @@ const { resolveProxyLookupResponse } = await import( async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("resolveProxyLookupResponse returns null for the list path (no id)", async () => { diff --git a/tests/unit/proxy-registry.test.ts b/tests/unit/proxy-registry.test.ts index ced3796738..990b1be831 100644 --- a/tests/unit/proxy-registry.test.ts +++ b/tests/unit/proxy-registry.test.ts @@ -22,13 +22,13 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("proxy registry blocks delete when proxy is still assigned", async () => { diff --git a/tests/unit/proxy-resolution-status-filter.test.ts b/tests/unit/proxy-resolution-status-filter.test.ts index c2286be251..1675777f0e 100644 --- a/tests/unit/proxy-resolution-status-filter.test.ts +++ b/tests/unit/proxy-resolution-status-filter.test.ts @@ -24,13 +24,13 @@ const proxiesDb = await import("../../src/lib/db/proxies.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("resolution SKIPS an account proxy marked inactive", async () => { diff --git a/tests/unit/proxy-rotation-latency.test.ts b/tests/unit/proxy-rotation-latency.test.ts index e37be50496..298d5370de 100644 --- a/tests/unit/proxy-rotation-latency.test.ts +++ b/tests/unit/proxy-rotation-latency.test.ts @@ -17,7 +17,7 @@ const proxiesDb = await import("../../src/lib/db/proxies.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -48,7 +48,7 @@ function insertLog( test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("latency strategy chooses proxy with lowest average latency within the window", async () => { diff --git a/tests/unit/proxy-subscriptions-route-validation.test.ts b/tests/unit/proxy-subscriptions-route-validation.test.ts index 4b302c7b41..9e04f2a3dd 100644 --- a/tests/unit/proxy-subscriptions-route-validation.test.ts +++ b/tests/unit/proxy-subscriptions-route-validation.test.ts @@ -70,7 +70,7 @@ async function createValidSubscription(name: string) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/proxySubscription.service.test.ts b/tests/unit/proxySubscription.service.test.ts index 442788eb79..6d70ca1ac0 100644 --- a/tests/unit/proxySubscription.service.test.ts +++ b/tests/unit/proxySubscription.service.test.ts @@ -14,7 +14,7 @@ const sub = await import("../../src/lib/proxySubscription/index.ts"); function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ function insertSubscription( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("global subscription binds its pool to the global scope and is resolvable", async () => { diff --git a/tests/unit/puter-provider-removed.test.ts b/tests/unit/puter-provider-removed.test.ts index 86dd593c92..abe80ff1db 100644 --- a/tests/unit/puter-provider-removed.test.ts +++ b/tests/unit/puter-provider-removed.test.ts @@ -21,7 +21,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("puter provider is removed from the chat registry (id and alias)", () => { diff --git a/tests/unit/qiniu-provider.test.ts b/tests/unit/qiniu-provider.test.ts index f98f38623e..438c1b93a4 100644 --- a/tests/unit/qiniu-provider.test.ts +++ b/tests/unit/qiniu-provider.test.ts @@ -61,13 +61,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/qoder-cli.test.ts b/tests/unit/qoder-cli.test.ts index 12fbdce918..c94f0f641e 100644 --- a/tests/unit/qoder-cli.test.ts +++ b/tests/unit/qoder-cli.test.ts @@ -38,7 +38,7 @@ function withStubQoderCli(fn: () => void | Promise) { const restore = () => { if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }; return Promise.resolve().then(fn).finally(restore); } @@ -489,7 +489,7 @@ test("runQoderCli survives qodercli exiting before it reads a large stdin (async } finally { if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -516,7 +516,7 @@ test("runQoderCli preserves multi-byte UTF-8 output (Chinese) via stream setEnco } finally { if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -581,6 +581,6 @@ test("runQoderCli resolves the request against live --list-models and passes the qoderCli.__clearQoderModelNamesCache(); if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/qoder-executor.test.ts b/tests/unit/qoder-executor.test.ts index 9d0fd974cd..f3bcabdd58 100644 --- a/tests/unit/qoder-executor.test.ts +++ b/tests/unit/qoder-executor.test.ts @@ -49,7 +49,7 @@ function withStubQoderCli(fn: () => void | Promise) { const restore = () => { if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }; return Promise.resolve().then(fn).finally(restore); } @@ -425,7 +425,7 @@ test("QoderExecutor: surfaces qodercli stderr when is_error=true with empty resu } finally { if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/qoder-jobtoken-exchange-4683.test.ts b/tests/unit/qoder-jobtoken-exchange-4683.test.ts index b6468e16cf..3ea87f6a6e 100644 --- a/tests/unit/qoder-jobtoken-exchange-4683.test.ts +++ b/tests/unit/qoder-jobtoken-exchange-4683.test.ts @@ -198,7 +198,7 @@ test("validateQoderCliPat validates via qodercli and makes no Cosy/jobToken HTTP globalThis.fetch = originalFetch; if (prevBin === undefined) delete process.env.CLI_QODER_BIN; else process.env.CLI_QODER_BIN = prevBin; - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); __clearQoderJobTokenCache(); } }); diff --git a/tests/unit/quota-cache-hydrate-5015.test.ts b/tests/unit/quota-cache-hydrate-5015.test.ts index e692ceb711..c6ad4114cd 100644 --- a/tests/unit/quota-cache-hydrate-5015.test.ts +++ b/tests/unit/quota-cache-hydrate-5015.test.ts @@ -26,7 +26,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5015 isAccountQuotaExhausted hydrates exhausted state from a persisted snapshot", () => { diff --git a/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts b/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts index e1f1c0cb9b..4b52d4d235 100644 --- a/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts +++ b/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts @@ -27,7 +27,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5923 setQuotaCache writes is_exhausted per-window, not the connection-wide AND aggregate", () => { diff --git a/tests/unit/quota-combo-balancing.test.ts b/tests/unit/quota-combo-balancing.test.ts index f5cd331499..f45e12a3f4 100644 --- a/tests/unit/quota-combo-balancing.test.ts +++ b/tests/unit/quota-combo-balancing.test.ts @@ -85,7 +85,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/quota-combo-cli-providers.test.ts b/tests/unit/quota-combo-cli-providers.test.ts index a7dd90b5e5..00d2c7780d 100644 --- a/tests/unit/quota-combo-cli-providers.test.ts +++ b/tests/unit/quota-combo-cli-providers.test.ts @@ -29,7 +29,7 @@ const { REGISTRY } = await import("../../open-sse/config/providerRegistry.ts"); async function resetStorage() { core.resetDbInstance(); - if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + if (fs.existsSync(TEST_DATA_DIR)) fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const CLI_PROVIDER = "codex"; // absent from PROVIDER_MODELS, present in REGISTRY diff --git a/tests/unit/quota-combo-groups.test.ts b/tests/unit/quota-combo-groups.test.ts index f182fdeb0a..935588f888 100644 --- a/tests/unit/quota-combo-groups.test.ts +++ b/tests/unit/quota-combo-groups.test.ts @@ -42,7 +42,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -63,7 +63,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-combos-sync.test.ts b/tests/unit/quota-combos-sync.test.ts index a0a1b5b502..66894cf120 100644 --- a/tests/unit/quota-combos-sync.test.ts +++ b/tests/unit/quota-combos-sync.test.ts @@ -39,7 +39,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -60,7 +60,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-epsilon-unconfigured-allow.test.ts b/tests/unit/quota-epsilon-unconfigured-allow.test.ts index 1d93c6053e..ba1a8ae80c 100644 --- a/tests/unit/quota-epsilon-unconfigured-allow.test.ts +++ b/tests/unit/quota-epsilon-unconfigured-allow.test.ts @@ -40,7 +40,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/quota-exclusive-catalog-4806.test.ts b/tests/unit/quota-exclusive-catalog-4806.test.ts index 75cd30bcec..a55fc34146 100644 --- a/tests/unit/quota-exclusive-catalog-4806.test.ts +++ b/tests/unit/quota-exclusive-catalog-4806.test.ts @@ -47,7 +47,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -69,7 +69,7 @@ test.beforeEach(async () => { test.after(async () => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#4806 quota-exclusive key lists its qtSd/* virtual models in GET /v1/models", async () => { diff --git a/tests/unit/quota-exclusive-catalog-short-circuit.test.ts b/tests/unit/quota-exclusive-catalog-short-circuit.test.ts index a20cb9ee60..db0c37d8a4 100644 --- a/tests/unit/quota-exclusive-catalog-short-circuit.test.ts +++ b/tests/unit/quota-exclusive-catalog-short-circuit.test.ts @@ -66,7 +66,7 @@ test.after(async () => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/quota-exclusivity-reconcile.test.ts b/tests/unit/quota-exclusivity-reconcile.test.ts index 89ef35e2b3..dbc9409325 100644 --- a/tests/unit/quota-exclusivity-reconcile.test.ts +++ b/tests/unit/quota-exclusivity-reconcile.test.ts @@ -42,7 +42,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -74,7 +74,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-exhaustion-cutoff-opencode.test.ts b/tests/unit/quota-exhaustion-cutoff-opencode.test.ts index d212fc9394..71f7804944 100644 --- a/tests/unit/quota-exhaustion-cutoff-opencode.test.ts +++ b/tests/unit/quota-exhaustion-cutoff-opencode.test.ts @@ -112,7 +112,7 @@ test.after(() => { globalThis.fetch = originalFetch; coreDb.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test.afterEach(() => { diff --git a/tests/unit/quota-group-allocations.test.ts b/tests/unit/quota-group-allocations.test.ts index c8c47d6783..c9b9de0d8a 100644 --- a/tests/unit/quota-group-allocations.test.ts +++ b/tests/unit/quota-group-allocations.test.ts @@ -64,7 +64,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -89,7 +89,7 @@ test.after(async () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any (apiKeysDb as any).resetApiKeyState(); } - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-group-scope.test.ts b/tests/unit/quota-group-scope.test.ts index f5e27630bd..db98db4b7b 100644 --- a/tests/unit/quota-group-scope.test.ts +++ b/tests/unit/quota-group-scope.test.ts @@ -43,7 +43,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -64,7 +64,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-groups-crud.test.ts b/tests/unit/quota-groups-crud.test.ts index 6bbaf313a4..057b39de40 100644 --- a/tests/unit/quota-groups-crud.test.ts +++ b/tests/unit/quota-groups-crud.test.ts @@ -31,7 +31,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── B2.1: createGroup / getGroup / getGroupName ─────────────────────────────── diff --git a/tests/unit/quota-groups-migration.test.ts b/tests/unit/quota-groups-migration.test.ts index 88594c287a..05d05874ea 100644 --- a/tests/unit/quota-groups-migration.test.ts +++ b/tests/unit/quota-groups-migration.test.ts @@ -30,7 +30,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Helper to get a raw DB handle for inspection / seeding. diff --git a/tests/unit/quota-key-resolve.test.ts b/tests/unit/quota-key-resolve.test.ts index 9c6630fd27..707f89ec08 100644 --- a/tests/unit/quota-key-resolve.test.ts +++ b/tests/unit/quota-key-resolve.test.ts @@ -32,7 +32,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/quota-multiprovider.test.ts b/tests/unit/quota-multiprovider.test.ts index d15b0e6a5b..1b15546a1c 100644 --- a/tests/unit/quota-multiprovider.test.ts +++ b/tests/unit/quota-multiprovider.test.ts @@ -113,7 +113,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort cleanup } diff --git a/tests/unit/quota-per-key-model-hotpath.test.ts b/tests/unit/quota-per-key-model-hotpath.test.ts index ca211750f5..d57a7693e0 100644 --- a/tests/unit/quota-per-key-model-hotpath.test.ts +++ b/tests/unit/quota-per-key-model-hotpath.test.ts @@ -55,7 +55,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -76,7 +76,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makePool() { diff --git a/tests/unit/quota-per-key-model.test.ts b/tests/unit/quota-per-key-model.test.ts index 0ce1970382..4f9b5bee12 100644 --- a/tests/unit/quota-per-key-model.test.ts +++ b/tests/unit/quota-per-key-model.test.ts @@ -39,7 +39,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -69,7 +69,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helper: create pool with KEY_A allocation ───────────────────────────── diff --git a/tests/unit/quota-phase2.test.ts b/tests/unit/quota-phase2.test.ts index 64e0600e2a..6600e561f1 100644 --- a/tests/unit/quota-phase2.test.ts +++ b/tests/unit/quota-phase2.test.ts @@ -22,7 +22,7 @@ const { getDbInstance } = coreDb; async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("parseProviderQuotaHeaders: parses OpenAI rate limit headers", () => { diff --git a/tests/unit/quota-plan-resolver.test.ts b/tests/unit/quota-plan-resolver.test.ts index 72401f2022..17d8905e9c 100644 --- a/tests/unit/quota-plan-resolver.test.ts +++ b/tests/unit/quota-plan-resolver.test.ts @@ -26,7 +26,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Scenario 1 ───────────────────────────────────────────────────────────── diff --git a/tests/unit/quota-pool-connections.test.ts b/tests/unit/quota-pool-connections.test.ts index 7f063f112f..c516001865 100644 --- a/tests/unit/quota-pool-connections.test.ts +++ b/tests/unit/quota-pool-connections.test.ts @@ -31,7 +31,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── D1.1: Migration file ──────────────────────────────────────────────────── diff --git a/tests/unit/quota-pool-delete-prune.test.ts b/tests/unit/quota-pool-delete-prune.test.ts index ed08223b0d..8156206f77 100644 --- a/tests/unit/quota-pool-delete-prune.test.ts +++ b/tests/unit/quota-pool-delete-prune.test.ts @@ -35,7 +35,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helper: get allowed_quotas for a key by id from DB ─────────────────────── diff --git a/tests/unit/quota-pool-single-provider.test.ts b/tests/unit/quota-pool-single-provider.test.ts index a2ce296220..d654558d08 100644 --- a/tests/unit/quota-pool-single-provider.test.ts +++ b/tests/unit/quota-pool-single-provider.test.ts @@ -29,7 +29,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: any) { @@ -49,7 +49,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── T3.1: createPool with mixed providers → throws ────────────────────────── diff --git a/tests/unit/quota-pool-update-full.test.ts b/tests/unit/quota-pool-update-full.test.ts index 1497b144b6..5fc51a0bc7 100644 --- a/tests/unit/quota-pool-update-full.test.ts +++ b/tests/unit/quota-pool-update-full.test.ts @@ -37,7 +37,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -58,7 +58,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helper: list only quota-named combos ─────────────────────────────────── diff --git a/tests/unit/quota-redis-store.test.ts b/tests/unit/quota-redis-store.test.ts index 5a5ae936dc..551074c6a9 100644 --- a/tests/unit/quota-redis-store.test.ts +++ b/tests/unit/quota-redis-store.test.ts @@ -34,7 +34,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -56,7 +56,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/quota-scheduler.test.ts b/tests/unit/quota-scheduler.test.ts index d105945a0a..91cd575680 100644 --- a/tests/unit/quota-scheduler.test.ts +++ b/tests/unit/quota-scheduler.test.ts @@ -14,7 +14,7 @@ const { clearProviderQuota, getProviderQuota, recordProviderQuotaUsage } = async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -24,7 +24,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const CONN = "test-conn-quota"; diff --git a/tests/unit/quota-sharing-fixes.test.ts b/tests/unit/quota-sharing-fixes.test.ts index 83743fea83..30b05742b3 100644 --- a/tests/unit/quota-sharing-fixes.test.ts +++ b/tests/unit/quota-sharing-fixes.test.ts @@ -26,7 +26,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -48,7 +48,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/quota-sqlite-store.test.ts b/tests/unit/quota-sqlite-store.test.ts index 3b4ecda926..d1ea939891 100644 --- a/tests/unit/quota-sqlite-store.test.ts +++ b/tests/unit/quota-sqlite-store.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/quota-store-factory.test.ts b/tests/unit/quota-store-factory.test.ts index 111960c100..276dfab0f6 100644 --- a/tests/unit/quota-store-factory.test.ts +++ b/tests/unit/quota-store-factory.test.ts @@ -25,7 +25,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -56,7 +56,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } // Restore env if (origDriver !== undefined) process.env.QUOTA_STORE_DRIVER = origDriver; diff --git a/tests/unit/quota-store-pool-total.test.ts b/tests/unit/quota-store-pool-total.test.ts index a6d44d4611..206cd20fdb 100644 --- a/tests/unit/quota-store-pool-total.test.ts +++ b/tests/unit/quota-store-pool-total.test.ts @@ -23,7 +23,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (err: unknown) { @@ -45,7 +45,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/qwen-settings-route.test.ts b/tests/unit/qwen-settings-route.test.ts index 0b1f2ab619..60f998e92d 100644 --- a/tests/unit/qwen-settings-route.test.ts +++ b/tests/unit/qwen-settings-route.test.ts @@ -38,13 +38,13 @@ const request = async (method: string, body?: unknown): Promise => }); test.beforeEach(async () => { - await fs.rm(TEST_HOME, { recursive: true, force: true }); + await fs.rm(TEST_HOME, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); await fs.mkdir(path.dirname(SETTINGS_PATH), { recursive: true }); }); test.after(async () => { os.homedir = originalHome; - await fs.rm(TEST_HOME, { recursive: true, force: true }); + await fs.rm(TEST_HOME, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalJwtSecret === undefined) delete process.env.JWT_SECRET; else process.env.JWT_SECRET = originalJwtSecret; if (originalWriteFlag === undefined) delete process.env.CLI_ALLOW_CONFIG_WRITES; diff --git a/tests/unit/qwen-web-models-discovery-3931.test.ts b/tests/unit/qwen-web-models-discovery-3931.test.ts index 0a714b65e5..a49ae0adba 100644 --- a/tests/unit/qwen-web-models-discovery-3931.test.ts +++ b/tests/unit/qwen-web-models-discovery-3931.test.ts @@ -27,13 +27,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/radar-api-routes.test.ts b/tests/unit/radar-api-routes.test.ts index ae95272bef..92200d9a77 100644 --- a/tests/unit/radar-api-routes.test.ts +++ b/tests/unit/radar-api-routes.test.ts @@ -85,7 +85,7 @@ function resetStorage() { core.resetDbInstance(); try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } catch { // ignore @@ -563,7 +563,7 @@ test.after(() => { delete process.env.JWT_SECRET; delete process.env.INITIAL_PASSWORD; try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore } diff --git a/tests/unit/radar-db.test.ts b/tests/unit/radar-db.test.ts index 1aaaaa6455..d28608a526 100644 --- a/tests/unit/radar-db.test.ts +++ b/tests/unit/radar-db.test.ts @@ -29,7 +29,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -51,7 +51,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.STORAGE_ENCRYPTION_KEY; }); diff --git a/tests/unit/radar-export.test.mjs b/tests/unit/radar-export.test.mjs index 55e1d424aa..395f4bf57e 100644 --- a/tests/unit/radar-export.test.mjs +++ b/tests/unit/radar-export.test.mjs @@ -35,7 +35,7 @@ function runExport(extraEnv = {}) { }, }); const parsed = JSON.parse(fs.readFileSync(outPath, "utf8")); - fs.rmSync(outDir, { recursive: true, force: true }); + fs.rmSync(outDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return parsed; } diff --git a/tests/unit/radar-inertia.test.ts b/tests/unit/radar-inertia.test.ts index b48b7bbb08..0aec4d2109 100644 --- a/tests/unit/radar-inertia.test.ts +++ b/tests/unit/radar-inertia.test.ts @@ -57,7 +57,7 @@ function resetState() { core.resetDbInstance(); try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } catch { // ignore @@ -236,7 +236,7 @@ test.after(() => { core.resetDbInstance(); delete process.env.RADAR_ENABLED; try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore } diff --git a/tests/unit/radar-intel-db.test.ts b/tests/unit/radar-intel-db.test.ts index d5f80496af..15fb923dd2 100644 --- a/tests/unit/radar-intel-db.test.ts +++ b/tests/unit/radar-intel-db.test.ts @@ -13,14 +13,14 @@ const radar = await import("../../src/lib/db/radar.ts"); function resetStorage(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Intel migration provides a byte-preserving single-row cache", () => { diff --git a/tests/unit/radar-intel-routes.test.ts b/tests/unit/radar-intel-routes.test.ts index 023056e11e..8a96cacc20 100644 --- a/tests/unit/radar-intel-routes.test.ts +++ b/tests/unit/radar-intel-routes.test.ts @@ -30,13 +30,13 @@ function request(pathname: string, method: "GET" | "POST", headers: Record { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.RADAR_ENABLED; }); diff --git a/tests/unit/radar-local-state-db.test.ts b/tests/unit/radar-local-state-db.test.ts index c6e2074d78..a59677513d 100644 --- a/tests/unit/radar-local-state-db.test.ts +++ b/tests/unit/radar-local-state-db.test.ts @@ -27,7 +27,7 @@ const { getRadarCatalog } = await import("../../src/lib/radar/index.ts"); async function resetStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.RADAR_ENABLED; }); diff --git a/tests/unit/radar-local-state-route.test.ts b/tests/unit/radar-local-state-route.test.ts index 08970609bb..a9de6f107f 100644 --- a/tests/unit/radar-local-state-route.test.ts +++ b/tests/unit/radar-local-state-route.test.ts @@ -34,7 +34,7 @@ function request(method: string, body?: unknown, headers: Record async function resetStorage(): Promise { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.DATA_DIR; delete process.env.RADAR_ENABLED; delete process.env.JWT_SECRET; diff --git a/tests/unit/radar-offers-db.test.ts b/tests/unit/radar-offers-db.test.ts index fa93225ffa..b4ee10eb4a 100644 --- a/tests/unit/radar-offers-db.test.ts +++ b/tests/unit/radar-offers-db.test.ts @@ -13,7 +13,7 @@ const radar = await import("../../src/lib/db/radar.ts"); function resetStorage(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -21,7 +21,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.STORAGE_ENCRYPTION_KEY; }); diff --git a/tests/unit/radar-offers-routes.test.ts b/tests/unit/radar-offers-routes.test.ts index 1ff65c20ff..fcfcd3dc00 100644 --- a/tests/unit/radar-offers-routes.test.ts +++ b/tests/unit/radar-offers-routes.test.ts @@ -25,7 +25,7 @@ async function authHeaders(): Promise> { function resetStorage(): void { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -44,7 +44,7 @@ function request( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.RADAR_ENABLED; delete process.env.STORAGE_ENCRYPTION_KEY; }); diff --git a/tests/unit/radar-referrals-route.test.ts b/tests/unit/radar-referrals-route.test.ts index a8c9b71577..44f9690d81 100644 --- a/tests/unit/radar-referrals-route.test.ts +++ b/tests/unit/radar-referrals-route.test.ts @@ -68,7 +68,7 @@ function resetStorage() { core.resetDbInstance(); try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } catch { // ignore diff --git a/tests/unit/radar-supporter-gamification.test.ts b/tests/unit/radar-supporter-gamification.test.ts index a3b1d4b100..a926cd064b 100644 --- a/tests/unit/radar-supporter-gamification.test.ts +++ b/tests/unit/radar-supporter-gamification.test.ts @@ -13,7 +13,7 @@ const { emitGamificationEvent } = await import("../../src/lib/gamification/event test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Radar supporter has a dedicated badge and zero-XP idempotent action", async () => { diff --git a/tests/unit/rate-limit-execution-timeout-message-4165.test.ts b/tests/unit/rate-limit-execution-timeout-message-4165.test.ts index 3cae26ebbd..894cd7a1be 100644 --- a/tests/unit/rate-limit-execution-timeout-message-4165.test.ts +++ b/tests/unit/rate-limit-execution-timeout-message-4165.test.ts @@ -39,7 +39,7 @@ test.afterEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Drive a real Bottleneck execution expiration with a function that outlives it. diff --git a/tests/unit/rate-limit-local-error-classification.test.ts b/tests/unit/rate-limit-local-error-classification.test.ts index f7c140a380..ac34cb308d 100644 --- a/tests/unit/rate-limit-local-error-classification.test.ts +++ b/tests/unit/rate-limit-local-error-classification.test.ts @@ -97,7 +97,7 @@ test.afterEach(() => { providerCooldown.clearCooldownState(); rateLimitSemaphore.resetAll(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -107,7 +107,7 @@ test.after(() => { providerCooldown.clearCooldownState(); rateLimitSemaphore.resetAll(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("execution-timeout classification requires trusted provenance; queue codes classify by string (#9164/#9342)", () => { diff --git a/tests/unit/rate-limit-manager.test.ts b/tests/unit/rate-limit-manager.test.ts index b1d411e62a..da6d29089d 100644 --- a/tests/unit/rate-limit-manager.test.ts +++ b/tests/unit/rate-limit-manager.test.ts @@ -91,7 +91,7 @@ async function flushBackgroundWork() { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -108,7 +108,7 @@ test.after(async () => { await rateLimitManager.__resetRateLimitManagerForTests(); await flushBackgroundWork(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("rate limit manager bypasses disabled connections and exposes inactive status", async () => { diff --git a/tests/unit/rate-limit-queue-timeout-lockout.test.ts b/tests/unit/rate-limit-queue-timeout-lockout.test.ts index 0fb874cc7f..8ebf77ff24 100644 --- a/tests/unit/rate-limit-queue-timeout-lockout.test.ts +++ b/tests/unit/rate-limit-queue-timeout-lockout.test.ts @@ -56,7 +56,7 @@ function errorResponseWithConnectionId(status: number, connectionId: string) { test.afterEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("RATE_LIMIT_QUEUE_TIMEOUT lockout behaves correctly depending on connection ID header", async () => { diff --git a/tests/unit/ratelimit-admission-control-6593.test.ts b/tests/unit/ratelimit-admission-control-6593.test.ts index 04f3dd9fe1..deeb461745 100644 --- a/tests/unit/ratelimit-admission-control-6593.test.ts +++ b/tests/unit/ratelimit-admission-control-6593.test.ts @@ -54,7 +54,7 @@ test.afterEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --- Pure unit tests for the extracted admission check ------------------- diff --git a/tests/unit/reasoning-probe-truncated-response-10281.test.ts b/tests/unit/reasoning-probe-truncated-response-10281.test.ts index b69a452def..286c7caea1 100644 --- a/tests/unit/reasoning-probe-truncated-response-10281.test.ts +++ b/tests/unit/reasoning-probe-truncated-response-10281.test.ts @@ -69,7 +69,7 @@ test.before(() => { test.after(() => { clearModelsDevCapabilities(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10281 isTinyBudgetReasoningProbe detects tiny explicit budgets on reasoning models", () => { diff --git a/tests/unit/reasoning-routing-api.test.ts b/tests/unit/reasoning-routing-api.test.ts index 8a32c62a32..ef47ed55f2 100644 --- a/tests/unit/reasoning-routing-api.test.ts +++ b/tests/unit/reasoning-routing-api.test.ts @@ -37,7 +37,7 @@ type SimulationResponse = { async function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); rulesDb.invalidateReasoningRoutingRuleCache(); } @@ -72,7 +72,7 @@ test.beforeEach(resetStorage); test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("management API CRUD validates and persists reasoning routing rules", async () => { diff --git a/tests/unit/reasoning-routing-decision-guards.test.ts b/tests/unit/reasoning-routing-decision-guards.test.ts index 30766edc94..46430931a1 100644 --- a/tests/unit/reasoning-routing-decision-guards.test.ts +++ b/tests/unit/reasoning-routing-decision-guards.test.ts @@ -26,7 +26,7 @@ const handler = await import("../../src/sse/handlers/reasoningRouting.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function req() { diff --git a/tests/unit/reasoning-routing.test.ts b/tests/unit/reasoning-routing.test.ts index 1fea6b7b05..fc303ccc68 100644 --- a/tests/unit/reasoning-routing.test.ts +++ b/tests/unit/reasoning-routing.test.ts @@ -19,7 +19,7 @@ const schemas = await import("../../src/shared/validation/schemas/reasoningRouti async function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); rulesDb.invalidateReasoningRoutingRuleCache(); } @@ -55,7 +55,7 @@ test.beforeEach(resetStorage); test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("reasoning intent distinguishes missing, discrete effort, toggle, and budget-only signals", () => { diff --git a/tests/unit/reasoning-token-buffer-6274.test.ts b/tests/unit/reasoning-token-buffer-6274.test.ts index 5af15d94e3..533b174253 100644 --- a/tests/unit/reasoning-token-buffer-6274.test.ts +++ b/tests/unit/reasoning-token-buffer-6274.test.ts @@ -78,7 +78,7 @@ test.before(() => { test.after(() => { clearModelsDevCapabilities(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6274 reasoning buffer does not inflate probe-sized max_tokens", () => { diff --git a/tests/unit/reasoning-token-buffer-9507.test.ts b/tests/unit/reasoning-token-buffer-9507.test.ts index bbe686fca7..886fa88de6 100644 --- a/tests/unit/reasoning-token-buffer-9507.test.ts +++ b/tests/unit/reasoning-token-buffer-9507.test.ts @@ -22,7 +22,7 @@ const { resolveReasoningBufferedMaxTokens } = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9507 reasoning buffer does NOT enlarge a Claude opus-5 client budget upward", () => { diff --git a/tests/unit/refresh-cursor-route.test.ts b/tests/unit/refresh-cursor-route.test.ts index 983de76e4a..ab4f65fa95 100644 --- a/tests/unit/refresh-cursor-route.test.ts +++ b/tests/unit/refresh-cursor-route.test.ts @@ -30,7 +30,7 @@ const { POST } = await import("../../src/app/api/providers/[id]/refresh-cursor/r test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function getId(connection: { id?: unknown }): string { @@ -133,7 +133,7 @@ async function withCursorEnv(fn: (env: CursorEnv) => Promise): Promise else delete process.env.USERPROFILE; delete process.env.FAKE_CURSOR_AGENT_LOG; delete process.env.FAKE_CURSOR_AGENT_STATUS_MODE; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }, }; diff --git a/tests/unit/reject-management-password-as-apikey.test.ts b/tests/unit/reject-management-password-as-apikey.test.ts index 2374f4b0c2..3c532092bb 100644 --- a/tests/unit/reject-management-password-as-apikey.test.ts +++ b/tests/unit/reject-management-password-as-apikey.test.ts @@ -31,13 +31,13 @@ async function storeDashboardPassword(plaintext: string) { beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("management password as a provider credential", () => { diff --git a/tests/unit/rejected-request-usage.test.ts b/tests/unit/rejected-request-usage.test.ts index 300e77e013..1783129e3a 100644 --- a/tests/unit/rejected-request-usage.test.ts +++ b/tests/unit/rejected-request-usage.test.ts @@ -29,14 +29,14 @@ const { recordRejectedRequestUsage, summarizeComboAttemptedModels, resolveReject test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); usageHistory.clearPendingRequests(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("gate-rejected request is attributed to the api key in usage_history", async () => { diff --git a/tests/unit/relay-check-rate-limit-existing-token.test.ts b/tests/unit/relay-check-rate-limit-existing-token.test.ts index 2843c15a25..3630b894e1 100644 --- a/tests/unit/relay-check-rate-limit-existing-token.test.ts +++ b/tests/unit/relay-check-rate-limit-existing-token.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Inserts a relay_tokens row directly (bypassing createRelayToken, which uses diff --git a/tests/unit/relay-deploy-5128.test.ts b/tests/unit/relay-deploy-5128.test.ts index 41a30a4f8b..a0cdb69754 100644 --- a/tests/unit/relay-deploy-5128.test.ts +++ b/tests/unit/relay-deploy-5128.test.ts @@ -30,7 +30,7 @@ const proxySchemas = await import("../../src/shared/validation/schemas/proxy.ts" test.after(() => { core.resetDbInstance(); try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } @@ -236,7 +236,7 @@ if (!isPrivateHostname("[fd00::1]")) throw new Error("bracketed IPv6 ULA must st ); } finally { try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts b/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts index 0b950e3f8a..6ee7ff114a 100644 --- a/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts +++ b/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts @@ -35,7 +35,7 @@ before(() => { after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const PROVIDER = "llama-cpp-5086"; diff --git a/tests/unit/repro-10139-claude-thinking-output-cap.test.ts b/tests/unit/repro-10139-claude-thinking-output-cap.test.ts index 26661a518b..ab588e19dd 100644 --- a/tests/unit/repro-10139-claude-thinking-output-cap.test.ts +++ b/tests/unit/repro-10139-claude-thinking-output-cap.test.ts @@ -45,7 +45,7 @@ const THINKING_BUDGET = 131072; // effortBudgetMap.high test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#10139: a provider-scoped-only output cap is invisible without a provider argument", () => { diff --git a/tests/unit/repro-6524.test.ts b/tests/unit/repro-6524.test.ts index d99dcec855..dd56995bdf 100644 --- a/tests/unit/repro-6524.test.ts +++ b/tests/unit/repro-6524.test.ts @@ -70,7 +70,7 @@ test.before(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6524: with only the (wrong) synced catalog data, the buffer no longer inflates (#9507)", () => { diff --git a/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts b/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts index e71da092cc..b680e65ac1 100644 --- a/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts +++ b/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts @@ -37,7 +37,7 @@ const virtualFactory = await import("../../open-sse/services/autoCombo/virtualFa async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/repro-6701-claude-detect-fallback.test.ts b/tests/unit/repro-6701-claude-detect-fallback.test.ts index c17b6e1705..9f326ba8cb 100644 --- a/tests/unit/repro-6701-claude-detect-fallback.test.ts +++ b/tests/unit/repro-6701-claude-detect-fallback.test.ts @@ -55,7 +55,7 @@ describe("#6701 — claude detection should fall back to settings.json when bina }); after(() => { - fs.rmSync(configHome, { recursive: true, force: true }); + fs.rmSync(configHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (prevBin === undefined) delete process.env.CLI_CLAUDE_BIN; else process.env.CLI_CLAUDE_BIN = prevBin; if (prevConfigHome === undefined) delete process.env.CLI_CONFIG_HOME; diff --git a/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts b/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts index 601ea92d58..8da60ea4a4 100644 --- a/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts +++ b/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts @@ -115,7 +115,7 @@ async function resetStorage() { clearIdempotency(); clearInflight(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -127,7 +127,7 @@ test.afterEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6912: chatCore renames max_completion_tokens to max_tokens for volcengine/DeepSeek-V4-Flash", async () => { diff --git a/tests/unit/repro-6952-commentary.test.ts b/tests/unit/repro-6952-commentary.test.ts index 4e622a1065..7e548a300e 100644 --- a/tests/unit/repro-6952-commentary.test.ts +++ b/tests/unit/repro-6952-commentary.test.ts @@ -48,7 +48,7 @@ async function readTransformed(chunks: string[], options: object): Promise { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/repro-6957.test.ts b/tests/unit/repro-6957.test.ts index 696dfada3d..a2d19dcd84 100644 --- a/tests/unit/repro-6957.test.ts +++ b/tests/unit/repro-6957.test.ts @@ -33,7 +33,7 @@ const { getComboBuilderOptions } = await import("../../src/lib/combos/builderOpt test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // A trimmed slice of the reporter's actual payload (issue #6957 comment attachment diff --git a/tests/unit/repro-6975.test.ts b/tests/unit/repro-6975.test.ts index ffe17dfe66..f863bfaa6f 100644 --- a/tests/unit/repro-6975.test.ts +++ b/tests/unit/repro-6975.test.ts @@ -13,7 +13,7 @@ const { getComboBuilderOptions } = await import("../../src/lib/combos/builderOpt test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6975 embeddings-only custom model must appear in the combo builder output", async () => { diff --git a/tests/unit/repro-8065-quota-cache-cross-instance.test.ts b/tests/unit/repro-8065-quota-cache-cross-instance.test.ts index aa1bd7970d..6b76e0f14f 100644 --- a/tests/unit/repro-8065-quota-cache-cross-instance.test.ts +++ b/tests/unit/repro-8065-quota-cache-cross-instance.test.ts @@ -11,7 +11,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8065 a renewed quota written by one module instance is invisible to another module instance's routing read", async () => { diff --git a/tests/unit/repro-8429-capability-canonicalization.test.ts b/tests/unit/repro-8429-capability-canonicalization.test.ts index 5e36bd57be..6b42fda44f 100644 --- a/tests/unit/repro-8429-capability-canonicalization.test.ts +++ b/tests/unit/repro-8429-capability-canonicalization.test.ts @@ -23,14 +23,14 @@ function buildCapability(overrides: Record = {}) { function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.beforeEach(() => { resetStorage(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8429: synced model_capabilities row written under models.dev mapping is unreachable via the canonical 'codex' provider id", () => { diff --git a/tests/unit/repro-8841-context-overflow-opencode.test.ts b/tests/unit/repro-8841-context-overflow-opencode.test.ts index 0dae913167..bd6ff9cea7 100644 --- a/tests/unit/repro-8841-context-overflow-opencode.test.ts +++ b/tests/unit/repro-8841-context-overflow-opencode.test.ts @@ -17,7 +17,7 @@ test.after(() => { core.resetDbInstance(); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const noopLog = { diff --git a/tests/unit/repro-8847.test.ts b/tests/unit/repro-8847.test.ts index 301263d35e..c181c39b6e 100644 --- a/tests/unit/repro-8847.test.ts +++ b/tests/unit/repro-8847.test.ts @@ -66,5 +66,5 @@ test("repro-8847: better-sqlite3 prebuilds are bundled alongside the compiled bi "linux-x64 prebuild must be in the standalone bundle" ); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); \ No newline at end of file diff --git a/tests/unit/repro-8956.test.ts b/tests/unit/repro-8956.test.ts index daf76a4332..982bcc28f8 100644 --- a/tests/unit/repro-8956.test.ts +++ b/tests/unit/repro-8956.test.ts @@ -43,7 +43,7 @@ test("repro-8956: resolveProjectRoot skips synthetic .build/next/package.json (n `PROJECT_ROOT resolved to ${root}, which lacks .git` ); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -60,6 +60,6 @@ test("repro-8956: resolveProjectRoot still finds package.json with a name field" const root = resolveProjectRoot("/fallback", subDir); assert.equal(root, repoRoot); } finally { - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/repro-8995.test.ts b/tests/unit/repro-8995.test.ts index 74dd1b8f59..2543af1de5 100644 --- a/tests/unit/repro-8995.test.ts +++ b/tests/unit/repro-8995.test.ts @@ -15,13 +15,13 @@ const settingsDb = await import("../../src/lib/db/settings.ts"); async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#8995: resolveProxyForConnection surfaces the proxy NAME for an account-level assignment", async () => { diff --git a/tests/unit/repro-9625.test.ts b/tests/unit/repro-9625.test.ts index f6ff2f68cf..9d0141ade1 100644 --- a/tests/unit/repro-9625.test.ts +++ b/tests/unit/repro-9625.test.ts @@ -28,7 +28,7 @@ const { getDbInstance, resetDbInstance } = await import("../../src/lib/db/core.t test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const DAY_MS = 86_400_000; // milliseconds diff --git a/tests/unit/repro-compression-run-telemetry-ms.test.ts b/tests/unit/repro-compression-run-telemetry-ms.test.ts index 143ef0037c..b68a8ddb9d 100644 --- a/tests/unit/repro-compression-run-telemetry-ms.test.ts +++ b/tests/unit/repro-compression-run-telemetry-ms.test.ts @@ -33,7 +33,7 @@ const { getDbInstance, resetDbInstance } = await import("../../src/lib/db/core.t test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const DAY_MS = 86_400_000; diff --git a/tests/unit/request-log-migration.test.ts b/tests/unit/request-log-migration.test.ts index 00178b9fc1..9dcfdd2e50 100644 --- a/tests/unit/request-log-migration.test.ts +++ b/tests/unit/request-log-migration.test.ts @@ -43,7 +43,7 @@ function cleanup() { // Retry with a short delay to let the OS release locks. for (let attempt = 0; attempt < 5; attempt++) { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch { /* retry */ @@ -82,7 +82,7 @@ test("keeps legacy files in place when zip creation fails", async () => { // Remove the archive dir created by the first test, then write a file // at that path so mkdirSync throws EEXIST. This simulates a zip // creation failure. The migration should leave legacy files intact. - fs.rmSync(migrations.LOG_ARCHIVES_DIR, { recursive: true, force: true }); + fs.rmSync(migrations.LOG_ARCHIVES_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.writeFileSync(migrations.LOG_ARCHIVES_DIR, "not-a-directory"); await assert.rejects(() => migrations.archiveLegacyRequestLogs()); diff --git a/tests/unit/request-logger-endpoints.test.ts b/tests/unit/request-logger-endpoints.test.ts index 7d1b41cf7e..66823c927c 100644 --- a/tests/unit/request-logger-endpoints.test.ts +++ b/tests/unit/request-logger-endpoints.test.ts @@ -13,7 +13,7 @@ const callLogs = await import("../../src/lib/usage/callLogs.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Captured stream chunks are prefixed with a per-chunk arrival timestamp diff --git a/tests/unit/require-management-auth-access-token.test.ts b/tests/unit/require-management-auth-access-token.test.ts index 4589bc1184..97f22282df 100644 --- a/tests/unit/require-management-auth-access-token.test.ts +++ b/tests/unit/require-management-auth-access-token.test.ts @@ -31,7 +31,7 @@ test.after(() => { core.resetDbInstance(); } catch {} try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} delete process.env.INITIAL_PASSWORD; delete process.env.OMNIROUTE_INTERNAL_SERVICE_TOKEN; diff --git a/tests/unit/rerank-proxy-pinning-7350.test.ts b/tests/unit/rerank-proxy-pinning-7350.test.ts index 8f87a21932..3852814b75 100644 --- a/tests/unit/rerank-proxy-pinning-7350.test.ts +++ b/tests/unit/rerank-proxy-pinning-7350.test.ts @@ -43,7 +43,7 @@ function stubFetch(seen: { proxyUrl: string | null | undefined }[], gate?: () => test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7350 handleRerank routes the upstream call through the connection's pinned proxy", async () => { diff --git a/tests/unit/rerank-voyage-7809.test.ts b/tests/unit/rerank-voyage-7809.test.ts index 5605f19651..208fad237c 100644 --- a/tests/unit/rerank-voyage-7809.test.ts +++ b/tests/unit/rerank-voyage-7809.test.ts @@ -18,7 +18,7 @@ const { transformRequestForProvider, transformResponseFromProvider } = test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── Registry ────────────────────────────────────────────────────────────── diff --git a/tests/unit/reset-connection-backoff.test.ts b/tests/unit/reset-connection-backoff.test.ts index 0fce46fb03..0f04db6691 100644 --- a/tests/unit/reset-connection-backoff.test.ts +++ b/tests/unit/reset-connection-backoff.test.ts @@ -18,7 +18,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function createBackedOffConnection() { diff --git a/tests/unit/reset-password-cli-6261-6258.test.ts b/tests/unit/reset-password-cli-6261-6258.test.ts index 1f83d58a91..1b73ba6140 100644 --- a/tests/unit/reset-password-cli-6261-6258.test.ts +++ b/tests/unit/reset-password-cli-6261-6258.test.ts @@ -114,8 +114,8 @@ test("omniroute reset-password subcommand applies the reset over piped stdin (#6 "the stored password must verify against the piped value" ); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -143,8 +143,8 @@ test("omniroute-reset-password applies the reset over piped two-line stdin (#625 "the stored password must verify against the piped value" ); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -172,7 +172,7 @@ test("omniroute-reset-password --password-stdin reads the whole stdin as the pas "the stored password must verify against the --password-stdin value" ); } finally { - fs.rmSync(dataDir, { recursive: true, force: true }); - fs.rmSync(home, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/resilience-stream-recovery-feature-flags.test.ts b/tests/unit/resilience-stream-recovery-feature-flags.test.ts index 431c3951f3..3455021e9d 100644 --- a/tests/unit/resilience-stream-recovery-feature-flags.test.ts +++ b/tests/unit/resilience-stream-recovery-feature-flags.test.ts @@ -14,7 +14,7 @@ const { resolveResilienceSettings } = await import("../../src/lib/resilience/set after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("stream recovery feature flags seed resilience defaults", () => { diff --git a/tests/unit/resolve-proxy-family.test.ts b/tests/unit/resolve-proxy-family.test.ts index 6e12f618ad..418fd674f9 100644 --- a/tests/unit/resolve-proxy-family.test.ts +++ b/tests/unit/resolve-proxy-family.test.ts @@ -32,13 +32,13 @@ async function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("account-level registry proxy carries family=ipv6 through resolveProxyForConnection", async () => { diff --git a/tests/unit/responses-case-insensitive-combo-guard.test.ts b/tests/unit/responses-case-insensitive-combo-guard.test.ts index 532e1e1a15..bf2c684db2 100644 --- a/tests/unit/responses-case-insensitive-combo-guard.test.ts +++ b/tests/unit/responses-case-insensitive-combo-guard.test.ts @@ -68,7 +68,7 @@ const sseModelService = await import("../../src/sse/services/model.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("getComboForModel resolves a stored combo by a case-insensitive request name", async () => { diff --git a/tests/unit/responses-commentary-event-frame-6561.test.ts b/tests/unit/responses-commentary-event-frame-6561.test.ts index 99fcfeee7b..8e30a129ea 100644 --- a/tests/unit/responses-commentary-event-frame-6561.test.ts +++ b/tests/unit/responses-commentary-event-frame-6561.test.ts @@ -43,7 +43,7 @@ async function readTransformed(chunks: string[], options: object): Promise { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/responses-commentary-passthrough-6199.test.ts b/tests/unit/responses-commentary-passthrough-6199.test.ts index c1fce80786..0b2b386278 100644 --- a/tests/unit/responses-commentary-passthrough-6199.test.ts +++ b/tests/unit/responses-commentary-passthrough-6199.test.ts @@ -48,7 +48,7 @@ async function readTransformed(chunks: string[], options: object): Promise { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/responses-continuation-store.test.ts b/tests/unit/responses-continuation-store.test.ts index fee45e4290..c4974a41d0 100644 --- a/tests/unit/responses-continuation-store.test.ts +++ b/tests/unit/responses-continuation-store.test.ts @@ -18,7 +18,7 @@ const store = await import("../../src/lib/db/responsesContinuationStore.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function insertCallLog(row: { diff --git a/tests/unit/responses-handler.test.ts b/tests/unit/responses-handler.test.ts index 3b4d4b7cde..4be34fbf02 100644 --- a/tests/unit/responses-handler.test.ts +++ b/tests/unit/responses-handler.test.ts @@ -130,7 +130,7 @@ function buildJsonResponse(status: number, payload: unknown) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -185,7 +185,7 @@ test.afterEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("handleResponsesCore converts Responses API input, instructions, tools, metadata, and forces streaming", async () => { diff --git a/tests/unit/responses-parse-once-4041.test.ts b/tests/unit/responses-parse-once-4041.test.ts index e47124013c..27d41046cc 100644 --- a/tests/unit/responses-parse-once-4041.test.ts +++ b/tests/unit/responses-parse-once-4041.test.ts @@ -6,7 +6,7 @@ import path from "node:path"; const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-responses-parse-once-")); process.env.DATA_DIR = dataDir; -after(() => fs.rmSync(dataDir, { recursive: true, force: true })); +after(() => fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); // #4041: AI routes must parse each JSON body at most once and thread the parsed value // through model resolution and handleChat. /v1/responses now parses after raw-body admission; diff --git a/tests/unit/responses-route-early-keepalive-wiring.test.ts b/tests/unit/responses-route-early-keepalive-wiring.test.ts index 5b510d5c34..25be2970bb 100644 --- a/tests/unit/responses-route-early-keepalive-wiring.test.ts +++ b/tests/unit/responses-route-early-keepalive-wiring.test.ts @@ -8,7 +8,7 @@ const routeSource = fs.readFileSync("src/app/api/v1/responses/route.ts", "utf8") const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-responses-route-test-")); process.env.DATA_DIR = dataDir; process.env.REQUIRE_API_KEY = "false"; -after(() => fs.rmSync(dataDir, { recursive: true, force: true })); +after(() => fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); test("Responses route wires dual-cadence neutral keepalives", () => { assert.match( diff --git a/tests/unit/responses-transformer.test.ts b/tests/unit/responses-transformer.test.ts index f8b1c5a0b1..00b2c4eec9 100644 --- a/tests/unit/responses-transformer.test.ts +++ b/tests/unit/responses-transformer.test.ts @@ -404,7 +404,7 @@ test("createResponsesLogger returns null for invalid base paths and swallows flu logger.logOutput("output"); const sessionDir = readdirSync(join(logsDir, "logs"))[0]; - rmSync(join(logsDir, "logs", sessionDir), { recursive: true, force: true }); + rmSync(join(logsDir, "logs", sessionDir), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); console.log = (...args) => capturedLogs.push(args.join(" ")); try { diff --git a/tests/unit/review-reviews-v3814-fixes.test.ts b/tests/unit/review-reviews-v3814-fixes.test.ts index 7e64496349..00ac18ce57 100644 --- a/tests/unit/review-reviews-v3814-fixes.test.ts +++ b/tests/unit/review-reviews-v3814-fixes.test.ts @@ -20,13 +20,13 @@ const { REGISTRY } = await import("../../open-sse/config/providerRegistry.ts"); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── LEDGER-1: updateProviderNode must preserve custom headers on partial update ── diff --git a/tests/unit/route-edge-coverage.test.ts b/tests/unit/route-edge-coverage.test.ts index 3788227f08..80ab12de02 100644 --- a/tests/unit/route-edge-coverage.test.ts +++ b/tests/unit/route-edge-coverage.test.ts @@ -37,7 +37,7 @@ async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -135,7 +135,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("api keys route covers auth, create, masking, pagination fallback and cloud sync", async () => { diff --git a/tests/unit/route-explainability.test.ts b/tests/unit/route-explainability.test.ts index b624cf9447..7650905584 100644 --- a/tests/unit/route-explainability.test.ts +++ b/tests/unit/route-explainability.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { clearAllModelLockouts(); resetAllCircuitBreakers(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("route explainability builds a direct-route explanation from call logs", async () => { diff --git a/tests/unit/router-eval-check.test.ts b/tests/unit/router-eval-check.test.ts index 51ae202d03..025c8761cb 100644 --- a/tests/unit/router-eval-check.test.ts +++ b/tests/unit/router-eval-check.test.ts @@ -104,7 +104,7 @@ test("router eval check writes artifacts and passes non-regressing corpora", () const artifact = JSON.parse(readFileSync(json, "utf8")) as Record; assert.equal(artifact.kind, "router-eval-comparison"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -201,7 +201,7 @@ test("router eval check can include patch compare as a retained gate", () => { assert.equal(manifest.outputs?.patchJson, "patch-comparison.json"); assert.equal(manifest.thresholds?.patch?.maxLatencyIncrease, 0.05); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -288,7 +288,7 @@ test("router eval check fails when patch gate regresses beyond thresholds", () = }; assert.equal(manifest.result?.status, 1); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -378,7 +378,7 @@ test("router eval check rejects unpaired patch inputs", () => { assert.equal(candidateOnly.status, 2); assert.match(candidateOnly.stderr ?? "", /baseline-patch and --candidate-patch/); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -479,6 +479,6 @@ test("router eval check can retain artifacts for trend summaries", () => { assert.ok((trendResult.stdout ?? "").includes(runId)); assert.ok((trendResult.stdout ?? "").includes("| jsonl | all |")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-cli.test.ts b/tests/unit/router-eval-cli.test.ts index 8e44a7fe59..9f2902d4a9 100644 --- a/tests/unit/router-eval-cli.test.ts +++ b/tests/unit/router-eval-cli.test.ts @@ -25,7 +25,7 @@ const scriptPath = "scripts/router-eval/index.ts"; // DATA_DIR — the exact resolution the guard message prescribes — instead of loosening // the assertions. const cliDataDir = mkdtempSync(join(tmpdir(), "router-eval-cli-datadir-")); -after(() => rmSync(cliDataDir, { recursive: true, force: true })); +after(() => rmSync(cliDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); function runCli(args: string[]) { return spawnSync(process.execPath, ["--import", "tsx", scriptPath, ...args], { @@ -68,7 +68,7 @@ test("router-eval CLI prints a markdown report for JSONL input", () => { assert.ok((result.stdout ?? "").includes("Frontier")); assert.ok((result.stdout ?? "").includes("AIQ")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -123,7 +123,7 @@ test("router-eval CLI exits non-zero when regression threshold is exceeded", () assert.ok((result.stdout ?? "").includes("Router Eval Comparison")); assert.ok((result.stdout ?? "").includes("Regressions")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -156,7 +156,7 @@ test("router-eval CLI writes machine-readable JSON artifacts", () => { path: inputPath, }); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -242,7 +242,7 @@ test("router-eval CLI reads usage_history DB source", () => { "string" ); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -285,6 +285,6 @@ test("router-eval CLI defaults --db to call_logs when available", () => { assert.ok((result.stdout ?? "").includes("Router Eval Report")); assert.ok((result.stdout ?? "").includes("priority")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-compare.test.ts b/tests/unit/router-eval-compare.test.ts index 5eef0c2edb..a417e3a863 100644 --- a/tests/unit/router-eval-compare.test.ts +++ b/tests/unit/router-eval-compare.test.ts @@ -78,6 +78,6 @@ test("router eval compare retains named comparison artifacts", () => { assert.equal(comparison.baselineName, "policy-a"); assert.equal(comparison.candidateName, "policy-b"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-e2e-chain.test.ts b/tests/unit/router-eval-e2e-chain.test.ts index aea92f6df0..95b5acf929 100644 --- a/tests/unit/router-eval-e2e-chain.test.ts +++ b/tests/unit/router-eval-e2e-chain.test.ts @@ -130,6 +130,6 @@ test("router eval retained chain runs search patches through the check wrapper g assert.equal(manifest.result?.status, 0); assert.equal(manifest.outputs?.patchJson, "patch-comparison.json"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-patch-compare.test.ts b/tests/unit/router-eval-patch-compare.test.ts index 87db7d65ac..382e35af6c 100644 --- a/tests/unit/router-eval-patch-compare.test.ts +++ b/tests/unit/router-eval-patch-compare.test.ts @@ -110,7 +110,7 @@ test("router config patch compare reports recommendation and metric deltas", () ) ); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -178,7 +178,7 @@ test("router config patch compare only fails threshold regressions when requeste assert.equal(failing.status, 1); assert.ok((failing.stdout ?? "").includes("Passed: no")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -223,7 +223,7 @@ test("router config patch compare reports unchanged recommendations without fail assert.equal(comparison.result?.passed, true); assert.equal(comparison.result?.status, 0); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -256,7 +256,7 @@ test("router config patch compare rejects invalid patch inputs", () => { assert.match(result.stderr ?? "", /invalid patch kind/); assert.match(result.stderr ?? "", /router-config-suggestion/); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -307,6 +307,6 @@ test("router config patch compare rejects malformed JSON and invalid evidence", assert.equal(invalidEvidenceResult.status, 2); assert.match(invalidEvidenceResult.stderr ?? "", /invalid numeric evidence field aiq/); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-search.test.ts b/tests/unit/router-eval-search.test.ts index 7e6b40507e..87641b11a2 100644 --- a/tests/unit/router-eval-search.test.ts +++ b/tests/unit/router-eval-search.test.ts @@ -135,7 +135,7 @@ test("router eval search ranks candidates and writes retained summary artifacts" ) ); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -197,7 +197,7 @@ test("router eval search objective modes can choose different candidates", () => assert.equal(qualitySuggestion.objective, "quality"); assert.equal(qualitySuggestion.recommendedConfigId, "cheap"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -253,6 +253,6 @@ test("router eval search cost objective can select a non-AIQ-top config inside a assert.equal(suggestion.recommendedConfigId, "cost-top"); assert.equal(patch.operations?.[0]?.value, "cost-top"); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/router-eval-trends.test.ts b/tests/unit/router-eval-trends.test.ts index 989e594f13..7ca4a9bab3 100644 --- a/tests/unit/router-eval-trends.test.ts +++ b/tests/unit/router-eval-trends.test.ts @@ -73,7 +73,7 @@ test("router eval trends reads retained and flat artifacts with limit", () => { assert.ok((result.stdout ?? "").includes("run-b")); assert.ok((result.stdout ?? "").includes("flat")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -107,7 +107,7 @@ test("router eval trends can print dashboard summaries", () => { assert.ok((result.stdout ?? "").includes("AIQ: 90.000 (+10.000)")); assert.ok((result.stdout ?? "").includes("Rolling Averages")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -123,6 +123,6 @@ test("router eval trends exits clearly for empty artifact dirs", () => { assert.equal(result.status, 2); assert.ok((result.stderr ?? "").includes("No router-eval artifacts found")); } finally { - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/rule12-error-sanitization-sweep.test.ts b/tests/unit/rule12-error-sanitization-sweep.test.ts index 400bb68b9b..5790e1b5f2 100644 --- a/tests/unit/rule12-error-sanitization-sweep.test.ts +++ b/tests/unit/rule12-error-sanitization-sweep.test.ts @@ -99,7 +99,7 @@ function assertSanitized(raw: string, context: string): void { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/run-next-playwright.test.ts b/tests/unit/run-next-playwright.test.ts index 61d166d380..cca0a66c4a 100644 --- a/tests/unit/run-next-playwright.test.ts +++ b/tests/unit/run-next-playwright.test.ts @@ -124,5 +124,5 @@ test("standalone asset helpers detect and rehydrate missing standalone static as ); assert.match(logs[0] || "", /Rehydrated standalone static\/public assets/); - fs.rmSync(tempRoot, { recursive: true, force: true }); + fs.rmSync(tempRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/runner-janitor.test.ts b/tests/unit/runner-janitor.test.ts index 9519414fbc..6e6aee107a 100644 --- a/tests/unit/runner-janitor.test.ts +++ b/tests/unit/runner-janitor.test.ts @@ -98,7 +98,7 @@ describe("runner-janitor.sh", () => { assert.ok(existsSync(p), `must not delete ${p} when idleness cannot be proven`); } } finally { - rmSync(f.base, { recursive: true, force: true }); + rmSync(f.base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -130,7 +130,7 @@ describe("runner-janitor.sh", () => { assert.match(r.stdout, /zombie builds: 0/); assert.match(r.stdout, /done status=0/); } finally { - rmSync(f.base, { recursive: true, force: true }); + rmSync(f.base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -146,7 +146,7 @@ describe("runner-janitor.sh", () => { assert.ok(existsSync(f.fresh), "a fresh dir must survive"); assert.ok(existsSync(f.unrelated), "files we did not create must survive even when old"); } finally { - rmSync(f.base, { recursive: true, force: true }); + rmSync(f.base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -164,7 +164,7 @@ describe("runner-janitor.sh", () => { assert.match(body, /TMPFS_MAX_AGE_HOURS:-3\}/, "tmpfs default must stay short — it is RAM"); assert.match(body, /WORK_TEMP_MAX_AGE_HOURS:-24\}/); } finally { - rmSync(f.base, { recursive: true, force: true }); + rmSync(f.base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -185,7 +185,7 @@ describe("runner-janitor.sh", () => { assert.match(r.stdout, /ROOT DISK \d+% >= 0%/); assert.ok(existsSync(f.staleTar), "alerting never deletes"); } finally { - rmSync(f.base, { recursive: true, force: true }); + rmSync(f.base, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/runtime-deps-save-exact-no-prune.test.ts b/tests/unit/runtime-deps-save-exact-no-prune.test.ts index 5cc5f9bd44..2389861edb 100644 --- a/tests/unit/runtime-deps-save-exact-no-prune.test.ts +++ b/tests/unit/runtime-deps-save-exact-no-prune.test.ts @@ -45,7 +45,7 @@ function teardown(): void { if (v === undefined) delete process.env[k]; else process.env[k] = v; } - if (tmpDir) rmSync(tmpDir, { recursive: true, force: true }); + if (tmpDir) rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } function installLineFor(pkgPrefix: string): string | undefined { diff --git a/tests/unit/runtime/magicBytes.test.ts b/tests/unit/runtime/magicBytes.test.ts index 3680ae295c..451250a91c 100644 --- a/tests/unit/runtime/magicBytes.test.ts +++ b/tests/unit/runtime/magicBytes.test.ts @@ -59,4 +59,4 @@ test("platformBinaryLabel matches process.platform", () => { assert.equal(platformBinaryLabel(), expected); }); -test.after(() => rmSync(dir, { recursive: true, force: true })); +test.after(() => rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); diff --git a/tests/unit/sanitizer-residual-policy.test.ts b/tests/unit/sanitizer-residual-policy.test.ts index 4032dc123d..5fd64c44fa 100644 --- a/tests/unit/sanitizer-residual-policy.test.ts +++ b/tests/unit/sanitizer-residual-policy.test.ts @@ -23,7 +23,7 @@ const { resetDbInstance } = await import("../../src/lib/db/core.ts"); test.after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function withEnv( diff --git a/tests/unit/search-provider-opaque-400-10849.test.ts b/tests/unit/search-provider-opaque-400-10849.test.ts index 431675f3bb..643a758c12 100644 --- a/tests/unit/search-provider-opaque-400-10849.test.ts +++ b/tests/unit/search-provider-opaque-400-10849.test.ts @@ -12,7 +12,7 @@ const searchRoute = await import("../../src/app/api/v1/search/route.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makeRequest(body: unknown) { diff --git a/tests/unit/search-route.test.ts b/tests/unit/search-route.test.ts index bdcfde1892..2926b3100c 100644 --- a/tests/unit/search-route.test.ts +++ b/tests/unit/search-route.test.ts @@ -13,7 +13,7 @@ const searchRoute = await import("../../src/app/api/v1/search/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -42,7 +42,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1 search GET lists all search providers", async () => { diff --git a/tests/unit/security-s1-s2-s4.test.ts b/tests/unit/security-s1-s2-s4.test.ts index 74dc6152af..80d7ae7836 100644 --- a/tests/unit/security-s1-s2-s4.test.ts +++ b/tests/unit/security-s1-s2-s4.test.ts @@ -188,7 +188,7 @@ describe("S1 — login rate-limit key uses anti-spoofed peer IP", () => { }); after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (JWT_SAVED !== undefined) { process.env.JWT_SECRET = JWT_SAVED; } else { diff --git a/tests/unit/serial/combo-health-autopilot.test.ts b/tests/unit/serial/combo-health-autopilot.test.ts index 091930283b..63e7f1bd85 100644 --- a/tests/unit/serial/combo-health-autopilot.test.ts +++ b/tests/unit/serial/combo-health-autopilot.test.ts @@ -26,7 +26,7 @@ const { normalizeComboStep } = await import("../../../src/lib/combos/steps.ts"); async function resetStorage() { comboMetrics.resetAllComboMetrics(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -101,7 +101,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts b/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts index 20ab6fe40c..7e65ac39e8 100644 --- a/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts +++ b/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts @@ -89,7 +89,7 @@ function comboOf(strategy: string) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -102,7 +102,7 @@ test.after(async () => { clearAllModelLockouts(); try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts b/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts index f813779c78..1cdf342ba6 100644 --- a/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts +++ b/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts @@ -61,7 +61,7 @@ async function cleanupTestDataDir() { for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); return; } catch (error: unknown) { lastError = error; diff --git a/tests/unit/serial/provider-health-autopilot.test.ts b/tests/unit/serial/provider-health-autopilot.test.ts index 67e0b22909..964a941ea7 100644 --- a/tests/unit/serial/provider-health-autopilot.test.ts +++ b/tests/unit/serial/provider-health-autopilot.test.ts @@ -28,7 +28,7 @@ const PROVIDER = "autopilot-test-provider"; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -70,7 +70,7 @@ test.beforeEach(async () => { test.after(async () => { accountFallback.clearProviderFailure(PROVIDER); await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; diff --git a/tests/unit/serial/quota-division-blocks.test.ts b/tests/unit/serial/quota-division-blocks.test.ts index 3119f66619..f63a6d8461 100644 --- a/tests/unit/serial/quota-division-blocks.test.ts +++ b/tests/unit/serial/quota-division-blocks.test.ts @@ -52,7 +52,7 @@ const core = await import("../../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); } catch { /* ignore */ } + try { fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } } }); diff --git a/tests/unit/services-branch-hardening.test.ts b/tests/unit/services-branch-hardening.test.ts index ca51606acb..8a04fe2faa 100644 --- a/tests/unit/services-branch-hardening.test.ts +++ b/tests/unit/services-branch-hardening.test.ts @@ -19,7 +19,7 @@ test.after(() => { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // Best effort cleanup } diff --git a/tests/unit/services/ServiceSupervisor.test.ts b/tests/unit/services/ServiceSupervisor.test.ts index 5a5441c53a..c343689a0c 100644 --- a/tests/unit/services/ServiceSupervisor.test.ts +++ b/tests/unit/services/ServiceSupervisor.test.ts @@ -77,7 +77,7 @@ function tickConfig(tool: string, port: number) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("start spawns process and captures logs in ring buffer", async () => { diff --git a/tests/unit/services/emergency-fallback.test.ts b/tests/unit/services/emergency-fallback.test.ts index bf6c39603b..e6a375b3a5 100644 --- a/tests/unit/services/emergency-fallback.test.ts +++ b/tests/unit/services/emergency-fallback.test.ts @@ -31,7 +31,7 @@ function restoreEnv(name: string, value: string | undefined) { function resetTestState() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); delete process.env.OMNIROUTE_EMERGENCY_FALLBACK; resetEmergencyFallbackEnvCache(); @@ -50,7 +50,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); restoreEnv("DATA_DIR", previousDataDir); restoreEnv("DISABLE_SQLITE_AUTO_BACKUP", previousDisableSqliteAutoBackup); }); diff --git a/tests/unit/services/end-to-end-shape.test.ts b/tests/unit/services/end-to-end-shape.test.ts index 2e27739869..f03f7ef1c4 100644 --- a/tests/unit/services/end-to-end-shape.test.ts +++ b/tests/unit/services/end-to-end-shape.test.ts @@ -549,5 +549,5 @@ describe("Cross-service shape consistency", () => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/services/installers/bifrost-transport-version-format.test.ts b/tests/unit/services/installers/bifrost-transport-version-format.test.ts index 480ad934bd..6fb786e6da 100644 --- a/tests/unit/services/installers/bifrost-transport-version-format.test.ts +++ b/tests/unit/services/installers/bifrost-transport-version-format.test.ts @@ -86,8 +86,8 @@ describe("resolveSpawnArgs BIFROST_TRANSPORT_VERSION (real filesystem)", () => { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } process.env.PATH = ORIGINAL_PATH; - fs.rmSync(dataDir, { recursive: true, force: true }); - fs.rmSync(fakeBinDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(fakeBinDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); it("BIFROST_TRANSPORT_VERSION is v-prefixed, matching what bin.js requires", async () => { diff --git a/tests/unit/services/installers/bifrost.test.ts b/tests/unit/services/installers/bifrost.test.ts index f59541a436..e91918d587 100644 --- a/tests/unit/services/installers/bifrost.test.ts +++ b/tests/unit/services/installers/bifrost.test.ts @@ -64,8 +64,8 @@ const { test.after(() => { process.env.PATH = originalPath; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); - fs.rmSync(FAKE_BIN_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(FAKE_BIN_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("BIFROST_DEFAULT_PORT is 8080", () => { diff --git a/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts b/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts index 98408a999d..cb5d5d183a 100644 --- a/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts +++ b/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts @@ -39,14 +39,14 @@ after(() => { } else { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } - fs.rmSync(FIXED_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(FIXED_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("resolveSpawnArgs (#6877 — real filesystem)", () => { const dataDir = FIXED_DATA_DIR; beforeEach(() => { - fs.rmSync(dataDir, { recursive: true, force: true }); + fs.rmSync(dataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(dataDir, { recursive: true }); }); diff --git a/tests/unit/services/installers/ninerouter.test.ts b/tests/unit/services/installers/ninerouter.test.ts index 4554e34d3e..870dbe1846 100644 --- a/tests/unit/services/installers/ninerouter.test.ts +++ b/tests/unit/services/installers/ninerouter.test.ts @@ -72,8 +72,8 @@ const { test.after(() => { process.env.PATH = originalPath; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); - fs.rmSync(FAKE_BIN_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(FAKE_BIN_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("install creates package.json structure", async () => { diff --git a/tests/unit/services/lifecycle.test.ts b/tests/unit/services/lifecycle.test.ts index 28a6033834..95de97e39f 100644 --- a/tests/unit/services/lifecycle.test.ts +++ b/tests/unit/services/lifecycle.test.ts @@ -56,7 +56,7 @@ function makeFakeSup(tool: string) { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── status endpoint ──────────────────────────────────────────────────────── diff --git a/tests/unit/services/modelSync.test.ts b/tests/unit/services/modelSync.test.ts index f720a61d8c..fe60ebc5ce 100644 --- a/tests/unit/services/modelSync.test.ts +++ b/tests/unit/services/modelSync.test.ts @@ -30,7 +30,7 @@ afterEach(() => { after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function makeFetch( diff --git a/tests/unit/services/portProbePid.test.ts b/tests/unit/services/portProbePid.test.ts index b9df600eac..c106b1d6a9 100644 --- a/tests/unit/services/portProbePid.test.ts +++ b/tests/unit/services/portProbePid.test.ts @@ -166,6 +166,6 @@ test("resolvePortPid still resolves a pid on a host without lsof", async (t) => } finally { process.env.PATH = originalPath; await new Promise((resolve) => server.close(() => resolve())); - rmSync(shim, { recursive: true, force: true }); + rmSync(shim, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/services/ringBuffer.test.ts b/tests/unit/services/ringBuffer.test.ts index bf55f9cc0a..f62b2073a7 100644 --- a/tests/unit/services/ringBuffer.test.ts +++ b/tests/unit/services/ringBuffer.test.ts @@ -77,7 +77,7 @@ test("flush writes to file when path set", async () => { assert.ok(content.includes("line-one"), "flush file should contain log entry"); assert.ok(content.includes("[stderr]"), "flush file should contain stderr entry"); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/services/serviceSupervisorSpawnError.test.ts b/tests/unit/services/serviceSupervisorSpawnError.test.ts index 87b1f6cb9e..2adbea4304 100644 --- a/tests/unit/services/serviceSupervisorSpawnError.test.ts +++ b/tests/unit/services/serviceSupervisorSpawnError.test.ts @@ -74,7 +74,7 @@ describe("ServiceSupervisor spawn-failure handling", () => { /ENOENT|EACCES|EINVAL|EFTYPE|not recognized|spawn|%1|Win32/i ); } finally { - await rm(dir, { recursive: true, force: true }); + await rm(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/session-affinity-combo-timeout-eviction.test.ts b/tests/unit/session-affinity-combo-timeout-eviction.test.ts index 9dfb36f260..8475588b38 100644 --- a/tests/unit/session-affinity-combo-timeout-eviction.test.ts +++ b/tests/unit/session-affinity-combo-timeout-eviction.test.ts @@ -44,13 +44,13 @@ const timedOutSignal = () => abortedWith(new Error(abortReasons.COMBO_PER_MODEL_ test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("evicts the pin when the combo per-model timeout abandons the pinned account", () => { diff --git a/tests/unit/session-affinity-generic-7274.test.ts b/tests/unit/session-affinity-generic-7274.test.ts index 3700e3ad61..c12802e610 100644 --- a/tests/unit/session-affinity-generic-7274.test.ts +++ b/tests/unit/session-affinity-generic-7274.test.ts @@ -68,7 +68,7 @@ const { DefaultExecutor } = await import("../../open-sse/executors/default.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -91,7 +91,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── 1. generic (non-Codex) provider now honors the TTL ────────────────────── diff --git a/tests/unit/session-leases-route.test.ts b/tests/unit/session-leases-route.test.ts index f2c7492f3b..4b3f4d7713 100644 --- a/tests/unit/session-leases-route.test.ts +++ b/tests/unit/session-leases-route.test.ts @@ -64,7 +64,7 @@ async function seedKey( async function resetStorage(): Promise { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); attemptedExternalCalls = 0; } @@ -80,7 +80,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("requires authentication, managed scope, and canonical explicit owner", async () => { diff --git a/tests/unit/settings-api.test.ts b/tests/unit/settings-api.test.ts index 8ff0dd80a1..9f359e5e61 100644 --- a/tests/unit/settings-api.test.ts +++ b/tests/unit/settings-api.test.ts @@ -20,13 +20,13 @@ async function createSettingsApiHarness() { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(testDataDir, { recursive: true }); } function cleanup() { core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } return { diff --git a/tests/unit/settings-cas-7784.test.ts b/tests/unit/settings-cas-7784.test.ts index 5c20291514..76adcb2424 100644 --- a/tests/unit/settings-cas-7784.test.ts +++ b/tests/unit/settings-cas-7784.test.ts @@ -22,13 +22,13 @@ const settingsRoute = await import("../../src/app/api/settings/route.ts"); beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); describe("#7784 settings optimistic concurrency", () => { diff --git a/tests/unit/settings-debugmode-default.test.ts b/tests/unit/settings-debugmode-default.test.ts index bd667dc120..2ded41c5a8 100644 --- a/tests/unit/settings-debugmode-default.test.ts +++ b/tests/unit/settings-debugmode-default.test.ts @@ -22,5 +22,5 @@ test("logToolSources defaults to false", async () => { }); test.after(() => { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); diff --git a/tests/unit/settings-route-password.test.ts b/tests/unit/settings-route-password.test.ts index 32f967f2ce..6599d70fe0 100644 --- a/tests/unit/settings-route-password.test.ts +++ b/tests/unit/settings-route-password.test.ts @@ -17,7 +17,7 @@ const managementPassword = await import("../../src/lib/auth/managementPassword.t async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } @@ -28,7 +28,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_INITIAL_PASSWORD === undefined) { delete process.env.INITIAL_PASSWORD; } else { diff --git a/tests/unit/shared/structuredLogger-raw-write-guard.test.ts b/tests/unit/shared/structuredLogger-raw-write-guard.test.ts index f0cf34997b..6bfbc1a19a 100644 --- a/tests/unit/shared/structuredLogger-raw-write-guard.test.ts +++ b/tests/unit/shared/structuredLogger-raw-write-guard.test.ts @@ -89,7 +89,7 @@ test("error() with a destroyed stderr does not crash, and still writes to the lo "fatal() must still reach writeToFile after the stderr write is skipped" ); - rmSync(dir, { recursive: true, force: true }); + rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Guard against collateral damage: #1006's suppression policy must be untouched by this change. diff --git a/tests/unit/siliconflow-model-sync.test.ts b/tests/unit/siliconflow-model-sync.test.ts index 8b9835c944..4daa52e29e 100644 --- a/tests/unit/siliconflow-model-sync.test.ts +++ b/tests/unit/siliconflow-model-sync.test.ts @@ -21,7 +21,7 @@ type JsonBody = Record; async function resetStorage() { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(async () => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("sync-models rejects local catalog fallback and preserves existing SiliconFlow models", async () => { diff --git a/tests/unit/skills-builtins-sandbox.test.ts b/tests/unit/skills-builtins-sandbox.test.ts index a696d3bf7a..178ca6d91c 100644 --- a/tests/unit/skills-builtins-sandbox.test.ts +++ b/tests/unit/skills-builtins-sandbox.test.ts @@ -17,7 +17,7 @@ function makeTempDir(prefix) { } function removePath(targetPath) { - fs.rmSync(targetPath, { recursive: true, force: true }); + fs.rmSync(targetPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } async function importFresh(modulePath) { diff --git a/tests/unit/skills-collect-routes.test.ts b/tests/unit/skills-collect-routes.test.ts index 9657937a84..ae61322183 100644 --- a/tests/unit/skills-collect-routes.test.ts +++ b/tests/unit/skills-collect-routes.test.ts @@ -56,7 +56,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Helpers ─────────────────────────────────────────────────────────────────── @@ -64,7 +64,7 @@ test.after(() => { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); delete process.env.INITIAL_PASSWORD; } diff --git a/tests/unit/skills-executor.test.ts b/tests/unit/skills-executor.test.ts index 4acbaaae9e..99975c06b1 100644 --- a/tests/unit/skills-executor.test.ts +++ b/tests/unit/skills-executor.test.ts @@ -23,7 +23,7 @@ function resetSkillsRuntime() { async function resetStorage() { resetSkillsRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -47,7 +47,7 @@ test.beforeEach(async () => { test.after(() => { resetSkillsRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("skillExecutor executes a registered handler and persists execution history", async () => { diff --git a/tests/unit/skills-injection.test.ts b/tests/unit/skills-injection.test.ts index efbca1823c..0b602a169e 100644 --- a/tests/unit/skills-injection.test.ts +++ b/tests/unit/skills-injection.test.ts @@ -28,7 +28,7 @@ function resetRegistryState() { async function resetStorage() { resetRegistryState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -60,7 +60,7 @@ test.beforeEach(async () => { test.after(() => { resetRegistryState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("injectSkills renders enabled tools in provider-specific shapes", async () => { diff --git a/tests/unit/skills-interception.test.ts b/tests/unit/skills-interception.test.ts index 075b24452a..18d7382eee 100644 --- a/tests/unit/skills-interception.test.ts +++ b/tests/unit/skills-interception.test.ts @@ -25,7 +25,7 @@ function resetRuntime() { async function resetStorage() { resetRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -71,7 +71,7 @@ test.beforeEach(async () => { test.after(() => { resetRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("extractToolCalls supports OpenAI, Anthropic and Gemini shapes", () => { diff --git a/tests/unit/skills-marketplace.test.ts b/tests/unit/skills-marketplace.test.ts index 64fddb7cd9..ca63ce63dc 100644 --- a/tests/unit/skills-marketplace.test.ts +++ b/tests/unit/skills-marketplace.test.ts @@ -22,7 +22,7 @@ function clearSkillRegistry() { function resetStorage() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); clearSkillRegistry(); core.getDbInstance(); @@ -40,7 +40,7 @@ test.after(() => { core.resetDbInstance(); clearSkillRegistry(); process.env.DATA_DIR = originalDataDir; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("SkillsMP installs are available to API-key-scoped requests", async () => { diff --git a/tests/unit/skills-memory-builtins.test.ts b/tests/unit/skills-memory-builtins.test.ts index aaabcdf0a0..472e76204a 100644 --- a/tests/unit/skills-memory-builtins.test.ts +++ b/tests/unit/skills-memory-builtins.test.ts @@ -32,7 +32,7 @@ test.beforeEach(() => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("memory_save creates a new memory entry", async () => { diff --git a/tests/unit/skills-registry.test.ts b/tests/unit/skills-registry.test.ts index 14e6a9c6a5..af001d159a 100644 --- a/tests/unit/skills-registry.test.ts +++ b/tests/unit/skills-registry.test.ts @@ -21,7 +21,7 @@ function resetRegistryState() { async function resetStorage() { resetRegistryState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ test.beforeEach(async () => { test.after(() => { resetRegistryState(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("skillRegistry registers, lists, sorts and resolves versions", async () => { diff --git a/tests/unit/skills-routes-error-sanitization.test.ts b/tests/unit/skills-routes-error-sanitization.test.ts index 083ef363cc..18238609fb 100644 --- a/tests/unit/skills-routes-error-sanitization.test.ts +++ b/tests/unit/skills-routes-error-sanitization.test.ts @@ -28,7 +28,7 @@ const LEAKY_PATH = "/home/testuser/.omniroute/skills/evil/handler.js"; function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = ORIGINAL_DATA_DIR; if (ORIGINAL_OMNIROUTE_API_KEY === undefined) delete process.env.OMNIROUTE_API_KEY; diff --git a/tests/unit/skills-routes.test.ts b/tests/unit/skills-routes.test.ts index 0dc3ba150e..77bcf4f727 100644 --- a/tests/unit/skills-routes.test.ts +++ b/tests/unit/skills-routes.test.ts @@ -23,7 +23,7 @@ function clearSkillRegistry() { function resetStorage() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); clearSkillRegistry(); core.getDbInstance(); @@ -60,7 +60,7 @@ test.after(() => { core.resetDbInstance(); clearSkillRegistry(); process.env.DATA_DIR = originalDataDir; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("skills route GET loads skills from the database and lists them", async () => { diff --git a/tests/unit/skills-skillssh.test.ts b/tests/unit/skills-skillssh.test.ts index c5229e9b79..b55f320e79 100644 --- a/tests/unit/skills-skillssh.test.ts +++ b/tests/unit/skills-skillssh.test.ts @@ -23,7 +23,7 @@ function clearSkillRegistry() { function resetStorage() { core.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(tmpDir, { recursive: true }); clearSkillRegistry(); core.getDbInstance(); @@ -42,7 +42,7 @@ test.after(() => { clearSkillRegistry(); globalThis.fetch = originalFetch; process.env.DATA_DIR = originalDataDir; - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── Zod schema validation tests ── diff --git a/tests/unit/sonar-quality-gate-fixes.test.ts b/tests/unit/sonar-quality-gate-fixes.test.ts index 1f39367501..464aa6c05a 100644 --- a/tests/unit/sonar-quality-gate-fixes.test.ts +++ b/tests/unit/sonar-quality-gate-fixes.test.ts @@ -29,7 +29,7 @@ test("classify-pr-changes rejects a list path that escapes the workspace", () => assert.match(res.stderr, /escapes the workspace/); fs.rmSync(outside, { force: true }); } finally { - fs.rmSync(cwd, { recursive: true, force: true }); + fs.rmSync(cwd, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -45,7 +45,7 @@ test("classify-pr-changes still accepts a workspace-relative list file", () => { assert.match(res.stdout, /docs=true/); assert.match(res.stdout, /code=false/); } finally { - fs.rmSync(cwd, { recursive: true, force: true }); + fs.rmSync(cwd, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/specialty-model-catalog-routes.test.ts b/tests/unit/specialty-model-catalog-routes.test.ts index 01ab26691c..db1bd64211 100644 --- a/tests/unit/specialty-model-catalog-routes.test.ts +++ b/tests/unit/specialty-model-catalog-routes.test.ts @@ -18,7 +18,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // These routes all derive from the shared unified catalog (getUnifiedModelsResponse), // which #6408 wrapped in a 1.5s TTL response cache keyed only by (prefix, isCodex @@ -57,7 +57,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("image catalog GET uses the unified active-credential model list", async () => { diff --git a/tests/unit/specialty-model-hidden-openrouter-9293.test.ts b/tests/unit/specialty-model-hidden-openrouter-9293.test.ts index 4599b26909..360dfe3758 100644 --- a/tests/unit/specialty-model-hidden-openrouter-9293.test.ts +++ b/tests/unit/specialty-model-hidden-openrouter-9293.test.ts @@ -32,7 +32,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -44,7 +44,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9293 hidden OpenRouter specialty models are excluded from /v1/models catalog", async () => { diff --git a/tests/unit/spend-batch-writer.test.ts b/tests/unit/spend-batch-writer.test.ts index 29253602f6..88f0b67490 100644 --- a/tests/unit/spend-batch-writer.test.ts +++ b/tests/unit/spend-batch-writer.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -60,7 +60,7 @@ test.after(async () => { resetSpendBatchWriterForTests(); costRules.resetCostData(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("spend batch writer auto-flushes at the configured threshold", async () => { diff --git a/tests/unit/sre-tcp-close-analyzer.test.ts b/tests/unit/sre-tcp-close-analyzer.test.ts index 0d4d6e332c..b660bfd1c0 100644 --- a/tests/unit/sre-tcp-close-analyzer.test.ts +++ b/tests/unit/sre-tcp-close-analyzer.test.ts @@ -229,7 +229,7 @@ function withTempPcap(fn: (pcapPath: string, tmpDir: string) => T): T { try { return fn(pcapPath, tmpDir); } finally { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } diff --git a/tests/unit/sse-auth-antigravity-credits.test.ts b/tests/unit/sse-auth-antigravity-credits.test.ts index 6b038fb4b3..4335fd9c08 100644 --- a/tests/unit/sse-auth-antigravity-credits.test.ts +++ b/tests/unit/sse-auth-antigravity-credits.test.ts @@ -17,7 +17,7 @@ const quotaCache = await import("../../src/domain/quotaCache.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -28,7 +28,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Antigravity always mode bypasses request-path quota preflight", async () => { diff --git a/tests/unit/sse-auth-codex-account-pool.test.ts b/tests/unit/sse-auth-codex-account-pool.test.ts index 927775d15f..59dce44cb0 100644 --- a/tests/unit/sse-auth-codex-account-pool.test.ts +++ b/tests/unit/sse-auth-codex-account-pool.test.ts @@ -14,7 +14,7 @@ const auth = await import("../../src/sse/services/auth.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -40,7 +40,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex Spark preflight cooldown leaves normal models on the same parent selectable", async () => { diff --git a/tests/unit/sse-auth-exclusive-leases.test.ts b/tests/unit/sse-auth-exclusive-leases.test.ts index 6543e83f1c..5cd1c2598d 100644 --- a/tests/unit/sse-auth-exclusive-leases.test.ts +++ b/tests/unit/sse-auth-exclusive-leases.test.ts @@ -68,7 +68,7 @@ async function resetStorage(): Promise { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); fallback.clearAllModelLockouts(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -76,7 +76,7 @@ test.beforeEach(resetStorage); test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("foreign top candidate is skipped and the existing selector chooses the next free candidate", async () => { diff --git a/tests/unit/sse-auth-resource-404.test.ts b/tests/unit/sse-auth-resource-404.test.ts index 9980627c91..2537632fe0 100644 --- a/tests/unit/sse-auth-resource-404.test.ts +++ b/tests/unit/sse-auth-resource-404.test.ts @@ -14,7 +14,7 @@ const auth = await import("../../src/sse/services/auth.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("markAccountUnavailable preserves connection health for a missing Files API resource", async () => { diff --git a/tests/unit/sse-auth.test.ts b/tests/unit/sse-auth.test.ts index 0a18c865dd..ce8032d20d 100644 --- a/tests/unit/sse-auth.test.ts +++ b/tests/unit/sse-auth.test.ts @@ -20,7 +20,7 @@ const oauthOccupancy = await import("../../open-sse/services/oauthSessionOccupan async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -72,7 +72,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("extractApiKey parses bearer headers and isValidApiKey validates persisted keys", async () => { diff --git a/tests/unit/sse-comments-optout-9305.test.ts b/tests/unit/sse-comments-optout-9305.test.ts index 8928738bbe..41d0e4e219 100644 --- a/tests/unit/sse-comments-optout-9305.test.ts +++ b/tests/unit/sse-comments-optout-9305.test.ts @@ -181,7 +181,7 @@ for (const upstreamDone of [true, false]) { test.after(() => { usageHistory.clearPendingRequests(); core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (previousDataDir === undefined) delete process.env.DATA_DIR; else process.env.DATA_DIR = previousDataDir; }); diff --git a/tests/unit/sse-shim-contract.test.ts b/tests/unit/sse-shim-contract.test.ts index b27a500d44..c59238bf87 100644 --- a/tests/unit/sse-shim-contract.test.ts +++ b/tests/unit/sse-shim-contract.test.ts @@ -26,7 +26,7 @@ function listProjectFiles(relativePath: string): string[] { } test.after(() => { - rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("src/sse model shim keeps parseModel behavior aligned with open-sse core", async () => { diff --git a/tests/unit/startup-stale-cooldown-recovery.test.ts b/tests/unit/startup-stale-cooldown-recovery.test.ts index 8adec926a2..b1b8cf6a87 100644 --- a/tests/unit/startup-stale-cooldown-recovery.test.ts +++ b/tests/unit/startup-stale-cooldown-recovery.test.ts @@ -32,7 +32,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -52,7 +52,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ─── helpers ──────────────────────────────────────────────────────────────── diff --git a/tests/unit/sticky-affinity-failover-6219.test.ts b/tests/unit/sticky-affinity-failover-6219.test.ts index 44b8709b9f..8d1d8ad535 100644 --- a/tests/unit/sticky-affinity-failover-6219.test.ts +++ b/tests/unit/sticky-affinity-failover-6219.test.ts @@ -35,13 +35,13 @@ const TTL = 60_000; test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("evicts the sticky pin when the pinned connection fails over (#6219)", () => { diff --git a/tests/unit/stmt-cache-lru.test.ts b/tests/unit/stmt-cache-lru.test.ts index d50e1fdc78..9e35cdceab 100644 --- a/tests/unit/stmt-cache-lru.test.ts +++ b/tests/unit/stmt-cache-lru.test.ts @@ -24,7 +24,7 @@ function cleanup() { delete process.env.DATA_DIR; } try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } diff --git a/tests/unit/stream-claude-delta-contract.test.ts b/tests/unit/stream-claude-delta-contract.test.ts index a807d7267b..79909ccf9b 100644 --- a/tests/unit/stream-claude-delta-contract.test.ts +++ b/tests/unit/stream-claude-delta-contract.test.ts @@ -13,7 +13,7 @@ const core = await import("../../src/lib/db/core.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(testDataDir, { recursive: true, force: true }); + fs.rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createSSEStream ignores non-string Claude deltas before estimating usage", async () => { diff --git a/tests/unit/stream-impossible-input-usage.test.ts b/tests/unit/stream-impossible-input-usage.test.ts index 1716f6851d..026f975c2c 100644 --- a/tests/unit/stream-impossible-input-usage.test.ts +++ b/tests/unit/stream-impossible-input-usage.test.ts @@ -36,7 +36,7 @@ function parseSsePayloads(text: string): Array> { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("native Claude passthrough repairs impossible AgentRouter cache usage before forwarding", async () => { diff --git a/tests/unit/stream-non-json-sse.test.ts b/tests/unit/stream-non-json-sse.test.ts index 16776c45cf..2e43580379 100644 --- a/tests/unit/stream-non-json-sse.test.ts +++ b/tests/unit/stream-non-json-sse.test.ts @@ -41,7 +41,7 @@ async function readTransformed(chunks: string[], options: object): Promise { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/stream-numeric-ids.test.ts b/tests/unit/stream-numeric-ids.test.ts index ce82ad9ce3..be6cb67c50 100644 --- a/tests/unit/stream-numeric-ids.test.ts +++ b/tests/unit/stream-numeric-ids.test.ts @@ -29,7 +29,7 @@ async function readTransformed(chunks, options) { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/stream-onfailure-callback-logging.test.ts b/tests/unit/stream-onfailure-callback-logging.test.ts index 8e9a0f7672..2146a84a25 100644 --- a/tests/unit/stream-onfailure-callback-logging.test.ts +++ b/tests/unit/stream-onfailure-callback-logging.test.ts @@ -34,7 +34,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { for (const entry of fs.readdirSync(TEST_DATA_DIR)) { - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); diff --git a/tests/unit/stream-prompt-tokens-zero-upstream.test.ts b/tests/unit/stream-prompt-tokens-zero-upstream.test.ts index dc579dc2b0..a51c6c8bd6 100644 --- a/tests/unit/stream-prompt-tokens-zero-upstream.test.ts +++ b/tests/unit/stream-prompt-tokens-zero-upstream.test.ts @@ -108,7 +108,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { for (const entry of fs.readdirSync(TEST_DATA_DIR)) { - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); diff --git a/tests/unit/stream-request-body-size-mark-7045.test.ts b/tests/unit/stream-request-body-size-mark-7045.test.ts index b033be2085..c8e530725a 100644 --- a/tests/unit/stream-request-body-size-mark-7045.test.ts +++ b/tests/unit/stream-request-body-size-mark-7045.test.ts @@ -56,7 +56,7 @@ async function drainSSEStream(options) { test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/stream-utils.test.ts b/tests/unit/stream-utils.test.ts index 7ef51687d1..5ace128d33 100644 --- a/tests/unit/stream-utils.test.ts +++ b/tests/unit/stream-utils.test.ts @@ -147,7 +147,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { for (const entry of fs.readdirSync(TEST_DATA_DIR)) { - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); diff --git a/tests/unit/streamingPiiTransform.test.ts b/tests/unit/streamingPiiTransform.test.ts index f28a31aa33..9fb515add2 100644 --- a/tests/unit/streamingPiiTransform.test.ts +++ b/tests/unit/streamingPiiTransform.test.ts @@ -490,7 +490,7 @@ test.after(async () => { const coreDb = await import("../../src/lib/db/core.ts"); coreDb.resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("createPiiSseTransform preserves tool call arguments without buffering", async () => { diff --git a/tests/unit/strict-random-deck.test.ts b/tests/unit/strict-random-deck.test.ts index 186bf75e36..19d3784774 100644 --- a/tests/unit/strict-random-deck.test.ts +++ b/tests/unit/strict-random-deck.test.ts @@ -16,7 +16,7 @@ test.after(() => { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { for (const entry of fs.readdirSync(TEST_DATA_DIR)) { - fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true }); + fs.rmSync(path.join(TEST_DATA_DIR, entry), { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } }); diff --git a/tests/unit/suggested-models-route.test.ts b/tests/unit/suggested-models-route.test.ts index bca7401838..9b0a218106 100644 --- a/tests/unit/suggested-models-route.test.ts +++ b/tests/unit/suggested-models-route.test.ts @@ -37,7 +37,7 @@ test.afterEach(() => { test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { diff --git a/tests/unit/sync-bundle.test.ts b/tests/unit/sync-bundle.test.ts index 24215d0226..12e508b002 100644 --- a/tests/unit/sync-bundle.test.ts +++ b/tests/unit/sync-bundle.test.ts @@ -22,7 +22,7 @@ const syncBundle = await import("../../src/lib/sync/bundle.ts"); function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(() => { test.after(() => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/sync-env-bundled-require-5006.test.ts b/tests/unit/sync-env-bundled-require-5006.test.ts index 3082cbf551..516dda1950 100644 --- a/tests/unit/sync-env-bundled-require-5006.test.ts +++ b/tests/unit/sync-env-bundled-require-5006.test.ts @@ -97,6 +97,6 @@ test("#5006: getEnvSyncPlan(oauth) works with explicit rootDir and never throws assert.deepEqual(keys.sort(), ["CLAUDE_OAUTH_CLIENT_ID", "CODEX_OAUTH_CLIENT_ID"]); } finally { process.env.DATA_DIR = origDataDir; - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/sync-env.test.ts b/tests/unit/sync-env.test.ts index 415e689a3b..50454b606f 100644 --- a/tests/unit/sync-env.test.ts +++ b/tests/unit/sync-env.test.ts @@ -76,7 +76,7 @@ test("syncEnv creates .env from .env.example and generates install-time secrets" assert.doesNotMatch(envContent, /^COMMENTED_KEY=/m); } finally { process.env.DATA_DIR = origDataDir; - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -111,7 +111,7 @@ test("syncEnv appends only missing keys and preserves existing values", () => { assert.match(envContent, /Auto-added by sync-env/); } finally { process.env.DATA_DIR = origDataDir; - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -142,7 +142,7 @@ test("syncEnv treats quoted and unquoted values as equivalent", () => { assert.deepEqual(result, { created: false, added: 0 }); } finally { process.env.DATA_DIR = origDataDir; - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -163,7 +163,7 @@ test("syncEnv is idempotent when .env is already complete", () => { assert.equal(after, before); } finally { process.env.DATA_DIR = origDataDir; - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -182,6 +182,6 @@ test("syncEnv oauth scope only copies oauth defaults", () => { assert.doesNotMatch(envContent, /^JWT_SECRET=/m); assert.doesNotMatch(envContent, /^Provider User-Agent Overrides/m); } finally { - fs.rmSync(rootDir, { recursive: true, force: true }); + fs.rmSync(rootDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/sync-reasoning-supported-efforts-7694.test.ts b/tests/unit/sync-reasoning-supported-efforts-7694.test.ts index f81440ea10..53f8f7148b 100644 --- a/tests/unit/sync-reasoning-supported-efforts-7694.test.ts +++ b/tests/unit/sync-reasoning-supported-efforts-7694.test.ts @@ -39,7 +39,7 @@ const { applyDefaultReasoningEffort } = await import( async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -50,7 +50,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); async function seedProviderConnection(provider: string) { diff --git a/tests/unit/sync-routes.test.ts b/tests/unit/sync-routes.test.ts index c12c0756ca..f863c04f6b 100644 --- a/tests/unit/sync-routes.test.ts +++ b/tests/unit/sync-routes.test.ts @@ -25,7 +25,7 @@ const localDb = await import("../../src/lib/localDb.ts"); function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -37,7 +37,7 @@ test.beforeEach(async () => { test.after(() => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/synced-effort-suffix-learned-validation.test.ts b/tests/unit/synced-effort-suffix-learned-validation.test.ts index a06ff2d479..2e3d810ca2 100644 --- a/tests/unit/synced-effort-suffix-learned-validation.test.ts +++ b/tests/unit/synced-effort-suffix-learned-validation.test.ts @@ -25,7 +25,7 @@ const { recordLearnedReasoningEffort, __test_resetLearnedReasoningEffortCaps } = async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -55,7 +55,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("-max resolves once the learned set advertises it (sync metadata does not)", async () => { diff --git a/tests/unit/synced-model-context-window-reconcile.test.ts b/tests/unit/synced-model-context-window-reconcile.test.ts index ddf629c34f..c9623085a9 100644 --- a/tests/unit/synced-model-context-window-reconcile.test.ts +++ b/tests/unit/synced-model-context-window-reconcile.test.ts @@ -39,7 +39,7 @@ type ReconcileDeps = resolver.ReconcileDeps; function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -49,7 +49,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // --------------------------------------------------------------------------- diff --git a/tests/unit/synced-model-delete-custom-sibling.test.ts b/tests/unit/synced-model-delete-custom-sibling.test.ts index 5fb31716df..ad5102359d 100644 --- a/tests/unit/synced-model-delete-custom-sibling.test.ts +++ b/tests/unit/synced-model-delete-custom-sibling.test.ts @@ -32,7 +32,7 @@ test.after(() => { // Release the SQLite handle so the Node test runner can exit, then remove the // throwaway DATA_DIR (CLAUDE.md "Database Handles in Tests"). core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); /** Invoke the real DELETE handler so the test tracks production behavior. */ diff --git a/tests/unit/synced-model-delete-resync.test.ts b/tests/unit/synced-model-delete-resync.test.ts index d1b711540b..4aaf79b167 100644 --- a/tests/unit/synced-model-delete-resync.test.ts +++ b/tests/unit/synced-model-delete-resync.test.ts @@ -23,7 +23,7 @@ before(() => { after(() => { resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("a deleted synced model is restored when upstream advertises it again", async () => { diff --git a/tests/unit/synced-model-hide-persist-3782.test.ts b/tests/unit/synced-model-hide-persist-3782.test.ts index 400a87fa01..e85ef0973b 100644 --- a/tests/unit/synced-model-hide-persist-3782.test.ts +++ b/tests/unit/synced-model-hide-persist-3782.test.ts @@ -35,7 +35,7 @@ after(() => { // Release the SQLite handle so the Node test runner can exit, then remove the // throwaway DATA_DIR (CLAUDE.md "Database Handles in Tests"). resetDbInstance(); - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const PROVIDER = "llama-cpp"; diff --git a/tests/unit/system-trust-test-guard.test.ts b/tests/unit/system-trust-test-guard.test.ts index 969c3588f8..36d55a2927 100644 --- a/tests/unit/system-trust-test-guard.test.ts +++ b/tests/unit/system-trust-test-guard.test.ts @@ -37,6 +37,6 @@ test("installCert under the guard skips the OS mutation but keeps input contract try { await installCert("", pem); } finally { - fs.rmSync(dir, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/t07-no-log-key-config.test.ts b/tests/unit/t07-no-log-key-config.test.ts index 9ce5ded52d..c1513793ef 100644 --- a/tests/unit/t07-no-log-key-config.test.ts +++ b/tests/unit/t07-no-log-key-config.test.ts @@ -23,7 +23,7 @@ const schemas = await import("../../src/shared/validation/schemas.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (originalPiiEnabled === undefined) { delete process.env.PII_RESPONSE_SANITIZATION; diff --git a/tests/unit/t08-allowed-connections.test.ts b/tests/unit/t08-allowed-connections.test.ts index 0eedb92be4..6715da654d 100644 --- a/tests/unit/t08-allowed-connections.test.ts +++ b/tests/unit/t08-allowed-connections.test.ts @@ -20,7 +20,7 @@ const ROOT_DIR = path.resolve(__dirname, "../.."); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ══════════════════════════════════════════════════════════════════ diff --git a/tests/unit/tag-routing.test.ts b/tests/unit/tag-routing.test.ts index c87f929dc7..5cb596f8fc 100644 --- a/tests/unit/tag-routing.test.ts +++ b/tests/unit/tag-routing.test.ts @@ -36,7 +36,7 @@ function okResponse(content: string) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -57,7 +57,7 @@ test.beforeEach(async () => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("tag router normalizes request metadata and matches connection tags", () => { diff --git a/tests/unit/tailscaleTunnel.test.ts b/tests/unit/tailscaleTunnel.test.ts index 43b168277c..171962702d 100644 --- a/tests/unit/tailscaleTunnel.test.ts +++ b/tests/unit/tailscaleTunnel.test.ts @@ -82,7 +82,7 @@ test.beforeEach(async () => { resetTailscaleTestEnv(fakeBinaryPath); mitmManager.clearCachedPassword(); dbCore.resetDbInstance(); - await fs.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fs.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); await fs.mkdir(TEST_DATA_DIR, { recursive: true }); const recreatedBinaryPath = await createFakeTailscaleBinary(); resetTailscaleTestEnv(recreatedBinaryPath); @@ -108,7 +108,7 @@ test.after(async () => { else process.env.TAILSCALE_TEST_LOGIN_OUTPUT = originalEnv.loginOutput; if (originalEnv.loginExitCode === undefined) delete process.env.TAILSCALE_TEST_LOGIN_EXIT_CODE; else process.env.TAILSCALE_TEST_LOGIN_EXIT_CODE = originalEnv.loginExitCode; - await fs.rm(TEST_DATA_DIR, { recursive: true, force: true }); + await fs.rm(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("extractTailscaleAuthUrl and extractTailscaleEnableUrl parse login URLs", () => { diff --git a/tests/unit/telemetry-auto-cleanup-6848.test.ts b/tests/unit/telemetry-auto-cleanup-6848.test.ts index 06491e2404..9cc28410b7 100644 --- a/tests/unit/telemetry-auto-cleanup-6848.test.ts +++ b/tests/unit/telemetry-auto-cleanup-6848.test.ts @@ -44,7 +44,7 @@ const { getDbInstance, resetDbInstance } = await import("../../src/lib/db/core.t // or the native test runner can hang indefinitely on a dangling connection. test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const DAY_MS = 86_400_000; diff --git a/tests/unit/terminal-status-origin.test.ts b/tests/unit/terminal-status-origin.test.ts index 3a9221f2ca..c30076d22d 100644 --- a/tests/unit/terminal-status-origin.test.ts +++ b/tests/unit/terminal-status-origin.test.ts @@ -13,7 +13,7 @@ const { writeTerminalStatus } = await import("../../src/shared/utils/terminalSta test.after(() => { core.resetDbInstance(); - fs.rmSync(DIR, { recursive: true, force: true }); + fs.rmSync(DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function row(id: string): { is_active: number; test_status: string } { diff --git a/tests/unit/termux-android-cache-dir.test.ts b/tests/unit/termux-android-cache-dir.test.ts index a99c197ec7..66d15525d1 100644 --- a/tests/unit/termux-android-cache-dir.test.ts +++ b/tests/unit/termux-android-cache-dir.test.ts @@ -89,7 +89,7 @@ test("ensureAndroidCacheDir: creates ~/.cache when missing on android", () => { assert.equal(existsSync(cacheDir), true); assert.equal(env.XDG_CACHE_HOME, cacheDir); } finally { - rmSync(home, { recursive: true, force: true }); + rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -114,7 +114,7 @@ test("ensureAndroidCacheDir: does not recreate when ~/.cache already exists", () assert.equal(mkdirCalls, 0); assert.equal(env.XDG_CACHE_HOME, cacheDir); } finally { - rmSync(home, { recursive: true, force: true }); + rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -133,7 +133,7 @@ test("ensureAndroidCacheDir: respects an existing XDG_CACHE_HOME and creates tha assert.equal(existsSync(xdg), true); assert.equal(env.XDG_CACHE_HOME, xdg); } finally { - rmSync(root, { recursive: true, force: true }); + rmSync(root, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -150,7 +150,7 @@ test("ensureAndroidCacheDir: Termux-on-linux still prepares ~/.cache", () => { assert.equal(result.prepared, true); assert.equal(existsSync(join(home, ".cache")), true); } finally { - rmSync(home, { recursive: true, force: true }); + rmSync(home, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/thinking-budget-hydration-5312.test.ts b/tests/unit/thinking-budget-hydration-5312.test.ts index 2eca499271..63b4bccc75 100644 --- a/tests/unit/thinking-budget-hydration-5312.test.ts +++ b/tests/unit/thinking-budget-hydration-5312.test.ts @@ -33,7 +33,7 @@ test.afterEach(() => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#5312 RC-A: persisted thinkingBudget mode is restored at boot", async () => { diff --git a/tests/unit/tier-config-provider-override-route.test.ts b/tests/unit/tier-config-provider-override-route.test.ts index 93852d6e26..3348cb06c7 100644 --- a/tests/unit/tier-config-provider-override-route.test.ts +++ b/tests/unit/tier-config-provider-override-route.test.ts @@ -23,7 +23,7 @@ const route = await import("../../src/app/api/settings/tier-config/route.ts"); function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -33,7 +33,7 @@ test.beforeEach(() => { test.after(() => { resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function putRequest(body: unknown) { diff --git a/tests/unit/tier-resolver-provider-override.test.ts b/tests/unit/tier-resolver-provider-override.test.ts index 295c0e899c..eca6cac7fa 100644 --- a/tests/unit/tier-resolver-provider-override.test.ts +++ b/tests/unit/tier-resolver-provider-override.test.ts @@ -21,7 +21,7 @@ const tierResolver = await import("../../open-sse/services/tierResolver.ts"); function resetStorage() { delete process.env.INITIAL_PASSWORD; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); // classifyTier() caches by provider::model — reset the routing-side config // too so tests don't leak assignments across each other. @@ -34,7 +34,7 @@ test.beforeEach(() => { test.after(() => { resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function putRequest(body: unknown) { diff --git a/tests/unit/token-health-check-cursor.test.ts b/tests/unit/token-health-check-cursor.test.ts index 75eb4066d1..f05933e2bb 100644 --- a/tests/unit/token-health-check-cursor.test.ts +++ b/tests/unit/token-health-check-cursor.test.ts @@ -40,7 +40,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -60,7 +60,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function getId(connection: { id?: unknown }): string { @@ -172,7 +172,7 @@ async function withCursorEnv(fn: (env: CursorEnv) => Promise): Promise else delete process.env.USERPROFILE; delete process.env.FAKE_CURSOR_AGENT_LOG; delete process.env.FAKE_CURSOR_AGENT_STATUS_MODE; - fs.rmSync(tmpHome, { recursive: true, force: true }); + fs.rmSync(tmpHome, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }, }; diff --git a/tests/unit/token-health-check-devin-cli-8407.test.ts b/tests/unit/token-health-check-devin-cli-8407.test.ts index 312b61df65..ab3b71ef0d 100644 --- a/tests/unit/token-health-check-devin-cli-8407.test.ts +++ b/tests/unit/token-health-check-devin-cli-8407.test.ts @@ -20,7 +20,7 @@ const { supportsTokenRefresh } = await import("../../open-sse/services/tokenRefr async function resetStorage() { core.resetDbInstance(); if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ function getCreatedConnectionId(connection: { id?: unknown }): string { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("supportsTokenRefresh excludes import-only Devin providers", () => { diff --git a/tests/unit/token-health-check-sweep.test.ts b/tests/unit/token-health-check-sweep.test.ts index afce89cde8..00b0668653 100644 --- a/tests/unit/token-health-check-sweep.test.ts +++ b/tests/unit/token-health-check-sweep.test.ts @@ -43,7 +43,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -60,7 +60,7 @@ async function resetStorage() { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); delete process.env.HEALTHCHECK_STAGGER_MS; delete process.env.HEALTHCHECK_JITTER_MIN_MS; delete process.env.HEALTHCHECK_JITTER_MAX_MS; diff --git a/tests/unit/token-health-check.test.ts b/tests/unit/token-health-check.test.ts index 274be4c126..8605c1e52b 100644 --- a/tests/unit/token-health-check.test.ts +++ b/tests/unit/token-health-check.test.ts @@ -23,7 +23,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -227,7 +227,7 @@ async function withPatchedProvider(providerId, config, fn) { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("extractResolvedProxyConfig unwraps proxy resolution metadata", () => { diff --git a/tests/unit/token-health-no-refresh-token-expired-5326.test.ts b/tests/unit/token-health-no-refresh-token-expired-5326.test.ts index 204c11276e..82790f33aa 100644 --- a/tests/unit/token-health-no-refresh-token-expired-5326.test.ts +++ b/tests/unit/token-health-no-refresh-token-expired-5326.test.ts @@ -18,7 +18,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: unknown) { @@ -43,7 +43,7 @@ function getCreatedConnectionId(connection: { id?: unknown }): string { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // Regression for #5326: a refresh-CAPABLE provider (antigravity) with NO refresh diff --git a/tests/unit/token-limits.test.ts b/tests/unit/token-limits.test.ts index aeb802626e..aacb312682 100644 --- a/tests/unit/token-limits.test.ts +++ b/tests/unit/token-limits.test.ts @@ -28,7 +28,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -78,7 +78,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("window rollover: daily/weekly/monthly produce distinct windowStart", async () => { diff --git a/tests/unit/token-refresh-route-service.test.ts b/tests/unit/token-refresh-route-service.test.ts index 0a71e72c81..89093cf011 100644 --- a/tests/unit/token-refresh-route-service.test.ts +++ b/tests/unit/token-refresh-route-service.test.ts @@ -25,7 +25,7 @@ function jsonResponse(body, status = 200) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -154,7 +154,7 @@ test.beforeEach(async () => { test.after(async () => { delete PROVIDERS["custom-oauth-local-608"]; await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("token refresh wrapper delegates provider-specific refresh helpers and formatter utilities", async () => { diff --git a/tests/unit/tokenHealthCheck-batchSize.test.ts b/tests/unit/tokenHealthCheck-batchSize.test.ts index c6a088b3f3..0a5cb5033b 100644 --- a/tests/unit/tokenHealthCheck-batchSize.test.ts +++ b/tests/unit/tokenHealthCheck-batchSize.test.ts @@ -36,7 +36,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error) { @@ -55,7 +55,7 @@ test.after(() => { core.resetDbInstance(); try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } } catch { /* best effort cleanup */ diff --git a/tests/unit/transform-stream-hwm.test.ts b/tests/unit/transform-stream-hwm.test.ts index 93e94d0378..87229e623a 100644 --- a/tests/unit/transform-stream-hwm.test.ts +++ b/tests/unit/transform-stream-hwm.test.ts @@ -24,7 +24,7 @@ function cleanupDb() { delete process.env.DATA_DIR; } try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch {} } diff --git a/tests/unit/turbopack-cache-heal-6289.test.ts b/tests/unit/turbopack-cache-heal-6289.test.ts index 0a30882fbe..375f008bba 100644 --- a/tests/unit/turbopack-cache-heal-6289.test.ts +++ b/tests/unit/turbopack-cache-heal-6289.test.ts @@ -66,7 +66,7 @@ test("purgeTurbopackCache removes an existing cache/turbopack dir", () => { assert.equal(removed, true); assert.equal(fs.existsSync(cacheDir), false); - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("purgeTurbopackCache is a no-op (returns false) when the dir is absent", () => { diff --git a/tests/unit/upstream-ca-test-route-3488.test.ts b/tests/unit/upstream-ca-test-route-3488.test.ts index 750345534e..1ff10e94f8 100644 --- a/tests/unit/upstream-ca-test-route-3488.test.ts +++ b/tests/unit/upstream-ca-test-route-3488.test.ts @@ -47,8 +47,8 @@ fs.writeFileSync(validCaPath, TEST_CA_PEM); fs.writeFileSync(nonPemPath, "this is not a certificate"); test.after(() => { - fs.rmSync(dir, { recursive: true, force: true }); - fs.rmSync(DATA_DIR, { recursive: true, force: true }); + fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function postJson(body: unknown): Request { diff --git a/tests/unit/usage-account-analytics-route.test.ts b/tests/unit/usage-account-analytics-route.test.ts index 42108323d8..f05a40342d 100644 --- a/tests/unit/usage-account-analytics-route.test.ts +++ b/tests/unit/usage-account-analytics-route.test.ts @@ -34,14 +34,14 @@ async function readAccounts() { test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); usageHistory.clearPendingRequests(); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("Codex account grouping follows workspace and user identity, not email", async () => { diff --git a/tests/unit/usage-analytics-model-dedup-7535.test.ts b/tests/unit/usage-analytics-model-dedup-7535.test.ts index 5d55c19f4a..c691b48f64 100644 --- a/tests/unit/usage-analytics-model-dedup-7535.test.ts +++ b/tests/unit/usage-analytics-model-dedup-7535.test.ts @@ -24,7 +24,7 @@ function makeRequest(url: string) { test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); usageHistory.clearPendingRequests(); }); @@ -32,7 +32,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_API_KEY_SECRET === undefined) { delete process.env.API_KEY_SECRET; diff --git a/tests/unit/usage-analytics-provider-display-name-7534.test.ts b/tests/unit/usage-analytics-provider-display-name-7534.test.ts index e060f7eb58..9880c86f28 100644 --- a/tests/unit/usage-analytics-provider-display-name-7534.test.ts +++ b/tests/unit/usage-analytics-provider-display-name-7534.test.ts @@ -24,7 +24,7 @@ function makeRequest(url: string) { test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); usageHistory.clearPendingRequests(); }); @@ -32,7 +32,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_API_KEY_SECRET === undefined) { delete process.env.API_KEY_SECRET; diff --git a/tests/unit/usage-analytics-route.test.ts b/tests/unit/usage-analytics-route.test.ts index 8e57e7e88b..ed897b6733 100644 --- a/tests/unit/usage-analytics-route.test.ts +++ b/tests/unit/usage-analytics-route.test.ts @@ -22,7 +22,7 @@ const EXPECTED_TOTAL_COST = 0.020925; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); clearPendingRequests(); } @@ -76,7 +76,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_API_KEY_SECRET === undefined) { delete process.env.API_KEY_SECRET; diff --git a/tests/unit/usage-analytics.test.ts b/tests/unit/usage-analytics.test.ts index fa6c969649..1bb16a8d3c 100644 --- a/tests/unit/usage-analytics.test.ts +++ b/tests/unit/usage-analytics.test.ts @@ -24,7 +24,7 @@ const clearPendingRequests = usageHistory.clearPendingRequests; async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); clearPendingRequests(); } @@ -54,7 +54,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("usage history persists entries and supports filtering and usageDb compatibility", async () => { diff --git a/tests/unit/usage-cache-health-route.test.ts b/tests/unit/usage-cache-health-route.test.ts index 949183b7a7..250205f3db 100644 --- a/tests/unit/usage-cache-health-route.test.ts +++ b/tests/unit/usage-cache-health-route.test.ts @@ -20,7 +20,7 @@ process.env.DATA_DIR = tmpDir; // the later ones. process.on("exit", () => { try { - fs.rmSync(tmpDir, { recursive: true, force: true }); + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* best effort */ } diff --git a/tests/unit/usage-endpoint-dimension.test.ts b/tests/unit/usage-endpoint-dimension.test.ts index 9712d92407..866b55ec41 100644 --- a/tests/unit/usage-endpoint-dimension.test.ts +++ b/tests/unit/usage-endpoint-dimension.test.ts @@ -20,7 +20,7 @@ const usageAnalytics = await import("../../src/lib/db/usageAnalytics.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); usageHistory.clearPendingRequests(); } @@ -31,7 +31,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("saveRequestUsage persists endpoint and getEndpointUsageRows groups by endpoint", async () => { diff --git a/tests/unit/usage-history-db.test.ts b/tests/unit/usage-history-db.test.ts index 6a3eb1564a..70405a2969 100644 --- a/tests/unit/usage-history-db.test.ts +++ b/tests/unit/usage-history-db.test.ts @@ -14,7 +14,7 @@ const clearPendingRequests = usageHistory.clearPendingRequests; async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); clearPendingRequests(); } @@ -53,7 +53,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ──────────────── getUsageDb ──────────────── diff --git a/tests/unit/usage-history-reset.test.ts b/tests/unit/usage-history-reset.test.ts index 352473365f..bd3e45b12d 100644 --- a/tests/unit/usage-history-reset.test.ts +++ b/tests/unit/usage-history-reset.test.ts @@ -34,7 +34,7 @@ function teardown() { delete process.env.DATA_DIR; } try { - fs.rmSync(tempDir, { recursive: true, force: true }); + fs.rmSync(tempDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // ignore cleanup errors } diff --git a/tests/unit/usage-migrations-legacy-archive-safety.test.ts b/tests/unit/usage-migrations-legacy-archive-safety.test.ts index 8e5eeb7465..1fc440ca77 100644 --- a/tests/unit/usage-migrations-legacy-archive-safety.test.ts +++ b/tests/unit/usage-migrations-legacy-archive-safety.test.ts @@ -59,7 +59,7 @@ test.after(() => { if (ORIGINAL_NEXT_PHASE === undefined) delete process.env.NEXT_PHASE; else process.env.NEXT_PHASE = ORIGINAL_NEXT_PHASE; - fs.rmSync(TEST_HOME_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_HOME_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6799: archiveLegacyRequestLogs() must not delete the live app-logger directory (DATA_DIR/logs/application)", async () => { diff --git a/tests/unit/usage-migrations.test.ts b/tests/unit/usage-migrations.test.ts index 0ac0e55fcf..c58b91147f 100644 --- a/tests/unit/usage-migrations.test.ts +++ b/tests/unit/usage-migrations.test.ts @@ -38,7 +38,7 @@ function writeJson(filePath, value) { function removePath(targetPath) { if (!targetPath) return; - fs.rmSync(targetPath, { recursive: true, force: true }); + fs.rmSync(targetPath, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } function resetDbTables() { diff --git a/tests/unit/usage-utilization-connection-meta.test.ts b/tests/unit/usage-utilization-connection-meta.test.ts index 6885d519f7..5c77221031 100644 --- a/tests/unit/usage-utilization-connection-meta.test.ts +++ b/tests/unit/usage-utilization-connection-meta.test.ts @@ -22,7 +22,7 @@ const { GET } = await import("../../src/app/api/usage/utilization/route.ts"); test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("utilization route does not import phantom @/lib/db/connections", () => { diff --git a/tests/unit/usage-vertex-split.test.ts b/tests/unit/usage-vertex-split.test.ts index 63f6e665f7..2f994ca47f 100644 --- a/tests/unit/usage-vertex-split.test.ts +++ b/tests/unit/usage-vertex-split.test.ts @@ -40,7 +40,7 @@ describe("vertex leaf self-tracked spend", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/usage-xai-split.test.ts b/tests/unit/usage-xai-split.test.ts index 00bf99db03..ff65d658e5 100644 --- a/tests/unit/usage-xai-split.test.ts +++ b/tests/unit/usage-xai-split.test.ts @@ -39,7 +39,7 @@ describe("xai leaf self-tracked usage", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/usage-xiaomi-mimo-split.test.ts b/tests/unit/usage-xiaomi-mimo-split.test.ts index 9a2f9fe91f..7a2253ae3b 100644 --- a/tests/unit/usage-xiaomi-mimo-split.test.ts +++ b/tests/unit/usage-xiaomi-mimo-split.test.ts @@ -40,7 +40,7 @@ describe("xiaomi-mimo leaf self-tracked quota", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/usage/usageHistoryDedup.test.ts b/tests/unit/usage/usageHistoryDedup.test.ts index 3e8588434a..bdf2a37c43 100644 --- a/tests/unit/usage/usageHistoryDedup.test.ts +++ b/tests/unit/usage/usageHistoryDedup.test.ts @@ -27,7 +27,7 @@ const { saveRequestUsage } = await import("../../../src/lib/usage/usageHistory.t // Cleanup: close DB handle and temp directory so the test runner doesn't hang. test.after(() => { resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── helpers ────────────────────────────────────────────────────────────────── diff --git a/tests/unit/v1-chat-completions-content-type-6414.test.ts b/tests/unit/v1-chat-completions-content-type-6414.test.ts index 8212b992b4..a527d6d7e9 100644 --- a/tests/unit/v1-chat-completions-content-type-6414.test.ts +++ b/tests/unit/v1-chat-completions-content-type-6414.test.ts @@ -72,7 +72,7 @@ test("#6414 accepts application/json with charset parameter", async () => { test.after(() => { try { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* Windows tempdir cleanup is best-effort */ } diff --git a/tests/unit/v1-models-auth-leak-9320.test.ts b/tests/unit/v1-models-auth-leak-9320.test.ts index 9dc9b17a36..d35b38ca9b 100644 --- a/tests/unit/v1-models-auth-leak-9320.test.ts +++ b/tests/unit/v1-models-auth-leak-9320.test.ts @@ -29,7 +29,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); try { v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); @@ -45,7 +45,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#9320 FIXED: anonymous GET /v1/models returns 401 when auth is configured", async () => { diff --git a/tests/unit/v1-models-catalog-generation-race.test.ts b/tests/unit/v1-models-catalog-generation-race.test.ts index 1c1e519164..da81bcc907 100644 --- a/tests/unit/v1-models-catalog-generation-race.test.ts +++ b/tests/unit/v1-models-catalog-generation-race.test.ts @@ -63,7 +63,7 @@ function deferredBuilder(body: string) { test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); catalogCache.__resetCatalogBuilderRunsForTest(); }); @@ -71,7 +71,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("a build that started before invalidation is not joined and does not repopulate the cache", async () => { diff --git a/tests/unit/v1-models-catalog-ttl.test.ts b/tests/unit/v1-models-catalog-ttl.test.ts index 84369ac33a..279e824f17 100644 --- a/tests/unit/v1-models-catalog-ttl.test.ts +++ b/tests/unit/v1-models-catalog-ttl.test.ts @@ -42,7 +42,7 @@ const GAP_MS = 10_000; test.beforeEach(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); }); @@ -50,7 +50,7 @@ test.beforeEach(() => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("the settings default and the constant agree on the catalog TTL", async () => { diff --git a/tests/unit/v1-models-concurrent-6408.test.ts b/tests/unit/v1-models-concurrent-6408.test.ts index 4aa543e504..d1c0b8fd9d 100644 --- a/tests/unit/v1-models-concurrent-6408.test.ts +++ b/tests/unit/v1-models-concurrent-6408.test.ts @@ -29,7 +29,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -41,7 +41,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#6408 — 10 concurrent identical GET /v1/models calls collapse to ONE builder run", async () => { diff --git a/tests/unit/v1-models-discovery-conformance.test.ts b/tests/unit/v1-models-discovery-conformance.test.ts index 549fc28ffa..bd6e0cea53 100644 --- a/tests/unit/v1-models-discovery-conformance.test.ts +++ b/tests/unit/v1-models-discovery-conformance.test.ts @@ -31,7 +31,7 @@ const v1ModelsCatalog = await import("../../src/app/api/v1/models/catalog.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); v1ModelsCatalog.__resetCatalogBuilderRunsForTest(); } @@ -43,7 +43,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("1. GET /v1/models never returns a 3xx redirect status (regression guard)", async () => { diff --git a/tests/unit/v1-ws-route.test.ts b/tests/unit/v1-ws-route.test.ts index e4e75ae34b..55e68c165d 100644 --- a/tests/unit/v1-ws-route.test.ts +++ b/tests/unit/v1-ws-route.test.ts @@ -19,7 +19,7 @@ const wsRoute = await import("../../src/app/api/v1/ws/route.ts"); function resetStorage() { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ test.beforeEach(async () => { test.after(() => { apiKeysDb.resetApiKeyState(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/v1beta-models-route.test.ts b/tests/unit/v1beta-models-route.test.ts index 1f66e7ae24..04cc86d9db 100644 --- a/tests/unit/v1beta-models-route.test.ts +++ b/tests/unit/v1beta-models-route.test.ts @@ -24,7 +24,7 @@ async function addActiveConnection(provider: string) { async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -34,7 +34,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("v1beta models route deduplicates custom models against built-in and synced entries", async () => { diff --git a/tests/unit/veoaifree-video-route.test.ts b/tests/unit/veoaifree-video-route.test.ts index e8dd11f68b..4c0b0fe92a 100644 --- a/tests/unit/veoaifree-video-route.test.ts +++ b/tests/unit/veoaifree-video-route.test.ts @@ -52,7 +52,7 @@ test.after(() => { globalThis.fetch = originalFetch; globalThis.setTimeout = originalSetTimeout; core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("video route returns 200 with normalized b64_json for Veo AI Free", async () => { diff --git a/tests/unit/vercel-gateway-models-fetch-4249.test.ts b/tests/unit/vercel-gateway-models-fetch-4249.test.ts index 54fc16a03a..d2bfc94fd2 100644 --- a/tests/unit/vercel-gateway-models-fetch-4249.test.ts +++ b/tests/unit/vercel-gateway-models-fetch-4249.test.ts @@ -33,13 +33,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody { diff --git a/tests/unit/version-manager.test.ts b/tests/unit/version-manager.test.ts index 6aea04adc3..5279d41597 100644 --- a/tests/unit/version-manager.test.ts +++ b/tests/unit/version-manager.test.ts @@ -35,7 +35,7 @@ async function resetStorage() { for (let attempt = 0; attempt < 10; attempt++) { try { if (fs.existsSync(TEST_DATA_DIR)) { - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } break; } catch (error: any) { @@ -260,7 +260,7 @@ test.afterEach(() => { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("processManager reuses an alive persisted pid without spawning a new process", async () => { diff --git a/tests/unit/vertex-passthrough-model-lockout.test.ts b/tests/unit/vertex-passthrough-model-lockout.test.ts index 68bb5fa7b2..9a35d860ef 100644 --- a/tests/unit/vertex-passthrough-model-lockout.test.ts +++ b/tests/unit/vertex-passthrough-model-lockout.test.ts @@ -19,7 +19,7 @@ const accountFallback = await import("../../open-sse/services/accountFallback.ts async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -35,7 +35,7 @@ async function seedVertex() { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test('hasPerModelQuota("vertex", ...) is true after the passthroughModels registry flag', () => { diff --git a/tests/unit/vertex-spend-usage.test.ts b/tests/unit/vertex-spend-usage.test.ts index 4a9bb5e13b..dc239abe2f 100644 --- a/tests/unit/vertex-spend-usage.test.ts +++ b/tests/unit/vertex-spend-usage.test.ts @@ -54,7 +54,7 @@ describe("vertex self-tracked spend", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/video-combo-route.test.ts b/tests/unit/video-combo-route.test.ts index 5f9561382d..b491c22ac8 100644 --- a/tests/unit/video-combo-route.test.ts +++ b/tests/unit/video-combo-route.test.ts @@ -57,7 +57,7 @@ test.afterEach(() => { test.after(() => { core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("video route diverts a combo name to the combo executor and honors the ComfyUI local-override base URL", async () => { diff --git a/tests/unit/video-custom-provider-route.test.ts b/tests/unit/video-custom-provider-route.test.ts index 749bef97d8..9c10d6f2cb 100644 --- a/tests/unit/video-custom-provider-route.test.ts +++ b/tests/unit/video-custom-provider-route.test.ts @@ -43,7 +43,7 @@ test.afterEach(() => { test.after(() => { core.closeDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("video route uses OpenAI-compatible handler for custom provider with videos endpoint", async () => { diff --git a/tests/unit/virtual-auto-combo.test.ts b/tests/unit/virtual-auto-combo.test.ts index 4bb7e1fb49..0a1dfb4c84 100644 --- a/tests/unit/virtual-auto-combo.test.ts +++ b/tests/unit/virtual-auto-combo.test.ts @@ -17,7 +17,7 @@ type VirtualComboResult = Awaited { test.after(async () => { await resetStorage(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; diff --git a/tests/unit/volcengine-plan-connect-validation.test.ts b/tests/unit/volcengine-plan-connect-validation.test.ts index 239576f03c..a49b4994ef 100644 --- a/tests/unit/volcengine-plan-connect-validation.test.ts +++ b/tests/unit/volcengine-plan-connect-validation.test.ts @@ -39,7 +39,7 @@ const identityRoute = await import( test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function post(body: unknown): Request { diff --git a/tests/unit/vscode-responses-models.test.ts b/tests/unit/vscode-responses-models.test.ts index 71cce125cd..bed1205aa1 100644 --- a/tests/unit/vscode-responses-models.test.ts +++ b/tests/unit/vscode-responses-models.test.ts @@ -28,7 +28,7 @@ type MetadataModel = { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -39,7 +39,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("vscode model metadata routes keep Responses text-generation models", async () => { diff --git a/tests/unit/vscode-token-routes-gpt56.test.ts b/tests/unit/vscode-token-routes-gpt56.test.ts index c68a85a6b7..7589634824 100644 --- a/tests/unit/vscode-token-routes-gpt56.test.ts +++ b/tests/unit/vscode-token-routes-gpt56.test.ts @@ -25,7 +25,7 @@ interface RawModel { async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -36,7 +36,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("vscode models route preserves gateway-owned Ollama Cloud effort tiers", async () => { diff --git a/tests/unit/vscode-token-routes-responses-listing.test.ts b/tests/unit/vscode-token-routes-responses-listing.test.ts index db08e1f77a..b27ecbc23d 100644 --- a/tests/unit/vscode-token-routes-responses-listing.test.ts +++ b/tests/unit/vscode-token-routes-responses-listing.test.ts @@ -35,7 +35,7 @@ const vscodeRawShowRoute = async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -46,7 +46,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("vscode Ollama-compatible tags/show routes (token + raw) expose Codex-discovered responses-format GPT models", async () => { diff --git a/tests/unit/vscode-token-routes.test.ts b/tests/unit/vscode-token-routes.test.ts index d66118b3f2..c98fc73e2b 100644 --- a/tests/unit/vscode-token-routes.test.ts +++ b/tests/unit/vscode-token-routes.test.ts @@ -39,7 +39,7 @@ const combosDb = await import("../../src/lib/db/combos.ts"); async function resetStorage() { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -63,7 +63,7 @@ test.beforeEach(async () => { test.after(async () => { core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("vscode tokenized root route mirrors the grouped VS Code catalog without combos", async () => { diff --git a/tests/unit/warmupScheduler.test.ts b/tests/unit/warmupScheduler.test.ts index 7b77d00a85..94889de236 100644 --- a/tests/unit/warmupScheduler.test.ts +++ b/tests/unit/warmupScheduler.test.ts @@ -26,7 +26,7 @@ const providersDb = await import("../../src/lib/db/providers.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -77,7 +77,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("startWarmupScheduler: disabled → null (default)", async () => { diff --git a/tests/unit/web-fetch-dispatch.test.ts b/tests/unit/web-fetch-dispatch.test.ts index 004435305e..aca075b93a 100644 --- a/tests/unit/web-fetch-dispatch.test.ts +++ b/tests/unit/web-fetch-dispatch.test.ts @@ -33,7 +33,7 @@ function resetRuntime() { test.beforeEach(() => { resetRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); @@ -41,7 +41,7 @@ test.after(() => { builtinSkills.web_fetch = originalWebFetchHandler; resetRuntime(); coreDb.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); const contextWithFetchBuiltin = { diff --git a/tests/unit/web-fetch-quota-fallback.test.ts b/tests/unit/web-fetch-quota-fallback.test.ts index 4c7a77f595..75e1378d29 100644 --- a/tests/unit/web-fetch-quota-fallback.test.ts +++ b/tests/unit/web-fetch-quota-fallback.test.ts @@ -13,7 +13,7 @@ const webFetchRoute = await import("../../src/app/api/v1/web/fetch/route.ts"); async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -64,7 +64,7 @@ test.beforeEach(async () => { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); // ── (a) credential-time: rate-limited stub is skipped, not short-circuited ── diff --git a/tests/unit/webdav-server-3485.test.ts b/tests/unit/webdav-server-3485.test.ts index 04f0be1c34..ff7a1ef73b 100644 --- a/tests/unit/webdav-server-3485.test.ts +++ b/tests/unit/webdav-server-3485.test.ts @@ -144,7 +144,7 @@ const VAULT_ROOT = fs.mkdtempSync(path.join(os.tmpdir(), "omni-webdav-vault-")); const ORIG_KEY = process.env.STORAGE_ENCRYPTION_KEY; test.after(() => { - fs.rmSync(VAULT_ROOT, { recursive: true, force: true }); + fs.rmSync(VAULT_ROOT, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIG_KEY === undefined) { delete process.env.STORAGE_ENCRYPTION_KEY; } else { @@ -471,8 +471,8 @@ test.before(async () => { }); test.after(() => { - fs.rmSync(intDataDir, { recursive: true, force: true }); - fs.rmSync(intVaultDir, { recursive: true, force: true }); + fs.rmSync(intDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(intVaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("PUT then GET round-trips a file correctly", async () => { @@ -657,8 +657,8 @@ test("disabled WebDAV returns 503", async () => { }); assert.equal(res.status, 503); } finally { - fs.rmSync(disabledDataDir, { recursive: true, force: true }); - fs.rmSync(disabledVaultDir, { recursive: true, force: true }); + fs.rmSync(disabledDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(disabledVaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -675,7 +675,7 @@ test("no DB / missing config returns 503", async () => { }); assert.equal(res.status, 503); } finally { - fs.rmSync(emptyDataDir, { recursive: true, force: true }); + fs.rmSync(emptyDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); @@ -740,8 +740,8 @@ test("encrypted password in DB is decrypted and auth works", async () => { // OPTIONS with correct creds should succeed (200 or 207) assert.ok(res.status < 400, `Expected success with encrypted password, got ${res.status}`); } finally { - fs.rmSync(encDataDir, { recursive: true, force: true }); - fs.rmSync(encVaultDir, { recursive: true, force: true }); + fs.rmSync(encDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); + fs.rmSync(encVaultDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); // Restore encryption key state if (ORIG_KEY === undefined) { delete process.env.STORAGE_ENCRYPTION_KEY; @@ -789,6 +789,6 @@ test("resolveDataDir: parity with src/lib/dataPaths.ts across env combos", async else process.env.DATA_DIR = ORIG_DATA; if (ORIG_XDG === undefined) delete process.env.XDG_CONFIG_HOME; else process.env.XDG_CONFIG_HOME = ORIG_XDG; - fs.rmSync(tmp, { recursive: true, force: true }); + fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } }); diff --git a/tests/unit/webhook-deliveries-db.test.ts b/tests/unit/webhook-deliveries-db.test.ts index c98ba9cf7a..e469a8a29d 100644 --- a/tests/unit/webhook-deliveries-db.test.ts +++ b/tests/unit/webhook-deliveries-db.test.ts @@ -13,7 +13,7 @@ const deliveriesDb = await import("../../src/lib/db/webhookDeliveries.ts"); async function resetStorage() { coreDb.resetDbInstance(); - fs.rmSync(TEST_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DIR, { recursive: true }); } @@ -23,7 +23,7 @@ test.beforeEach(async () => { test.after(() => { coreDb.resetDbInstance(); - fs.rmSync(TEST_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("insertDelivery stores a row and getDeliveries returns it", () => { diff --git a/tests/unit/webhook-metadata-guard-3269.test.ts b/tests/unit/webhook-metadata-guard-3269.test.ts index b08396d859..f0506249b1 100644 --- a/tests/unit/webhook-metadata-guard-3269.test.ts +++ b/tests/unit/webhook-metadata-guard-3269.test.ts @@ -73,7 +73,7 @@ after(() => { /* ignore */ } try { - fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true }); + fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/webhook-private-optin-3269.test.ts b/tests/unit/webhook-private-optin-3269.test.ts index 196b9ef337..2fab410296 100644 --- a/tests/unit/webhook-private-optin-3269.test.ts +++ b/tests/unit/webhook-private-optin-3269.test.ts @@ -76,7 +76,7 @@ after(() => { /* ignore */ } try { - fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true }); + fs.rmSync(process.env.DATA_DIR as string, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { /* ignore */ } diff --git a/tests/unit/webshare-sync.test.ts b/tests/unit/webshare-sync.test.ts index 184641bf08..1995a94c68 100644 --- a/tests/unit/webshare-sync.test.ts +++ b/tests/unit/webshare-sync.test.ts @@ -21,13 +21,13 @@ const freeProxiesDb = await import("../../src/lib/db/freeProxies.ts"); async function reset() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function webshareResponse(results: unknown[], next: string | null = null) { diff --git a/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts b/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts index 0890d535e5..ee7f10d6cd 100644 --- a/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts +++ b/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts @@ -15,13 +15,13 @@ const { getModelInfo } = await import("../../src/sse/services/model.ts"); test.beforeEach(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); }); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); if (ORIGINAL_API_KEY_SECRET === undefined) { delete process.env.API_KEY_SECRET; } else { diff --git a/tests/unit/windows-cert-identity-7275.test.ts b/tests/unit/windows-cert-identity-7275.test.ts index 9d9d6bc6cf..8bb0cd8169 100644 --- a/tests/unit/windows-cert-identity-7275.test.ts +++ b/tests/unit/windows-cert-identity-7275.test.ts @@ -63,7 +63,7 @@ const { checkCertInstalled, certutilThumbprint, buildWindowsDelstoreScript } = a test.after(() => { Object.defineProperty(process, "platform", originalPlatformDescriptor); process.env.PATH = originalPath; - fs.rmSync(tmpRoot, { recursive: true, force: true }); + fs.rmSync(tmpRoot, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function fakeCertFile(seed: string): string { diff --git a/tests/unit/xai-oauth-usage.test.ts b/tests/unit/xai-oauth-usage.test.ts index 5060afa385..52a3170d88 100644 --- a/tests/unit/xai-oauth-usage.test.ts +++ b/tests/unit/xai-oauth-usage.test.ts @@ -92,7 +92,7 @@ describe("xAI OAuth usage dispatch", () => { globalThis.fetch = originalFetch; core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/xai-usage.test.ts b/tests/unit/xai-usage.test.ts index 5e027f3c2d..dd4b21a203 100644 --- a/tests/unit/xai-usage.test.ts +++ b/tests/unit/xai-usage.test.ts @@ -65,7 +65,7 @@ describe("xAI self-tracked usage", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/xiaomi-mimo-selftrack-usage.test.ts b/tests/unit/xiaomi-mimo-selftrack-usage.test.ts index f84af5f61f..f10c706c9b 100644 --- a/tests/unit/xiaomi-mimo-selftrack-usage.test.ts +++ b/tests/unit/xiaomi-mimo-selftrack-usage.test.ts @@ -64,7 +64,7 @@ describe("xiaomi-mimo self-tracked quota", () => { after(() => { core.resetDbInstance(); try { - fs.rmSync(TMP, { recursive: true, force: true }); + fs.rmSync(TMP, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); } catch { // best-effort temp cleanup } diff --git a/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts b/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts index 70ff6ec557..a15455cc48 100644 --- a/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts +++ b/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts @@ -15,7 +15,7 @@ const { test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7364 Defect B: zai/glm-4.6v max_tokens above the 32768 ceiling is clamped before dispatch", () => { diff --git a/tests/unit/zai-glm-target-format-override.test.ts b/tests/unit/zai-glm-target-format-override.test.ts index 44ef3d5033..506e84372d 100644 --- a/tests/unit/zai-glm-target-format-override.test.ts +++ b/tests/unit/zai-glm-target-format-override.test.ts @@ -14,7 +14,7 @@ const { DefaultExecutor } = await import("../../open-sse/executors/default.ts"); test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("#7364 Defect A (URL): DefaultExecutor.buildUrl('zai', ...) ignores a per-model targetFormat:'openai' override and still returns the Anthropic Messages URL", () => { diff --git a/tests/unit/zai-web-model-sync-route.test.ts b/tests/unit/zai-web-model-sync-route.test.ts index 58f340198e..2ceb261c1d 100644 --- a/tests/unit/zai-web-model-sync-route.test.ts +++ b/tests/unit/zai-web-model-sync-route.test.ts @@ -24,7 +24,7 @@ async function resetStorage() { modelSyncRoute.__resetLoopbackReadinessForTests(); core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -32,7 +32,7 @@ test.after(() => { globalThis.fetch = originalFetch; core.resetDbInstance(); apiKeysDb.resetApiKeyState(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("curated zai-web sync removes stale imported models without touching manual models", async () => { diff --git a/tests/unit/zai-web-models-discovery-7678.test.ts b/tests/unit/zai-web-models-discovery-7678.test.ts index 678bddee88..82837c541f 100644 --- a/tests/unit/zai-web-models-discovery-7678.test.ts +++ b/tests/unit/zai-web-models-discovery-7678.test.ts @@ -17,13 +17,13 @@ const CURATED_ZAI_WEB_MODEL_IDS = ["glm-5.2", "GLM-5.1", "GLM-5-Turbo", "GLM-5v- async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("zai-web publishes the live reasoning and vision capabilities", () => { diff --git a/tests/unit/zcode-executor.test.ts b/tests/unit/zcode-executor.test.ts index db4a8586be..50113e06e6 100644 --- a/tests/unit/zcode-executor.test.ts +++ b/tests/unit/zcode-executor.test.ts @@ -8,7 +8,7 @@ const fixture = join(process.cwd(), "tests/fixtures/fake-zcode-app-server.mjs"); const TEST_DATA_DIR = mkdtempSync(join(tmpdir(), "omniroute-zcode-")); process.env.DATA_DIR = TEST_DATA_DIR; -test.after(() => rmSync(TEST_DATA_DIR, { recursive: true, force: true })); +test.after(() => rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 })); async function loadZcodeExecutor() { return import("../../open-sse/executors/zcode.ts"); diff --git a/tests/unit/zed-hosted-models-discovery-route.test.ts b/tests/unit/zed-hosted-models-discovery-route.test.ts index 8d97931c48..2c8c543a66 100644 --- a/tests/unit/zed-hosted-models-discovery-route.test.ts +++ b/tests/unit/zed-hosted-models-discovery-route.test.ts @@ -36,7 +36,7 @@ async function resetStorage() { globalThis.fetch = originalFetch; zedAuth.clearZedCaches(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } @@ -67,7 +67,7 @@ test.after(async () => { globalThis.fetch = originalFetch; zedAuth.clearZedCaches(); core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); test("zed-hosted model discovery mints an LLM token and lists the live catalog", async () => { diff --git a/tests/unit/zenmux-models-fetch-4202.test.ts b/tests/unit/zenmux-models-fetch-4202.test.ts index 4a4f60585b..6dda35f631 100644 --- a/tests/unit/zenmux-models-fetch-4202.test.ts +++ b/tests/unit/zenmux-models-fetch-4202.test.ts @@ -29,13 +29,13 @@ const modelsRoute = await import("../../src/app/api/providers/[id]/models/route. async function resetStorage() { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); } test.after(() => { core.resetDbInstance(); - fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); + fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); interface ModelsBody {