// Docker E2E Observability tests cover docker e2e observability script behavior. import { spawnSync } from "node:child_process"; import { readFileSync, writeFileSync } from "node:fs"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { useAutoCleanupTempDirTracker } from "../helpers/temp-dir.js"; const tempDirs = useAutoCleanupTempDirTracker(afterEach); function successTail(scriptPath: string): string { const script = readFileSync(scriptPath, "utf8"); const index = script.lastIndexOf('if [ "$status" -ne 0 ]; then'); if (index === -1) { throw new Error(`missing status tail in ${scriptPath}`); } return script.slice(index); } function runSuccessTail(scriptPath: string) { const tempDir = tempDirs.make("openclaw-docker-e2e-observability-"); const clientLog = path.join(tempDir, "client.log"); writeFileSync(clientLog, "client proof log\n", "utf8"); const harness = [ "set -euo pipefail", `CLIENT_LOG=${JSON.stringify(clientLog)}`, "status=0", "docker_e2e_print_log() {", ' printf \'LOG:%s\\n\' "$(cat "$1")"', "}", successTail(scriptPath), ].join("\n"); return spawnSync("bash", ["-c", harness], { encoding: "utf8" }); } describe("Docker E2E observability", () => { it("feeds the cron CLI Docker proof body through container stdin", () => { const script = readFileSync("scripts/e2e/cron-cli-docker.sh", "utf8"); expect(script).toMatch( /docker_e2e_run_with_harness[\s\S]*\n {2}-i \\\n {2}"\$IMAGE_NAME" \\\n {2}bash -s >"\$CLIENT_LOG" 2>&1 <<'INNER'/u, ); }); it.each([ "scripts/e2e/mcp-channels-docker.sh", "scripts/e2e/cron-cli-docker.sh", "scripts/e2e/cron-mcp-cleanup-docker.sh", ])("prints successful MCP client proof logs from %s", (scriptPath) => { const result = runSuccessTail(scriptPath); expect(result.status, result.stderr).toBe(0); expect(result.stdout.trim().split("\n")).toEqual(["LOG:client proof log", "OK"]); }); });