From a0c4b1e061895f269de6dd30c8711029807dbe64 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 17 Dec 2025 19:14:47 +0000 Subject: [PATCH] test(web): avoid ENOTEMPTY cleanup race --- src/web/auto-reply.test.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/web/auto-reply.test.ts b/src/web/auto-reply.test.ts index 92b0f78d5..e42d70c87 100644 --- a/src/web/auto-reply.test.ts +++ b/src/web/auto-reply.test.ts @@ -35,6 +35,28 @@ import { let previousHome: string | undefined; let tempHome: string | undefined; +const rmDirWithRetries = async (dir: string): Promise => { + // Some tests can leave async session-store writes in-flight; recursive deletion can race and throw ENOTEMPTY. + for (let attempt = 0; attempt < 10; attempt += 1) { + try { + await fs.rm(dir, { recursive: true, force: true }); + return; + } catch (err) { + const code = + err && typeof err === "object" && "code" in err + ? String((err as { code?: unknown }).code) + : null; + if (code === "ENOTEMPTY" || code === "EBUSY" || code === "EPERM") { + await new Promise((resolve) => setTimeout(resolve, 25)); + continue; + } + throw err; + } + } + + await fs.rm(dir, { recursive: true, force: true }); +}; + beforeEach(async () => { previousHome = process.env.HOME; tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-web-home-")); @@ -44,7 +66,7 @@ beforeEach(async () => { afterEach(async () => { process.env.HOME = previousHome; if (tempHome) { - await fs.rm(tempHome, { recursive: true, force: true }); + await rmDirWithRetries(tempHome); tempHome = undefined; } });