diff --git a/tests/approval.sh b/tests/approval.sh deleted file mode 100755 index 2210d5a..0000000 --- a/tests/approval.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env bash -# Phase 5c end-to-end approval flow: -# manager edits proposed -> commits -> request_apply_commit -# user approves on host -> hive-c0re applies into authoritative repo -> rebuild -# sub-agent container has the new package -# -# Runs as root on a host with services.hive-c0re enabled and the hm1nd -# container declared. Idempotent — wipes any prior alice state. - -set -euo pipefail - -AGENT=alice -PKG=htop - -cleanup() { - echo "=== cleanup ===" - sudo hive-c0re kill "$AGENT" 2>/dev/null || true - sudo nixos-container destroy "h-${AGENT}" 2>/dev/null || true - sudo rm -rf \ - "/var/lib/hyperhive/agents/${AGENT}" \ - "/var/lib/hyperhive/applied/${AGENT}" -} - -echo "=== precheck: hm1nd container is up ===" -if ! sudo machinectl status hm1nd >/dev/null 2>&1; then - echo " hm1nd is not running. Starting via systemd..." - sudo systemctl start "container@hm1nd.service" || { - echo "FAIL: could not start container@hm1nd.service." - echo " Did you 'nixos-rebuild switch' after declaring containers.hm1nd in your host config?" - exit 1 - } - # wait briefly for it to come up - for i in 1 2 3 4 5 6 7 8 9 10; do - sudo machinectl status hm1nd >/dev/null 2>&1 && break - sleep 0.5 - done -fi -echo " hm1nd is up ✓" - -cleanup - -echo "=== spawn ${AGENT} ===" -sudo hive-c0re spawn "$AGENT" - -echo "=== two-repo split visible ===" -echo " proposed (manager-editable):" -sudo ls -la "/var/lib/hyperhive/agents/${AGENT}/config/" | sed 's/^/ /' -echo " applied (hive-c0re only):" -sudo ls -la "/var/lib/hyperhive/applied/${AGENT}/" | sed 's/^/ /' - -echo "=== manager cannot see the applied repo ===" -if sudo nixos-container run hm1nd -- ls "/var/lib/hyperhive/applied/${AGENT}" 2>/dev/null; then - echo "FAIL: manager can see applied/ — bind-mount leak" - exit 1 -fi -echo " manager has no path to applied/ ✓" - -echo "=== ${PKG} not installed in h-${AGENT} (pre-approve) ===" -if sudo nixos-container run "h-${AGENT}" -- which "$PKG" 2>/dev/null; then - echo "FAIL: ${PKG} already in path" - exit 1 -fi -echo " not in path ✓" - -echo "=== manager: edit agent.nix + commit + request_apply_commit ===" -sudo nixos-container run hm1nd -- bash -c " - set -euo pipefail - cd /agents/${AGENT}/config - cat > agent.nix <<'EOF' -{ pkgs, ... }: -{ - environment.systemPackages = [ pkgs.${PKG} ]; -} -EOF - git commit -am 'add ${PKG}' - SHA=\$(git rev-parse HEAD) - echo \" manager commit SHA=\$SHA\" - hive-m1nd request-apply-commit ${AGENT} \$SHA -" - -echo "=== pending approvals ===" -sudo hive-c0re pending - -ID=$(sudo hive-c0re pending \ - | sed -nE 's/^[[:space:]]*"id":[[:space:]]*([0-9]+).*/\1/p' \ - | tail -1) -if [ -z "$ID" ]; then - echo "FAIL: could not parse approval id" - exit 1 -fi -echo " using approval id ${ID}" - -echo "=== approve ${ID} (advances applied/main + rebuilds h-${AGENT}) ===" -sudo hive-c0re approve "$ID" - -echo "=== verify ${PKG} now in path ===" -sudo nixos-container run "h-${AGENT}" -- which "$PKG" - -echo "=== applied repo git log ===" -sudo git -C "/var/lib/hyperhive/applied/${AGENT}" log --oneline -5 - -echo "=== approvals table ===" -if command -v sqlite3 >/dev/null; then - sudo sqlite3 /var/lib/hyperhive/broker.sqlite \ - "SELECT id, agent, substr(commit_ref,1,12) AS sha, status FROM approvals ORDER BY id DESC LIMIT 5;" -else - echo " (sqlite3 not on host PATH — skip)" -fi - -echo -read -r -p "press enter to tear down, Ctrl-C to leave running: " -cleanup diff --git a/tests/dashboard.sh b/tests/dashboard.sh deleted file mode 100755 index c268375..0000000 --- a/tests/dashboard.sh +++ /dev/null @@ -1,156 +0,0 @@ -#!/usr/bin/env bash -# Phase 6 + 7 smoke test: dashboard HTTP, per-container web UIs, -# approve-by-POST, SSE endpoint, and orphan-approval GC. -# -# Runs as root on a host with services.hive-c0re enabled and the hm1nd -# container declared. Idempotent — wipes any prior alice state. - -set -euo pipefail - -AGENT=alice -PKG=htop -HOST=${HOST:-localhost} -DASH_PORT=${DASH_PORT:-7000} -MGR_PORT=${MGR_PORT:-8000} - -cleanup() { - sudo hive-c0re kill "$AGENT" 2>/dev/null || true - sudo nixos-container destroy "h-${AGENT}" 2>/dev/null || true - sudo rm -rf \ - "/var/lib/hyperhive/agents/${AGENT}" \ - "/var/lib/hyperhive/applied/${AGENT}" -} - -echo "=== precheck: hm1nd container is up ===" -if ! sudo machinectl status hm1nd >/dev/null 2>&1; then - echo " starting via systemd..." - sudo systemctl start container@hm1nd.service - for i in 1 2 3 4 5 6 7 8 9 10; do - sudo machinectl status hm1nd >/dev/null 2>&1 && break - sleep 0.5 - done -fi -echo " ✓ hm1nd is up" - -cleanup - -echo "=== dashboard reachable ===" -curl -sf "http://${HOST}:${DASH_PORT}/" | grep -q "HYPERHIVE" || { - echo "FAIL: dashboard not serving expected content" - exit 1 -} -echo " ✓ http://${HOST}:${DASH_PORT}/ → HTML with HYPERHIVE banner" - -echo "=== /messages/stream SSE endpoint ===" -curl -sI "http://${HOST}:${DASH_PORT}/messages/stream" \ - | grep -qi "content-type: text/event-stream" || { - echo "FAIL: /messages/stream is not SSE" - exit 1 -} -echo " ✓ Content-Type: text/event-stream" - -echo "=== manager UI reachable ===" -curl -sf "http://${HOST}:${MGR_PORT}/" | grep -q "hm1nd" || { - echo "FAIL: manager UI not reachable at :${MGR_PORT}" - exit 1 -} -echo " ✓ http://${HOST}:${MGR_PORT}/ → hm1nd label" - -echo "=== spawn ${AGENT} ===" -sudo hive-c0re spawn "$AGENT" - -echo "=== pick up ${AGENT}'s port from dashboard ===" -sleep 2 -ALICE_PORT=$(curl -sf "http://${HOST}:${DASH_PORT}/" \ - | sed -nE "s|.*href=\"http://[^:]+:([0-9]+)/\">${AGENT}<.*|\\1|p" \ - | head -1) -if [ -z "$ALICE_PORT" ]; then - echo "FAIL: ${AGENT} port not found in dashboard" - exit 1 -fi -echo " ✓ ${AGENT} port: ${ALICE_PORT}" - -echo "=== ${AGENT} UI reachable ===" -for i in 1 2 3 4 5 6 7 8 9 10; do - curl -sf "http://${HOST}:${ALICE_PORT}/" | grep -q "${AGENT}" && break - sleep 1 -done -curl -sf "http://${HOST}:${ALICE_PORT}/" | grep -q "${AGENT}" || { - echo "FAIL: ${AGENT} UI not reachable at :${ALICE_PORT}" - exit 1 -} -echo " ✓ http://${HOST}:${ALICE_PORT}/ → ${AGENT} label" - -echo "=== ${PKG} not in path pre-approve ===" -if sudo nixos-container run "h-${AGENT}" -- which "$PKG" 2>/dev/null; then - echo "FAIL: ${PKG} already in path" - exit 1 -fi -echo " ✓" - -echo "=== manager submits approval (via hm1nd) ===" -sudo nixos-container run hm1nd -- bash -c " - set -euo pipefail - cd /agents/${AGENT}/config - cat > agent.nix <<'EOF' -{ pkgs, ... }: -{ - environment.systemPackages = [ pkgs.${PKG} ]; -} -EOF - git commit -am 'add ${PKG}' - SHA=\$(git rev-parse HEAD) - echo \" manager commit SHA=\$SHA\" - hive-m1nd request-apply-commit ${AGENT} \$SHA -" - -echo "=== pick approval id from dashboard ===" -ID=$(curl -sf "http://${HOST}:${DASH_PORT}/" \ - | sed -nE 's|.*hive-c0re approve ([0-9]+).*|\1|p' \ - | head -1) -if [ -z "$ID" ]; then - echo "FAIL: approval id not found in dashboard" - exit 1 -fi -echo " ✓ approval id: ${ID}" - -echo "=== POST /approve/${ID} (browser button equivalent) ===" -HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' \ - -X POST "http://${HOST}:${DASH_PORT}/approve/${ID}") -if [ "$HTTP_CODE" != "303" ] && [ "$HTTP_CODE" != "302" ]; then - echo "FAIL: expected 303 redirect, got HTTP ${HTTP_CODE}" - exit 1 -fi -echo " ✓ HTTP ${HTTP_CODE} (redirect)" - -echo "=== verify ${PKG} now in h-${AGENT} ===" -sudo nixos-container run "h-${AGENT}" -- which "$PKG" - -echo "=== orphan-GC: cleanup ${AGENT}, refresh dashboard, orphan disappears ===" -sudo nixos-container run hm1nd -- bash -c " - set -euo pipefail - cd /agents/${AGENT}/config - echo '{ ... }: { }' > agent.nix - git commit -am 'noop' - SHA=\$(git rev-parse HEAD) - hive-m1nd request-apply-commit ${AGENT} \$SHA -" -ORPHAN_ID=$(sudo hive-c0re pending \ - | sed -nE 's/^[[:space:]]*"id":[[:space:]]*([0-9]+).*/\1/p' \ - | tail -1) -echo " queued orphan id: ${ORPHAN_ID}" -cleanup -# First dashboard render triggers GC. -curl -sf "http://${HOST}:${DASH_PORT}/" >/dev/null -sleep 0.5 -if sudo hive-c0re pending | grep -q "\"id\": ${ORPHAN_ID}"; then - echo "FAIL: orphan ${ORPHAN_ID} still pending after dashboard render" - exit 1 -fi -echo " ✓ orphan ${ORPHAN_ID} cleaned up" - -echo -echo "=== summary ===" -echo " dashboard http://${HOST}:${DASH_PORT}/" -echo " manager UI http://${HOST}:${MGR_PORT}/" -echo " (alice torn down)" diff --git a/tests/roundtrip.sh b/tests/roundtrip.sh deleted file mode 100755 index 8f15207..0000000 --- a/tests/roundtrip.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash -# Phase 3 end-to-end smoke test: spawn alice + bob, send alice→bob, observe -# bob's harness echo-reply land in alice's journal. -# -# Run as root (uses nixos-container + hive-c0re). Idempotent — wipes any prior -# h-alice / h-bob first. -# -# With claude not logged in inside the containers, both fall back to echo and -# the chain terminates after one round trip (the "echo: " guard). - -set -euo pipefail - -cleanup() { - echo "=== cleaning up any prior test agents ===" - sudo hive-c0re kill alice 2>/dev/null || true - sudo hive-c0re kill bob 2>/dev/null || true - sudo nixos-container destroy h-alice 2>/dev/null || true - sudo nixos-container destroy h-bob 2>/dev/null || true -} - -cleanup - -echo "=== spawn alice + bob ===" -sudo hive-c0re spawn alice -sudo hive-c0re spawn bob - -echo "=== wait for harnesses to come up ===" -sleep 3 - -T=$(date +"%Y-%m-%d %H:%M:%S") -echo "test start: $T" - -echo "=== alice → bob: 'ping' ===" -sudo nixos-container run h-alice -- hive-ag3nt send bob "ping" - -echo "=== wait for bob to reply, alice to receive ===" -sleep 4 - -echo -echo "=== bob's journal since test start ===" -sudo journalctl -M h-bob -u hive-ag3nt --since "$T" --no-pager | tail -20 || true - -echo -echo "=== alice's journal since test start ===" -sudo journalctl -M h-alice -u hive-ag3nt --since "$T" --no-pager | tail -20 || true - -echo -echo "=== broker rows (last 10) ===" -sudo sqlite3 /var/lib/hyperhive/broker.sqlite \ - "SELECT id, sender, recipient, substr(body,1,60) AS body, sent_at, delivered_at FROM messages ORDER BY id DESC LIMIT 10;" \ - 2>/dev/null || echo "(sqlite3 not available — skip)" - -echo -echo "=== expected ===" -echo " bob's journal: 'inbox from=alice body=ping' then 'claude failed; falling back to echo'" -echo " alice's journal: 'inbox from=bob body=echo: ping' (no reply, echo guard stopped the chain)" -echo " broker rows: 2 messages — alice→bob 'ping' (delivered) and bob→alice 'echo: ping' (delivered)" - -echo -read -r -p "Press enter to tear down test agents, Ctrl-C to leave them up: " -cleanup