@@ -30,7 +30,9 @@ vi.mock("openclaw/plugin-sdk/ssrf-runtime-internal", () => ({
|
30 | 30 | registerManagedProxyBrowserCdpBypass: registerManagedProxyBrowserCdpBypassMock, |
31 | 31 | })); |
32 | 32 | |
33 | | -const ensurePortAvailableMock = vi.hoisted(() => vi.fn(async () => {})); |
| 33 | +const ensurePortAvailableMock = vi.hoisted(() => |
| 34 | +vi.fn<(port: number, host?: string) => Promise<void>>(async () => {}), |
| 35 | +); |
34 | 36 | |
35 | 37 | vi.mock("../infra/ports.js", () => ({ |
36 | 38 | ensurePortAvailable: ensurePortAvailableMock, |
@@ -524,6 +526,7 @@ describe("chrome.ts internal", () => {
|
524 | 526 | color: "#FF4500", |
525 | 527 | cdpPort, |
526 | 528 | cdpUrl: `http://127.0.0.1:${cdpPort}`, |
| 529 | +cdpHost: "127.0.0.1", |
527 | 530 | cdpIsLoopback: true, |
528 | 531 | }) as unknown as ResolvedBrowserProfile; |
529 | 532 | |
@@ -559,8 +562,33 @@ describe("chrome.ts internal", () => {
|
559 | 562 | await expect(launchOpenClawChrome(makeResolved(), profile)).rejects.toThrow( |
560 | 563 | /No supported browser found/, |
561 | 564 | ); |
| 565 | +expect(ensurePortAvailableMock).toHaveBeenCalledWith(51111, "127.0.0.1"); |
562 | 566 | }); |
563 | 567 | |
| 568 | +it.each([ |
| 569 | +{ cdpUrl: "http://[::1]:51111", configuredProbeHost: "::1" }, |
| 570 | +{ cdpUrl: "http://localhost:51111", configuredProbeHost: "localhost" }, |
| 571 | +])( |
| 572 | +"checks Chrome's IPv4 bind and the configured $configuredProbeHost endpoint", |
| 573 | +async ({ cdpUrl, configuredProbeHost }) => { |
| 574 | +vi.spyOn(fs, "existsSync").mockReturnValue(false); |
| 575 | +const portBusy = new Error("Port is already in use."); |
| 576 | +portBusy.name = "PortInUseError"; |
| 577 | +ensurePortAvailableMock.mockImplementation(async (_port, host) => { |
| 578 | +if (host === configuredProbeHost) { |
| 579 | +throw portBusy; |
| 580 | +} |
| 581 | +}); |
| 582 | +const profile = { ...makeProfile(51111), cdpUrl }; |
| 583 | + |
| 584 | +await expect(launchOpenClawChrome(makeResolved(), profile)).rejects.toThrow(portBusy); |
| 585 | +expect(ensurePortAvailableMock.mock.calls).toEqual([ |
| 586 | +[51111, "127.0.0.1"], |
| 587 | +[51111, configuredProbeHost], |
| 588 | +]); |
| 589 | +}, |
| 590 | +); |
| 591 | + |
564 | 592 | it("completes successfully when Chrome reports /json/version and CDP is reachable", async () => { |
565 | 593 | // Mock executable discovery to a truthy path. |
566 | 594 | vi.spyOn(fs, "existsSync").mockImplementation((p) => { |
|