Files
mitus/ctrl/e2e_test.sh
2026-04-10 18:29:58 -03:00

117 lines
3.3 KiB
Bash
Executable File

#!/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'"