#!/usr/bin/env bash # # run_tests.sh -- Build and run host-side unit tests # # Usage: # ./test/run_tests.sh Build and run all tests # ./test/run_tests.sh --clean Clean rebuild # ./test/run_tests.sh --verbose Verbose test output # # Prerequisites: # cmake >= 3.14, g++ or clang++, git (for fetching gtest) # # First run will download Google Test (~30 seconds). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" BUILD_DIR="$SCRIPT_DIR/build" # Color output if [[ -t 1 ]]; then RED=$'\033[0;31m'; GRN=$'\033[0;32m'; CYN=$'\033[0;36m' BLD=$'\033[1m'; RST=$'\033[0m' else RED=''; GRN=''; CYN=''; BLD=''; RST='' fi info() { echo -e "${CYN}[TEST]${RST} $*"; } ok() { echo -e "${GRN}[PASS]${RST} $*"; } die() { echo -e "${RED}[FAIL]${RST} $*" >&2; exit 1; } DO_CLEAN=0 VERBOSE="" for arg in "$@"; do case "$arg" in --clean) DO_CLEAN=1 ;; --verbose) VERBOSE="--verbose" ;; *) die "Unknown option: $arg" ;; esac done command -v cmake &>/dev/null || die "cmake not found. Install: sudo apt install cmake" command -v g++ &>/dev/null || command -v clang++ &>/dev/null || die "No C++ compiler found" command -v git &>/dev/null || die "git not found (needed to fetch Google Test)" if [[ $DO_CLEAN -eq 1 ]] && [[ -d "$BUILD_DIR" ]]; then info "Cleaning build directory..." rm -rf "$BUILD_DIR" fi if [[ ! -f "$BUILD_DIR/CMakeCache.txt" ]]; then info "Configuring (first run will fetch Google Test)..." cmake -S "$SCRIPT_DIR" -B "$BUILD_DIR" -DCMAKE_BUILD_TYPE=Debug fi info "Building tests..." cmake --build "$BUILD_DIR" --parallel echo "" info "${BLD}Running tests...${RST}" echo "" CTEST_ARGS=("--test-dir" "$BUILD_DIR" "--output-on-failure") [[ -n "$VERBOSE" ]] && CTEST_ARGS+=("--verbose") if ctest "${CTEST_ARGS[@]}"; then echo "" ok "${BLD}All tests passed.${RST}" else echo "" die "Some tests failed." fi