#!/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" LOG_TAIL="${E2E_LOG_TAIL:-100}" if [[ -d fixtures/classes.json ]]; then rm -rf fixtures/classes.json fi if [[ ! -f fixtures/classes.json && -f ../classes.json ]]; then cp ../classes.json fixtures/classes.json fi if [[ ! -f fixtures/classes.json ]]; then echo "ERROR: e2e/fixtures/classes.json is missing" exit 1 fi RUNNER_ENV_ARGS=(-e E2E_PROFILE="$PROFILE") if [[ "$PROFILE" == "jetson" ]]; then RUNNER_ENV_ARGS+=( -e E2E_WAIT_FOR_ENGINE_ENABLED="${E2E_WAIT_FOR_ENGINE_ENABLED:-0}" -e E2E_ENGINE_WAIT_TIMEOUT="${E2E_ENGINE_WAIT_TIMEOUT:-900}" ) fi 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 down -v --remove-orphans || true $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 "$LOG_TAIL" exit 1 fi sleep 2 done echo "--- Running: pytest $* -v -x -s --csv=/results/report.csv" set +e $COMPOSE run --rm --build --no-deps "${RUNNER_ENV_ARGS[@]}" 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 $LOG_TAIL lines):" $COMPOSE logs "$DETECTIONS_SERVICE" --tail "$LOG_TAIL" exit $EXIT_CODE