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",