import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { captureEnv } from "../test-utils/env.js"; import { ensureChromeExtensionRelayServer, stopChromeExtensionRelayServer, } from "./extension-relay.js"; import { getFreePort } from "./test-port.js"; describe("chrome extension relay bindHost coordination", () => { let cdpUrl = ""; let envSnapshot: ReturnType; beforeEach(() => { envSnapshot = captureEnv(["OPENCLAW_GATEWAY_TOKEN"]); process.env.OPENCLAW_GATEWAY_TOKEN = "test-gateway-token"; }); afterEach(async () => { if (cdpUrl) { await stopChromeExtensionRelayServer({ cdpUrl }).catch(() => {}); cdpUrl = ""; } envSnapshot.restore(); }); it("rebinds the relay when concurrent callers request different bind hosts", async () => { const port = await getFreePort(); cdpUrl = `http://127.0.0.1:${port}`; const [first, second] = await Promise.all([ ensureChromeExtensionRelayServer({ cdpUrl }), ensureChromeExtensionRelayServer({ cdpUrl, bindHost: "0.0.0.0" }), ]); const settled = await ensureChromeExtensionRelayServer({ cdpUrl, bindHost: "0.0.0.0", }); expect(first.port).toBe(port); expect(second.port).toBe(port); expect(second).not.toBe(first); expect(second.bindHost).toBe("0.0.0.0"); expect(settled).toBe(second); const res = await fetch(`http://127.0.0.1:${port}/`); expect(res.status).toBe(200); }); });