#!/usr/bin/env bash set -euo pipefail # Quick end-to-end smoke test for OpenClaw sandbox runtime. # Prerequisites: running stack and jq installed on host. PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$PROJECT_DIR" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' ok() { echo -e "${GREEN}[OK]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } fail() { echo -e "${RED}[FAIL]${NC} $1" exit 1 } need_cmd() { command -v "$1" >/dev/null 2>&1 || fail "Benoetigtes Kommando fehlt: $1" } need_cmd podman need_cmd jq OPENCLAW_NAME="openclaw" if ! podman ps --format '{{.Names}}' | grep -qx "$OPENCLAW_NAME"; then fail "Container $OPENCLAW_NAME laeuft nicht. Starte den Stack zuerst mit ./ghostnet.sh up" fi ok "Container $OPENCLAW_NAME laeuft" if podman exec "$OPENCLAW_NAME" sh -lc 'docker version >/tmp/smoke_dv 2>&1'; then ok "Docker/Podman Socket im OpenClaw-Container erreichbar" else echo "--- docker version output ---" podman exec "$OPENCLAW_NAME" sh -lc 'cat /tmp/smoke_dv || true' fail "Socket im OpenClaw-Container nicht erreichbar" fi if podman exec "$OPENCLAW_NAME" sh -lc 'touch /home/node/.openclaw/workspace/.smoke_openclaw_write && rm -f /home/node/.openclaw/workspace/.smoke_openclaw_write'; then ok "OpenClaw kann in den Primary Workspace schreiben" else fail "OpenClaw kann NICHT in den Primary Workspace schreiben" fi AGENT_PROMPT='Fuehre in der Sandbox genau diesen Befehl aus: sh -lc "touch /workspace/smoke_mount_probe.txt && echo SMOKE_SANDBOX_OK". Antworte nur mit dem Kommando-Output.' AGENT_OUT_FILE="/tmp/openclaw_smoke_agent.json" if ! podman exec "$OPENCLAW_NAME" sh -lc "openclaw agent --session-key agent:main:smoke-test -m '$AGENT_PROMPT' --json" > "$AGENT_OUT_FILE" 2>&1; then echo "--- agent output ---" cat "$AGENT_OUT_FILE" fail "Agent-Turn fehlgeschlagen (Sandbox evtl. nicht aktiv)" fi if ! grep -q 'SMOKE_SANDBOX_OK' "$AGENT_OUT_FILE"; then echo "--- agent output ---" cat "$AGENT_OUT_FILE" fail "Sandbox-Befehl hat erwartete Rueckgabe nicht geliefert" fi ok "Sandbox-Befehl erfolgreich ausgefuehrt" SBOX_NAME="$(podman ps -a --format '{{.Names}}' | grep '^openclaw-sbx-' | head -n 1 || true)" [ -n "$SBOX_NAME" ] || fail "Kein openclaw-sbx-* Container gefunden" ok "Sandbox-Container gefunden: $SBOX_NAME" MOUNTS_JSON="$(podman inspect "$SBOX_NAME" --format '{{json .Mounts}}')" WORKSPACE_SOURCE="$(echo "$MOUNTS_JSON" | jq -r '.[] | select(.Destination=="/workspace") | .Source' | head -n 1)" [ -n "$WORKSPACE_SOURCE" ] || fail "Kein /workspace Mount im Sandbox-Container gefunden" echo "Sandbox /workspace Source: $WORKSPACE_SOURCE" EXPECTED_SOURCE="$(realpath -m "${HOST_WORKSPACE_PATH:-./storage/workspace}")" if [ "$WORKSPACE_SOURCE" = "$EXPECTED_SOURCE" ]; then ok "Sandbox-Mount zeigt auf erwarteten Host-Workspace" else warn "Sandbox-Mount weicht von erwartetem Host-Workspace ab" echo "Erwartet: $EXPECTED_SOURCE" fi if podman exec "$SBOX_NAME" sh -lc 'test -f /workspace/smoke_mount_probe.txt'; then ok "Probe-Datei existiert im Sandbox-Workspace" else fail "Probe-Datei fehlt im Sandbox-Workspace" fi if podman exec "$SBOX_NAME" sh -lc 'apt-get update >/tmp/smoke_apt_update 2>&1'; then ok "apt-get update in Sandbox erfolgreich" else echo "--- apt-get update output ---" podman exec "$SBOX_NAME" sh -lc 'tail -n 40 /tmp/smoke_apt_update || true' fail "apt-get update in Sandbox fehlgeschlagen" fi if podman exec "$SBOX_NAME" sh -lc 'apt-get install -y jq >/tmp/smoke_apt_install 2>&1'; then if podman exec "$SBOX_NAME" sh -lc 'command -v jq >/dev/null 2>&1'; then ok "apt-get install funktioniert in Sandbox (jq installiert)" else fail "apt-get install meldete Erfolg, jq ist aber nicht vorhanden" fi else echo "--- apt-get install output ---" podman exec "$SBOX_NAME" sh -lc 'tail -n 60 /tmp/smoke_apt_install || true' fail "apt-get install in Sandbox fehlgeschlagen" fi ok "Smoke-Test erfolgreich abgeschlossen"