aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorIgor Soarez <igor@soarez.org>2026-10-17 13:20:04 +0300
committerIgor Soarez <igor@soarez.org>2026-10-17 13:20:04 +0300
commitf61c43418d704cccb67132540ed7feceacef1d2a (patch)
tree8741f1683b2bffc9e2437beede9cc1fbbf4a3452 /test
parent99d5702cb2ff0ead8e3a2b7a95fd057eefa89862 (diff)
Start a local Chrome when the target is an explicit local and none answers
Dedicated profile (~/.chrome-cdp-profile), macOS only, never for the castle default. BU_LOCAL_CHROME_LAUNCH=off disables it.
Diffstat (limited to 'test')
-rw-r--r--test/cdp/local-launch-test.ts53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/cdp/local-launch-test.ts b/test/cdp/local-launch-test.ts
new file mode 100644
index 0000000..27915d9
--- /dev/null
+++ b/test/cdp/local-launch-test.ts
@@ -0,0 +1,53 @@
+import { test, describe } from "node:test";
+import assert from "node:assert/strict";
+import { launchLocalChrome, planLocalLaunch, type LaunchDeps, type LaunchPlan } from "../../src/cdp/local-launch";
+
+const plan: LaunchPlan = { exe: "/x/chrome", args: ["--a"], profileDir: "/p", port: 9222 };
+
+const deps = (over: Partial<LaunchDeps>): LaunchDeps => {
+ let t = 0;
+ return { start: async () => undefined, probe: async () => null, sleep: async (ms) => { t += ms; }, now: () => t, ...over };
+};
+
+describe("planLocalLaunch", () => {
+ test("plans a launch on macOS with the dedicated profile and the debugging port", () => {
+ const r = planLocalLaunch({ HOME: "/h" }, "darwin", () => true);
+ assert.equal(r.kind, "plan");
+ if (r.kind !== "plan") return;
+ assert.ok(r.plan.args.includes("--remote-debugging-port=9222"));
+ assert.ok(r.plan.args.some((a) => a.startsWith("--user-data-dir=") && a.endsWith(".chrome-cdp-profile")));
+ });
+
+ test("BU_LOCAL_CHROME_PROFILE and BU_LOCAL_CHROME_EXE override the defaults", () => {
+ const r = planLocalLaunch({ BU_LOCAL_CHROME_PROFILE: "/tmp/p", BU_LOCAL_CHROME_EXE: "/tmp/c" }, "darwin", () => true);
+ assert.equal(r.kind === "plan" && r.plan.exe, "/tmp/c");
+ assert.ok(r.kind === "plan" && r.plan.args.includes("--user-data-dir=/tmp/p"));
+ });
+
+ test("is skipped when switched off, off macOS, or without a Chrome", () => {
+ assert.equal(planLocalLaunch({ BU_LOCAL_CHROME_LAUNCH: "off" }, "darwin", () => true).kind, "skip");
+ assert.equal(planLocalLaunch({}, "linux", () => true).kind, "skip");
+ assert.equal(planLocalLaunch({}, "darwin", () => false).kind, "skip");
+ });
+});
+
+describe("launchLocalChrome", () => {
+ test("resolves with the websocket url once the port answers", async () => {
+ let calls = 0;
+ const r = await launchLocalChrome(plan, deps({ probe: async () => (++calls >= 3 ? "ws://127.0.0.1:9222/x" : null) }));
+ assert.deepEqual(r.success && r.data, "ws://127.0.0.1:9222/x");
+ });
+
+ test("reports a spawn failure without probing", async () => {
+ let probed = false;
+ const r = await launchLocalChrome(plan, deps({ start: async () => "ENOENT", probe: async () => { probed = true; return null; } }));
+ assert.equal(r.success, false);
+ assert.equal(probed, false);
+ });
+
+ test("gives up after the deadline and says what to check", async () => {
+ const r = await launchLocalChrome(plan, deps({}));
+ assert.equal(r.success, false);
+ if (!r.success) assert.match(r.error, /nothing answered on 127\.0\.0\.1:9222/);
+ });
+});