aboutsummaryrefslogtreecommitdiff
path: root/test/manual/daemon-transport-test.ts
blob: 30f5a29d533504f10692fce9bada18144749e5c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { createIpcServer } from "../../src/daemon/server";
import { createDaemonTransport } from "../../src/daemon/transport";
import { DAEMON_SOCKET_PATH } from "../../src/daemon/protocol";
import type { WireMessage } from "../../src/daemon/protocol";
import { unlinkSync } from "node:fs";

let passed = 0;
let failed = 0;
const check = (cond: boolean, label: string) => {
  if (cond) { passed++; console.log(`  ✓ ${label}`); }
  else { failed++; console.error(`  ✗ ${label}`); }
};

async function main() {
  try { unlinkSync(DAEMON_SOCKET_PATH); } catch {}

  console.log("Starting IpcServer...");
  const server = createIpcServer();

  server.onMessage((msg, client) => {
    if (msg.type === "request") {
      const reply: WireMessage = {
        type: "response",
        id: msg.id,
        result: { fakeResult: true, method: msg.method },
      };
      server.send(client.id, reply);
    }
  });

  await server.start();
  console.log("Server started ✓");

  const transport = createDaemonTransport("pi-test-transport");

  const connResult = await transport.connect("");
  check(connResult.success, `Connect: ${connResult.success ? "ok" : connResult.error.message}`);
  check(transport.state() === "open", `State is "open" (actual: "${transport.state()}")`);

  const reqResult = await transport.request("Page.navigate", { url: "https://example.com" });
  check(reqResult.success, `Request succeeded: ${reqResult.success}`);
  if (reqResult.success) {
    const data = reqResult.data as any;
    check(data?.fakeResult === true, "Response has fakeResult: true");
    check(data?.method === "Page.navigate", "Response echoes method");
  }

  const req2 = await transport.request("Runtime.evaluate", { expression: "1+1" }, { sessionId: "abc123" });
  check(req2.success, "Request with sessionId succeeded");

  const eventPromise = new Promise<boolean>((resolve) => {
    const timeout = setTimeout(() => resolve(false), 2000);
    (async () => {
      for await (const evt of transport.events()) {
        clearTimeout(timeout);
        resolve(evt.method === "Target.targetCreated");
        break;
      }
    })();
  });

  server.broadcast({
    type: "event",
    method: "Target.targetCreated",
    params: { targetInfo: { type: "page", targetId: "test-123" } },
  });

  const gotEvent = await eventPromise;
  check(gotEvent, "Event received via transport.events()");

  let closeFired = false;
  transport.onClose(() => { closeFired = true; });

  await transport.close();
  check(transport.state() === "closed", "State is closed after close()");
  check(closeFired, "onClose handler fired");

  await new Promise(r => setTimeout(r, 500));
  const reconnectResult = await transport.connect("");
  check(reconnectResult.success, `Reconnect: ${reconnectResult.success ? "ok" : reconnectResult.error.message}`);

  const req3 = await transport.request("Browser.getVersion", {});
  check(req3.success, "Request after reconnect succeeded");

  await transport.close();
  await server.stop();
  console.log("Cleanup complete ✓");

  console.log(`\n${passed} passed, ${failed} failed`);
  process.exit(failed > 0 ? 1 : 0);
}

main().catch((e) => {
  console.error("Test failed:", e);
  process.exit(1);
});