#!/bin/bash # E2E benchmark test — fully automated, run from the SENDER machine. # # Starts everything via SSH, captures test video, collects results. # # Usage: # ctrl/e2e_test.sh --python [--duration 30] # ctrl/e2e_test.sh --rust [--duration 30] set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" DURATION=30 INTERVAL=5 RECEIVER="mcrndeb" RDIR="wdir/cht" MODE="python" PLAY_DELAY=3 while [[ $# -gt 0 ]]; do case $1 in --python) MODE="python"; shift ;; --rust) MODE="rust"; shift ;; --duration) DURATION="$2"; shift 2 ;; --interval) INTERVAL="$2"; shift 2 ;; --receiver) RECEIVER="$2"; shift 2 ;; --play-delay) PLAY_DELAY="$2"; shift 2 ;; *) echo "Unknown arg: $1"; exit 1 ;; esac done VIDEO="tests/fixtures/test_scene_${DURATION}s.mp4" GROUND_TRUTH="tests/fixtures/test_scene_${DURATION}s_ground_truth.json" # Generate test video if needed if [ ! -f "$VIDEO" ]; then echo "=== Generating test video ===" python3 ctrl/gen_test_video.py --duration "$DURATION" --interval "$INTERVAL" fi # PIDs to clean up PIDS=() cleanup() { echo "=== Cleaning up ===" for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true done # Kill sudo'd client sudo pkill -f "stream_av\|cht-client" 2>/dev/null || true # Stop remote processes ssh "$RECEIVER" "pkill -f 'cht-server|cht.app' 2>/dev/null" || true wait 2>/dev/null } trap cleanup EXIT INT TERM echo "=== E2E test: $MODE mode, ${DURATION}s ===" # Step 1: Start receiver side (on mcrndeb via SSH) if [ "$MODE" = "rust" ]; then echo "--- Starting Rust server on $RECEIVER ---" ssh -tt "$RECEIVER" "cd $RDIR && ctrl/server.sh" & PIDS+=($!) sleep 2 echo "--- Starting app on $RECEIVER (rust transport, auto-connect) ---" ssh -tt "$RECEIVER" "cd $RDIR && CHT_AUTO_CONNECT=1 CHT_RUST_TRANSPORT=1 ctrl/app.sh" & PIDS+=($!) sleep 3 else echo "--- Starting app on $RECEIVER (python transport, auto-connect) ---" ssh -tt "$RECEIVER" "cd $RDIR && CHT_AUTO_CONNECT=1 CHT_RUST_TRANSPORT=0 ctrl/app.sh" & PIDS+=($!) sleep 3 fi # Step 2: Play test video fullscreen on sender echo "--- Playing test video fullscreen ---" mpv --fullscreen --loop-file=inf --no-terminal "$VIDEO" & PIDS+=($!) sleep "$PLAY_DELAY" # Step 3: Start client (sender) echo "--- Starting $MODE client → $RECEIVER ---" if [ "$MODE" = "rust" ]; then ctrl/client.sh --rust "${RECEIVER}:4447" & else ctrl/client.sh --python "$RECEIVER" & fi PIDS+=($!) # Step 4: Wait for capture + processing WAIT=$(( DURATION + 15 )) echo "--- Waiting ${WAIT}s for capture + processing ---" sleep "$WAIT" # Step 5: Stop sender side echo "--- Stopping sender ---" sudo pkill -f "stream_av\|cht-client" 2>/dev/null || true kill "${PIDS[-1]}" 2>/dev/null || true # mpv sleep 2 # Step 6: Stop receiver side echo "--- Stopping receiver ---" ssh "$RECEIVER" "pkill -f 'cht.app' 2>/dev/null" || true sleep 2 ssh "$RECEIVER" "pkill -f 'cht-server' 2>/dev/null" || true sleep 1 # Step 7: Benchmark echo "" echo "=== Benchmark results ($MODE) ===" ssh "$RECEIVER" "cd $RDIR && python3 ctrl/bench.py --latest --ground-truth $GROUND_TRUTH" echo "" echo "JSON: ssh $RECEIVER 'cd $RDIR && python3 ctrl/bench.py --latest --json --ground-truth $GROUND_TRUTH'"