test(browser): dedupe relay probe server scaffolding

This commit is contained in:
Peter Steinberger
2026-02-21 23:02:42 +00:00
parent 16f6b55cd4
commit 4c8545ad53

View File

@@ -1,4 +1,5 @@
import { createServer } from "node:http"; import { createServer } from "node:http";
import type { AddressInfo } from "node:net";
import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { import {
probeAuthenticatedOpenClawRelay, probeAuthenticatedOpenClawRelay,
@@ -6,6 +7,24 @@ import {
} from "./extension-relay-auth.js"; } from "./extension-relay-auth.js";
import { getFreePort } from "./test-port.js"; import { getFreePort } from "./test-port.js";
async function withRelayServer(
handler: Parameters<typeof createServer>[0],
run: (params: { port: number }) => Promise<void>,
) {
const port = await getFreePort();
const server = createServer(handler);
await new Promise<void>((resolve, reject) => {
server.listen(port, "127.0.0.1", () => resolve());
server.once("error", reject);
});
try {
const actualPort = (server.address() as AddressInfo).port;
await run({ port: actualPort });
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
}
}
describe("extension-relay-auth", () => { describe("extension-relay-auth", () => {
const TEST_GATEWAY_TOKEN = "test-gateway-token"; const TEST_GATEWAY_TOKEN = "test-gateway-token";
let prevGatewayToken: string | undefined; let prevGatewayToken: string | undefined;
@@ -33,88 +52,73 @@ describe("extension-relay-auth", () => {
}); });
it("accepts authenticated openclaw relay probe responses", async () => { it("accepts authenticated openclaw relay probe responses", async () => {
const port = await getFreePort();
const token = resolveRelayAuthTokenForPort(port);
let seenToken: string | undefined; let seenToken: string | undefined;
const server = createServer((req, res) => { await withRelayServer(
if (!req.url?.startsWith("/json/version")) { (req, res) => {
res.writeHead(404); if (!req.url?.startsWith("/json/version")) {
res.end("not found"); res.writeHead(404);
return; res.end("not found");
} return;
const header = req.headers["x-openclaw-relay-token"]; }
seenToken = Array.isArray(header) ? header[0] : header; const header = req.headers["x-openclaw-relay-token"];
res.writeHead(200, { "Content-Type": "application/json" }); seenToken = Array.isArray(header) ? header[0] : header;
res.end(JSON.stringify({ Browser: "OpenClaw/extension-relay" })); res.writeHead(200, { "Content-Type": "application/json" });
}); res.end(JSON.stringify({ Browser: "OpenClaw/extension-relay" }));
await new Promise<void>((resolve, reject) => { },
server.listen(port, "127.0.0.1", () => resolve()); async ({ port }) => {
server.once("error", reject); const token = resolveRelayAuthTokenForPort(port);
}); const ok = await probeAuthenticatedOpenClawRelay({
try { baseUrl: `http://127.0.0.1:${port}`,
const ok = await probeAuthenticatedOpenClawRelay({ relayAuthHeader: "x-openclaw-relay-token",
baseUrl: `http://127.0.0.1:${port}`, relayAuthToken: token,
relayAuthHeader: "x-openclaw-relay-token", });
relayAuthToken: token, expect(ok).toBe(true);
}); expect(seenToken).toBe(token);
expect(ok).toBe(true); },
expect(seenToken).toBe(token); );
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
}
}); });
it("rejects unauthenticated probe responses", async () => { it("rejects unauthenticated probe responses", async () => {
const port = await getFreePort(); await withRelayServer(
const server = createServer((req, res) => { (req, res) => {
if (!req.url?.startsWith("/json/version")) { if (!req.url?.startsWith("/json/version")) {
res.writeHead(404); res.writeHead(404);
res.end("not found"); res.end("not found");
return; return;
} }
res.writeHead(401); res.writeHead(401);
res.end("Unauthorized"); res.end("Unauthorized");
}); },
await new Promise<void>((resolve, reject) => { async ({ port }) => {
server.listen(port, "127.0.0.1", () => resolve()); const ok = await probeAuthenticatedOpenClawRelay({
server.once("error", reject); baseUrl: `http://127.0.0.1:${port}`,
}); relayAuthHeader: "x-openclaw-relay-token",
try { relayAuthToken: "irrelevant",
const ok = await probeAuthenticatedOpenClawRelay({ });
baseUrl: `http://127.0.0.1:${port}`, expect(ok).toBe(false);
relayAuthHeader: "x-openclaw-relay-token", },
relayAuthToken: "irrelevant", );
});
expect(ok).toBe(false);
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
}
}); });
it("rejects probe responses with wrong browser identity", async () => { it("rejects probe responses with wrong browser identity", async () => {
const port = await getFreePort(); await withRelayServer(
const server = createServer((req, res) => { (req, res) => {
if (!req.url?.startsWith("/json/version")) { if (!req.url?.startsWith("/json/version")) {
res.writeHead(404); res.writeHead(404);
res.end("not found"); res.end("not found");
return; return;
} }
res.writeHead(200, { "Content-Type": "application/json" }); res.writeHead(200, { "Content-Type": "application/json" });
res.end(JSON.stringify({ Browser: "FakeRelay" })); res.end(JSON.stringify({ Browser: "FakeRelay" }));
}); },
await new Promise<void>((resolve, reject) => { async ({ port }) => {
server.listen(port, "127.0.0.1", () => resolve()); const ok = await probeAuthenticatedOpenClawRelay({
server.once("error", reject); baseUrl: `http://127.0.0.1:${port}`,
}); relayAuthHeader: "x-openclaw-relay-token",
try { relayAuthToken: "irrelevant",
const ok = await probeAuthenticatedOpenClawRelay({ });
baseUrl: `http://127.0.0.1:${port}`, expect(ok).toBe(false);
relayAuthHeader: "x-openclaw-relay-token", },
relayAuthToken: "irrelevant", );
});
expect(ok).toBe(false);
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
}
}); });
}); });