#!/bin/bash set -euo pipefail # ============================================================================= # HoneyBiscuitWorkshop System Test Runner # ============================================================================= # Usage: ./runner.sh [auto|manual] [-- pytest-args...] # # Modes: # auto - Build, run all tests, collect reports, cleanup (default) # manual - Build, start container shell for interactive testing # # Examples: # ./runner.sh # Run all tests automatically # ./runner.sh auto -k test_prebake # Run only prebake tests # ./runner.sh manual # Drop into container shell # ============================================================================= MODE="${1:-auto}" shift 2>/dev/null || true PYTEST_ARGS="$@" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" STAGING_DIR="/tmp/hbw-system-test" IMAGE_NAME="hbw-system-test:latest" # ---- Cleanup handler ---- cleanup() { echo "[runner] Cleaning up..." docker rm -f hbw-system-test-container 2>/dev/null || true rm -rf "$STAGING_DIR" } trap cleanup EXIT # ---- Step 1: Build the binary ---- build_binary() { echo "[runner] Building workshop-baker (release)..." cd "$SCRIPT_DIR/workshop-baker" cargo build --release 2>&1 echo "[runner] Build complete." } # ---- Step 2: Prepare staging directory ---- prepare_staging() { echo "[runner] Preparing staging directory..." rm -rf "$STAGING_DIR" mkdir -p "$STAGING_DIR" # Copy binary cp "$SCRIPT_DIR/workshop-baker/target/release/workshop-baker" "$STAGING_DIR/" chmod +x "$STAGING_DIR/workshop-baker" # Copy examples if they exist if [ -d "$SCRIPT_DIR/workshop-baker/examples" ]; then cp -r "$SCRIPT_DIR/workshop-baker/examples" "$STAGING_DIR/examples" else mkdir -p "$STAGING_DIR/examples" fi # Copy llm.env if it exists if [ -f "$SCRIPT_DIR/llm.env" ]; then cp "$SCRIPT_DIR/llm.env" "$STAGING_DIR/llm.env" fi echo "[runner] Staging ready at $STAGING_DIR" } # ---- Step 3: Build Docker image ---- build_image() { echo "[runner] Building Docker image: $IMAGE_NAME ..." docker build -t "$IMAGE_NAME" -f "$SCRIPT_DIR/tests/Dockerfile" "$SCRIPT_DIR" echo "[runner] Image built: $IMAGE_NAME" } # ---- Step 4: Run container ---- run_container() { local mode="$1" echo "[runner] Starting container in $mode mode..." mkdir -p "$SCRIPT_DIR/tests/results" if [ "$mode" = "manual" ]; then docker run -it --rm \ --name hbw-system-test-container \ --privileged \ -v "$STAGING_DIR:/workshop:ro" \ -v "$SCRIPT_DIR/tests/results:/results" \ -e TEST_MODE=manual \ "$IMAGE_NAME" else docker run --rm \ --name hbw-system-test-container \ --privileged \ -v "$STAGING_DIR:/workshop:ro" \ -v "$SCRIPT_DIR/tests/results:/results" \ -e TEST_MODE=auto \ "$IMAGE_NAME" $PYTEST_ARGS fi } # ---- Main flow ---- echo "============================================" echo " HoneyBiscuitWorkshop System Test Runner" echo " Mode: $MODE" echo "============================================" build_binary prepare_staging build_image run_container "$MODE" echo "[runner] Done."