OverviewFilesCommitsIssuesDocsReleasesPeers

hyperswarm-peer / integration / run_layer5.sh

80 lines · bash ref:
#!/usr/bin/env bash
# Layer 5: GameState Router over P2P (REALTIME + DURABLE)
# Tests: route resolution, REALTIME/DURABLE/BOTH channels, promote/demote, role permissions.
# Two peers via swarm_join mesh (P2P, no client/server).
set -euo pipefail
cd "$(dirname "$0")"

echo "=== Layer 5: GameState Router over P2P ==="

# Cleanup
rm -f /tmp/layer5_*.txt /tmp/layer_bootstrap.txt

# Process tracking
PIDS=()
TESTNET_PID=""

cleanup() {
    for pid in "${PIDS[@]}" "$TESTNET_PID"; do
        [ -n "$pid" ] && kill "$pid" 2>/dev/null || true
        [ -n "$pid" ] && pkill -P "$pid" 2>/dev/null || true
    done
    sleep 0.5
    for pid in "${PIDS[@]}" "$TESTNET_PID"; do
        [ -n "$pid" ] && kill -9 "$pid" 2>/dev/null || true
        [ -n "$pid" ] && pkill -9 -P "$pid" 2>/dev/null || true
    done
    wait 2>/dev/null || true
    rm -f /tmp/layer5_*.txt /tmp/layer_bootstrap.txt
}
trap cleanup EXIT

# Start testnet
echo "[orchestrator] starting DHT testnet..."
node layer2_testnet.js &
TESTNET_PID=$!

for i in $(seq 1 30); do
    [ -f /tmp/layer_bootstrap.txt ] && break
    sleep 0.2
done
[ -f /tmp/layer_bootstrap.txt ] || { echo "FAIL: testnet timeout"; exit 1; }

# Start Peer A (writer) — uses project dir
echo "[orchestrator] starting peer A (writer)..."
timeout -k 10 45 godot4 --headless --path project --script ../layer5_state_a.gd 2>&1 | sed 's/^/  [A] /' &
PIDS+=($!)

# Start Peer B (verifier) — uses project_b dir (both use swarm_join now)
echo "[orchestrator] starting peer B (verifier)..."
timeout -k 10 45 godot4 --headless --path project_b --script ../layer5_state_b.gd 2>&1 | sed 's/^/  [B] /' &
PIDS+=($!)

# Wait for completion
ELAPSED=0
while [ $ELAPSED -lt 35 ]; do
    B_STATUS=$(cat /tmp/layer5_peer_b_status.txt 2>/dev/null || echo "")

    if [ "$B_STATUS" = "PASS" ]; then
        echo ""
        echo "=== Layer 5: PASS ==="
        exit 0
    fi

    if echo "$B_STATUS" | grep -q "^FAIL"; then
        echo ""
        echo "Peer B: $B_STATUS"
        echo "=== Layer 5: FAILED ==="
        exit 1
    fi

    sleep 1
    ELAPSED=$((ELAPSED + 1))
done

echo ""
echo "Peer A: $(cat /tmp/layer5_peer_a_status.txt 2>/dev/null || echo 'no status')"
echo "Peer B: $(cat /tmp/layer5_peer_b_status.txt 2>/dev/null || echo 'no status')"
echo "=== Layer 5: TIMEOUT ==="
exit 1