From cb9740b78dcfc7e7eb378c58cb692024a78f6677 Mon Sep 17 00:00:00 2001 From: anhtahaylove <37265396+anhtahaylove@users.noreply.github.com> Date: Thu, 17 Sep 2026 12:32:10 +0700 Subject: [PATCH] fix(adobe-firefly): do not spawn Chrome for CDP warm under test runners (#13289) The CDP session-warm path gated only on ADOBE_FIREFLY_BROWSER_REFRESH, so a unit test exercising the image-edit route spawned a real headed Chrome. The browser holds an OS handle on its profile directory under DATA_DIR, so teardown that rmSync()s the temp DATA_DIR failed with EPERM on Windows, and the CDP socket kept the runner alive for the full 75s warm timeout. Gate the browser path on the same test-runner detection diskSessionsEnabled() already uses. 8510-adobe-firefly-edits-route: 1 pass/4 fail in 63s -> 4 pass/0 fail in 2.5s. --- .../adobe-firefly-no-browser-spawn-in-tests.md | 1 + open-sse/services/adobeFireflySession.ts | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 changelog.d/fixes/adobe-firefly-no-browser-spawn-in-tests.md diff --git a/changelog.d/fixes/adobe-firefly-no-browser-spawn-in-tests.md b/changelog.d/fixes/adobe-firefly-no-browser-spawn-in-tests.md new file mode 100644 index 0000000000..2d577763b2 --- /dev/null +++ b/changelog.d/fixes/adobe-firefly-no-browser-spawn-in-tests.md @@ -0,0 +1 @@ +- **fix(adobe-firefly):** never spawn a real Chrome for CDP session warm under a unit-test runner, so tests stop leaking a browser process that holds an OS handle on its DATA_DIR profile directory diff --git a/open-sse/services/adobeFireflySession.ts b/open-sse/services/adobeFireflySession.ts index 552c009d12..2423b0537c 100644 --- a/open-sse/services/adobeFireflySession.ts +++ b/open-sse/services/adobeFireflySession.ts @@ -133,7 +133,7 @@ const FORTER_PROACTIVE_WARM_MS = 3 * 60_000; * "1" still enables it; any other value (including unset) now also enables it. */ export function adobeFireflyBrowserEnabled(): boolean { - return process.env.ADOBE_FIREFLY_BROWSER_REFRESH !== "0"; + return browserRefreshEnabled(); } /** Persist sessions under DATA_DIR so restarts keep JWT + last cookie. */ const SESSION_DIR_NAME = "adobe-firefly-sessions"; @@ -430,6 +430,19 @@ export function estimateAdobeTokenExpiry(accessToken: string): number { return Date.now() + 20 * 60 * 60_000; } +/** + * Spawning a real Chrome is never valid under a unit-test runner. The browser holds + * an OS handle on its profile directory under DATA_DIR, so a test that rmSync()s its + * temp DATA_DIR in teardown fails with EPERM on Windows, and the CDP socket keeps the + * runner alive for the full 75s warm timeout. + */ +function browserRefreshEnabled(): boolean { + if (process.env.ADOBE_FIREFLY_BROWSER_REFRESH === "0") return false; + if (process.env.NODE_ENV === "test") return false; + if (process.env.VITEST || process.env.NODE_TEST_CONTEXT) return false; + return true; +} + function diskSessionsEnabled(): boolean { // Unit tests and explicit opt-out skip durable disk cache (avoids sticky IMS skips). if (process.env.ADOBE_FIREFLY_SESSION_DISK === "0") return false; @@ -954,8 +967,7 @@ export async function rotateAdobeFireflySessionOnError( clearAdobeFireflyWorkingArp(session.fingerprint); noteAdobeFireflySubmitFailure(); - const tryBrowser = - opts?.tryBrowser !== false && process.env.ADOBE_FIREFLY_BROWSER_REFRESH !== "0"; + const tryBrowser = opts?.tryBrowser !== false && browserRefreshEnabled(); if (tryBrowser) { opts?.log?.info?.( "ADOBE-FIREFLY",