117 lines
3.3 KiB
Bash
Executable File
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'"
|