#!/usr/bin/env bash set -euo pipefail PROFILE="${E2E_PROFILE:-cpu}" case "$PROFILE" in cpu) DETECTIONS_SERVICE="detections" ;; gpu) DETECTIONS_SERVICE="detections-gpu" ;; jetson) DETECTIONS_SERVICE="detections-jetson" ;; *) echo "ERROR: unsupported E2E_PROFILE=$PROFILE (expected: cpu, gpu, jetson)" exit 2 ;; esac COMPOSE="docker compose -f docker-compose.test.yml --profile $PROFILE" usage() { echo "Usage: $0 [pytest_args...]" echo "" echo "Examples:" echo " $0 tests/test_video.py # run all tests in file" echo " $0 tests/test_video.py::test_ft_p_10_frame_sampling_ac1 # run single test" echo " $0 tests/test_video.py -k 'frame_sampling' # run by keyword" echo "" echo "Environment:" echo " E2E_PROFILE=cpu|gpu|jetson compose profile to run (default: cpu)" echo "" echo "Flags -v -x -s are always included." exit 1 } [[ $# -lt 1 ]] && usage $COMPOSE up -d --build "$DETECTIONS_SERVICE" echo "--- Waiting for detections service to become healthy..." for i in $(seq 1 60); do if $COMPOSE exec -T "$DETECTIONS_SERVICE" python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:8080/health')" 2>/dev/null; then echo "--- Detections service is healthy" break fi if [[ "$i" == "60" ]]; then echo "ERROR: detections service did not become healthy" $COMPOSE logs "$DETECTIONS_SERVICE" --tail 100 exit 1 fi sleep 2 done echo "--- Running: pytest $* -v -x -s --csv=/results/report.csv" set +e $COMPOSE run --rm --build --no-deps e2e-runner pytest "$@" -v -x -s --csv=/results/report.csv EXIT_CODE=$? set -e echo "--- Test finished with exit code $EXIT_CODE" echo "--- Detections logs (last 100 lines):" $COMPOSE logs "$DETECTIONS_SERVICE" --tail 100 exit $EXIT_CODE