#!/bin/bash set -euo pipefail # HoneyBiscuitWorkshop System Test Runner # # Usage: # ./runner.sh # Arch baker tests (hbw-system-test:latest) # ./runner.sh --image hbw-test-pm:test-apt # Debian engine PM tests # ./runner.sh -k test_install # Arch baker, filtered MODE="auto" TEST_IMAGE="" TEST_DIR="tests/baker" PYTEST_ARGS="" while [[ $# -gt 0 ]]; do case "$1" in --image) TEST_IMAGE="$2"; TEST_DIR="tests/engine"; shift 2 ;; manual) MODE="manual"; shift ;; auto) MODE="auto"; shift ;; --) shift; PYTEST_ARGS="$@"; break ;; *) PYTEST_ARGS="$PYTEST_ARGS $1"; shift ;; esac done # Default image: Arch-based baker test image : ${TEST_IMAGE:="hbw-system-test:latest"} SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" CONTAINER_NAME="hbw-system-test-container" STAGING_DIR="/tmp/hbw-system-test" cleanup() { docker rm -f "$CONTAINER_NAME" 2>/dev/null || true [ "$TEST_DIR" = "tests/baker" ] && rm -rf "$STAGING_DIR" } trap cleanup EXIT build_binary() { local target="x86_64-unknown-linux-musl" local binary="$SCRIPT_DIR/workshop-baker/target/$target/debug/workshop-baker" if [ ! -f "$binary" ]; then echo "[runner] Building static (musl) baker binary..." cd "$SCRIPT_DIR/workshop-baker" cargo build -p workshop-baker --target "$target" 2>&1 | tail -n 1 fi } prepare_staging() { # Only needed for baker tests (hbw-system-test:latest mounts /workshop) if [ "$TEST_DIR" = "tests/baker" ]; then mkdir -p "$STAGING_DIR" cp "$SCRIPT_DIR/workshop-baker/target/x86_64-unknown-linux-musl/debug/workshop-baker" "$STAGING_DIR/" chmod +x "$STAGING_DIR/workshop-baker" fi } run_container() { local tag="${TEST_IMAGE##*:}" local filter="" case "$tag" in test-arch) filter="-k pacman" ;; test-apt) filter="-k apt" ;; test-dnf) filter="-k dnf" ;; test-apk) filter="-k apk" ;; esac echo "[runner] Starting: $TEST_IMAGE (tests=$TEST_DIR${filter:+, filter=$filter})" mkdir -p "$SCRIPT_DIR/tests/results" local mounts="-v $SCRIPT_DIR:/src:ro" local entrypoint="" if [ "$TEST_DIR" = "tests/baker" ]; then mounts="$mounts -v $STAGING_DIR:/workshop:ro" entrypoint='--entrypoint ""' fi local cmd="sh -c \"python3 -m venv /tmp/v && . /tmp/v/bin/activate && \ pip install pytest pytest-timeout -q && \ exec python -m pytest $TEST_DIR $PYTEST_ARGS $filter\"" if [ "$MODE" = "manual" ]; then docker run -it --rm --name "$CONTAINER_NAME" --privileged $entrypoint \ $mounts "$TEST_IMAGE" else docker run --rm --name "$CONTAINER_NAME" --privileged $entrypoint \ $mounts -w /src \ "$TEST_IMAGE" "$cmd" fi } echo "============================================" echo " HBW System Test Runner" echo " Image: $TEST_IMAGE" echo " Tests: $TEST_DIR" echo "============================================" build_binary prepare_staging run_container echo "[runner] Done."