OverviewFilesCommitsIssuesDocsReleasesPeers

hyperswarm-peer / integration / run_layer4.sh

93 lines · bash ref:
#!/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