#!/usr/bin/env bash
# Layer 4: Keet-Daemon UDS Round-Trip
# Tests: full JSON-RPC suite against keet-daemon.
# Probes existing daemon, starts test daemon if needed.
set -euo pipefail
cd "$(dirname "$0")"
echo "=== Layer 4: Keet-Daemon UDS Round-Trip ==="
SOCKET_PATH="/tmp/keet-daemon.sock"
STARTED_DAEMON=false
DAEMON_PID=""
rm -f /tmp/layer4_status.txt
# ---- Daemon Probe ----
echo "[orchestrator] probing daemon at $SOCKET_PATH..."
if python3 -c "
import socket, sys
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
s.settimeout(2)
s.connect('$SOCKET_PATH')
s.close()
sys.exit(0)
except:
sys.exit(1)
" 2>/dev/null; then
echo "[orchestrator] existing daemon found at $SOCKET_PATH"
else
echo "[orchestrator] no daemon found, starting test daemon..."
STORAGE_DIR="/tmp/layer4_storage"
DAEMON_DIR="/storage/projects/code/hypercore-kb/hyper-fleeky/packages/keet-daemon"
if [ ! -f "$DAEMON_DIR/index.js" ]; then
echo "SKIP: keet-daemon not found at $DAEMON_DIR"
echo "=== Layer 4: SKIPPED ==="
exit 0
fi
rm -rf "$STORAGE_DIR"
# Reuse layer10's daemon wrapper (same startup logic)
cp layer10_daemon.js "$DAEMON_DIR/_layer4_daemon.js"
READY_FILE="/tmp/layer4_daemon_ready.txt"
rm -f "$READY_FILE"
# Override ready file path via sed (layer10_daemon.js writes to layer10 path)
sed -i "s|layer10_daemon_ready|layer4_daemon_ready|g" "$DAEMON_DIR/_layer4_daemon.js"
SOCKET_PATH="$SOCKET_PATH" STORAGE_DIR="$STORAGE_DIR" bare "$DAEMON_DIR/_layer4_daemon.js" 2>&1 | sed 's/^/ [daemon] /' &
DAEMON_PID=$!
STARTED_DAEMON=true
# Wait for daemon ready
for i in $(seq 1 60); do
[ -f "$READY_FILE" ] && break
sleep 0.5
done
if [ ! -f "$READY_FILE" ]; then
echo "FAIL: daemon did not start within 30s"
kill "$DAEMON_PID" 2>/dev/null || true
echo "=== Layer 4: FAILED ==="
exit 1
fi
echo "[orchestrator] test daemon ready (PID $DAEMON_PID)"
fi
# Cleanup handler
cleanup() {
if $STARTED_DAEMON && [ -n "$DAEMON_PID" ]; then
echo "[orchestrator] stopping test daemon..."
kill "$DAEMON_PID" 2>/dev/null || true
sleep 1
kill -9 "$DAEMON_PID" 2>/dev/null || true
fi
rm -f /tmp/layer4_status.txt /tmp/layer4_daemon_ready.txt
rm -f /storage/projects/code/hypercore-kb/hyper-fleeky/packages/keet-daemon/_layer4_daemon.js
rm -rf /tmp/layer4_storage
}
trap cleanup EXIT
# Run tests
OUTPUT=$(timeout -k 10 45 godot4 --headless --path project --script ../layer4_keet_rpc.gd 2>&1 || true)
echo "$OUTPUT"
STATUS=$(cat /tmp/layer4_status.txt 2>/dev/null || echo "UNKNOWN")
if [ "$STATUS" = "PASS" ]; then
echo "=== Layer 4: PASS ==="
exit 0
elif echo "$STATUS" | grep -q "^FAIL"; then
echo "=== Layer 4: FAILED ($STATUS) ==="
exit 1
else
echo "=== Layer 4: UNKNOWN ($STATUS) ==="
exit 1
fi