Files

118 lines
3.9 KiB
Bash
Executable File

#!/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"