Files
16gagent/test/baseline/test-01-gateway-startup.test.mjs
T
2026-06-06 10:40:48 +08:00

92 lines
3.5 KiB
JavaScript

/**
* PR-A Baseline Test 01: Gateway Startup
* Verifies: gateway process is running and reachable
* Freezes: gateway startup contract
*/
import { describe, it } from "node:test";
import assert from "node:assert";
import { execSync } from "node:child_process";
import { request } from "node:http";
import { readFileSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
const AGENTS_HOME = join(homedir(), ".openclaw");
let _config, _port;
function loadConfig() {
if (!_config) {
_config = JSON.parse(readFileSync(join(AGENTS_HOME, "openclaw.json"), "utf8"));
_port = _config?.gateway?.port || 18789;
}
return { config: _config, gatewayPort: _port };
}
function httpGet(host, port, path) {
return new Promise((resolve, reject) => {
const req = request({ hostname: host, port, path, method: "GET", timeout: 10000 }, (res) => {
let body = "";
res.on("data", (d) => (body += d));
res.on("end", () => resolve({ status: res.statusCode, body }));
});
req.on("error", reject);
req.on("timeout", () => { req.destroy(); reject(new Error("timeout")); });
req.end();
});
}
describe("test-01: Gateway Startup Baseline", () => {
it("01.01 - gateway config exists", () => {
const { config } = loadConfig();
assert.ok(config, "config should be loaded");
assert.ok(config.gateway, "gateway section should exist");
});
it("01.02 - gateway bind port is defined", () => {
const { gatewayPort } = loadConfig();
assert.ok(gatewayPort > 0 && gatewayPort < 65536, `port ${gatewayPort} must be valid`);
});
it("01.03 - gateway is reachable via HTTP", async () => {
const { gatewayPort } = loadConfig();
const result = await httpGet("127.0.0.1", gatewayPort, "/");
assert.ok(result.status >= 200 && result.status < 400,
`gateway HTTP must respond with 2xx/3xx, got ${result.status}`);
});
it("01.04 - gateway status reports running", () => {
const out = execSync("openclaw status --json 2>/dev/null", { timeout: 15000, encoding: "utf8" }).trim();
assert.ok(out.length > 0, "openclaw status must produce output");
try {
const s = JSON.parse(out);
assert.ok(s, "status must be valid JSON");
} catch {
assert.ok(!out.toLowerCase().includes("error"), "status must not report error");
}
});
it("01.05 - gateway process is not crashing (baseline snapshot)", () => {
const out = execSync("openclaw status 2>&1", { timeout: 15000, encoding: "utf8" }).trim();
const isRunning = out.includes("running") || out.includes("active") || out.includes("reachable");
console.log("[BASELINE] gateway status snapshot:", out.substring(0, 300));
assert.ok(isRunning, "gateway must be running");
});
it("01.06 - memory index is accessible", () => {
const out = execSync("openclaw memory status --json 2>/dev/null", { timeout: 15000, encoding: "utf8" }).trim();
const s = JSON.parse(out);
assert.ok(Array.isArray(s) && s.length > 0, "at least one agent memory entry");
const main = s.find((e) => e.agentId === "main");
assert.ok(main, "main agent must have memory");
console.log("[BASELINE] memory backend: %s, files: %d, chunks: %d",
main.status.backend, main.status.files, main.status.chunks);
});
it("01.07 - gateway auth mode recorded", () => {
const { config } = loadConfig();
const mode = config?.gateway?.auth?.mode;
console.log("[BASELINE] gateway auth mode:", mode);
assert.ok(mode, "gateway auth mode must be defined");
});
});