From e35bc2fe153952932d39e2d1b942ff7072e7e288 Mon Sep 17 00:00:00 2001 From: Lex Christopherson Date: Sun, 22 Mar 2026 10:12:42 -0600 Subject: [PATCH] fix(tests): wrap rmSync cleanup in try/catch for Windows EPERM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit maxRetries doesn't help with EPERM (only EBUSY/EMFILE/ENFILE). Windows holds directory handles after close, making rmSync fail in afterEach. Swallowing the error is safe — OS cleans temp dirs. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../gsd/tests/commands-workflow-custom.test.ts | 2 +- .../tests/custom-engine-loop-integration.test.ts | 2 +- .../gsd/tests/custom-workflow-engine.test.ts | 2 +- .../gsd/tests/definition-loader.test.ts | 16 ++++++++-------- .../e2e-workflow-pipeline-integration.test.ts | 2 +- .../gsd/tests/graph-operations.test.ts | 2 +- .../gsd/tests/iterate-engine-integration.test.ts | 2 +- .../extensions/gsd/tests/run-manager.test.ts | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts b/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts index 7f80367a9..16642a7eb 100644 --- a/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +++ b/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts @@ -36,7 +36,7 @@ afterEach(() => { process.chdir(savedCwd); } for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } tmpDirs.length = 0; }); diff --git a/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts b/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts index bd7474aa8..ec7d89514 100644 --- a/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +++ b/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts @@ -32,7 +32,7 @@ function makeTmpDir(): string { afterEach(() => { _resetPendingResolve(); for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM — OS cleans up temp dirs */ } } tmpDirs.length = 0; }); diff --git a/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts b/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts index 0ba53de99..3fbb3bd57 100644 --- a/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +++ b/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts @@ -29,7 +29,7 @@ function makeTmpDir(): string { afterEach(() => { for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } tmpDirs.length = 0; }); diff --git a/src/resources/extensions/gsd/tests/definition-loader.test.ts b/src/resources/extensions/gsd/tests/definition-loader.test.ts index 3cf425813..55d3d9dfc 100644 --- a/src/resources/extensions/gsd/tests/definition-loader.test.ts +++ b/src/resources/extensions/gsd/tests/definition-loader.test.ts @@ -90,7 +90,7 @@ test("loadDefinition: valid 3-step YAML returns correct structure", () => { assert.deepEqual(def.steps[2].requires, ["outline"]); assert.deepEqual(def.steps[2].produces, ["draft.md"]); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -235,7 +235,7 @@ test("loadDefinition: missing file → descriptive error", () => { }, ); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -258,7 +258,7 @@ steps: }, ); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -281,7 +281,7 @@ steps: const def = loadDefinition(dir, "test-workflow"); assert.deepEqual(def.steps[1].requires, ["first"]); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -302,7 +302,7 @@ steps: const def = loadDefinition(dir, "test-workflow"); assert.deepEqual(def.steps[1].contextFrom, ["first"]); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -738,7 +738,7 @@ steps: const def = loadDefinition(dir, "test-workflow"); assert.equal(def.params, undefined); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -755,7 +755,7 @@ steps: const def = loadDefinition(dir, "test-workflow"); assert.equal(def.description, undefined); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); @@ -773,6 +773,6 @@ steps: assert.deepEqual(def.steps[0].requires, []); assert.deepEqual(def.steps[0].produces, []); } finally { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } }); diff --git a/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts b/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts index a78cfd6da..419ac5762 100644 --- a/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +++ b/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts @@ -52,7 +52,7 @@ function makeTmpDir(): string { afterEach(() => { for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } tmpDirs.length = 0; }); diff --git a/src/resources/extensions/gsd/tests/graph-operations.test.ts b/src/resources/extensions/gsd/tests/graph-operations.test.ts index 9c18aa282..229557c0d 100644 --- a/src/resources/extensions/gsd/tests/graph-operations.test.ts +++ b/src/resources/extensions/gsd/tests/graph-operations.test.ts @@ -32,7 +32,7 @@ function makeTmpDir(): string { } function cleanupDir(dir: string): void { - rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } /** Minimal valid graph for testing. */ diff --git a/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts b/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts index 78a90c2f1..c103095e9 100644 --- a/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +++ b/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts @@ -39,7 +39,7 @@ function makeTmpDir(): string { afterEach(() => { for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } tmpDirs.length = 0; }); diff --git a/src/resources/extensions/gsd/tests/run-manager.test.ts b/src/resources/extensions/gsd/tests/run-manager.test.ts index 3db024b64..a86431547 100644 --- a/src/resources/extensions/gsd/tests/run-manager.test.ts +++ b/src/resources/extensions/gsd/tests/run-manager.test.ts @@ -34,7 +34,7 @@ function makeTmpBase(): string { afterEach(() => { for (const d of tmpDirs) { - rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); + try { rmSync(d, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM */ } } tmpDirs.length = 0; });