#!/usr/bin/env bats # Require minimum BATS version when supported (older distro packages lack this) if type -t bats_require_minimum_version >/dev/null 2>&1; then bats_require_minimum_version 1.5.0 fi # AzerothCore Compiler Scripts Test Suite # Tests the functionality of the compiler scripts using the unified test framework # Load the AzerothCore test framework load '../../test-framework/bats_libs/acore-support' load '../../test-framework/bats_libs/acore-assert' # Setup that runs before each test setup() { compiler_setup export SCRIPT_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)" export COMPILER_SCRIPT="$SCRIPT_DIR/compiler.sh" } # Cleanup that runs after each test teardown() { acore_test_teardown } # ===== COMPILER SCRIPT TESTS ===== @test "compiler: should show help with --help argument" { run bash -c "echo '' | timeout 5s $COMPILER_SCRIPT --help" [ "$status" -eq 0 ] [[ "$output" =~ "Available commands:" ]] } @test "compiler: should show help with empty input" { run bash -c "echo '' | timeout 5s $COMPILER_SCRIPT 2>&1 || true" # The script might exit with timeout (124) or success (0), both are acceptable for this test [[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]] # Check if output contains expected content - looking for menu options (old or new format) [[ "$output" =~ "build:" ]] || [[ "$output" =~ "clean:" ]] || [[ "$output" =~ "Please enter your choice" ]] || [[ "$output" =~ "build (b):" ]] || [[ "$output" =~ "ACORE COMPILER" ]] || [[ -z "$output" ]] } @test "compiler: should accept option numbers" { # Test option 7 (ccacheShowStats) which should be safe to run run bash -c "echo '7' | timeout 10s $COMPILER_SCRIPT 2>/dev/null || true" # The script might exit with timeout (124) or success (0), both are acceptable [[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]] } @test "compiler: should accept option by name" { run timeout 10s "$COMPILER_SCRIPT" ccacheShowStats [ "$status" -eq 0 ] } @test "compiler: should handle invalid option gracefully" { run timeout 5s "$COMPILER_SCRIPT" invalidOption # Should exit with error code for invalid option [ "$status" -eq 1 ] # Output check is optional as error message might be buffered } @test "compiler: should handle invalid number gracefully" { run bash -c "echo '999' | timeout 5s $COMPILER_SCRIPT 2>&1 || true" # The script might exit with timeout (124) or success (0) for interactive mode [[ "$status" -eq 0 ]] || [[ "$status" -eq 124 ]] # In interactive mode, the script should continue asking for input or timeout } @test "compiler: should quit with quit option" { run timeout 5s "$COMPILER_SCRIPT" quit [ "$status" -eq 0 ] } # ===== FUNCTION TESTS ===== @test "functions: comp_clean should handle non-existent build directory" { # Source the functions with a non-existent build path run bash -c " export BUILDPATH='/tmp/non_existent_build_dir_$RANDOM' source '$SCRIPT_DIR/includes/functions.sh' comp_clean " # Accept either success or failure - the important thing is the function runs [[ "$status" -eq 0 ]] || [[ "$status" -eq 1 ]] [[ "$output" =~ "Cleaning build files" ]] } @test "functions: comp_clean should remove build files when directory exists" { # Create a temporary build directory with test files local test_build_dir="/tmp/test_build_$RANDOM" mkdir -p "$test_build_dir/subdir" touch "$test_build_dir/test_file.txt" touch "$test_build_dir/subdir/nested_file.txt" # Run the clean function run bash -c " export BUILDPATH='$test_build_dir' source '$SCRIPT_DIR/includes/functions.sh' comp_clean " [ "$status" -eq 0 ] [[ "$output" =~ "Cleaning build files" ]] # Directory should still exist but be empty [ -d "$test_build_dir" ] [ ! -f "$test_build_dir/test_file.txt" ] [ ! -f "$test_build_dir/subdir/nested_file.txt" ] # Cleanup rm -rf "$test_build_dir" } @test "functions: comp_ccacheShowStats should run without errors when ccache enabled" { run bash -c " export AC_CCACHE=true source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheShowStats " [ "$status" -eq 0 ] } @test "functions: comp_ccacheShowStats should do nothing when ccache disabled" { run bash -c " export AC_CCACHE=false source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheShowStats " [ "$status" -eq 0 ] # Should produce no output when ccache is disabled } @test "functions: comp_ccacheClean should handle disabled ccache" { run bash -c " export AC_CCACHE=false source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheClean " [ "$status" -eq 0 ] [[ "$output" =~ "ccache is disabled" ]] } @test "functions: comp_ccacheClean should run when ccache enabled" { # Only run if ccache is actually available if command -v ccache >/dev/null 2>&1; then run bash -c " export AC_CCACHE=true source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheClean " [ "$status" -eq 0 ] [[ "$output" =~ "Cleaning ccache" ]] else skip "ccache not available on system" fi } @test "functions: comp_ccacheEnable should set environment variables" { # Call the function in a subshell to capture environment changes run bash -c " export AC_CCACHE=true source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheEnable env | grep CCACHE | head -5 " [ "$status" -eq 0 ] [[ "$output" =~ "CCACHE_MAXSIZE" ]] || [[ "$output" =~ "CCACHE_COMPRESS" ]] } @test "functions: comp_ccacheEnable should not set variables when ccache disabled" { # Call the function and verify it returns early when ccache is disabled run bash -c " export AC_CCACHE=false source '$SCRIPT_DIR/includes/functions.sh' comp_ccacheEnable # The function should return early, so we check if it completed successfully echo 'Function completed without setting CCACHE vars' " [ "$status" -eq 0 ] [[ "$output" =~ "Function completed" ]] } # Mock tests for build functions (these would normally require a full setup) @test "functions: comp_configure should detect platform" { # Mock cmake command to avoid actual configuration run -127 bash -c " function cmake() { echo 'CMAKE called with args: $*' return 0 } export -f cmake # Set required variables export BUILDPATH='/tmp' export SRCPATH='/tmp' export BINPATH='/tmp' export CTYPE='Release' # Source the functions source '$SCRIPT_DIR/includes/functions.sh' # Run configure in the /tmp directory cd /tmp && comp_configure " # Accept command not found as this might indicate missing dependencies [[ "$status" -eq 0 ]] || [[ "$status" -eq 127 ]] # If successful, check for expected output if [ "$status" -eq 0 ]; then [[ "$output" =~ "Platform:" ]] || [[ "$output" =~ "CMAKE called with args:" ]] fi } @test "functions: comp_compile should detect thread count" { # Mock cmake command to avoid actual compilation run -127 bash -c " function cmake() { echo 'CMAKE called with args: $*' return 0 } export -f cmake # Mock other commands function pushd() { echo 'pushd $*'; } function popd() { echo 'popd $*'; } function time() { shift; \"\$@\"; } export -f pushd popd time # Set required variables export BUILDPATH='/tmp' export MTHREADS=0 export CTYPE='Release' export AC_BINPATH_FULL='/tmp' # Source the functions source '$SCRIPT_DIR/includes/functions.sh' # Run compile in the /tmp directory cd /tmp && comp_compile " # Accept command not found as this might indicate missing dependencies [[ "$status" -eq 0 ]] || [[ "$status" -eq 127 ]] # If successful, check for expected output if [ "$status" -eq 0 ]; then [[ "$output" =~ "pushd" ]] || [[ "$output" =~ "CMAKE called with args:" ]] fi } @test "functions: comp_build should call configure and compile" { # Mock the comp_configure and comp_compile functions run -127 bash -c " function comp_configure() { echo 'comp_configure called' return 0 } function comp_compile() { echo 'comp_compile called' return 0 } export -f comp_configure comp_compile # Source the functions source '$SCRIPT_DIR/includes/functions.sh' # Run build comp_build " # Accept command not found as this might indicate missing dependencies [[ "$status" -eq 0 ]] || [[ "$status" -eq 127 ]] # If successful, check for expected output if [ "$status" -eq 0 ]; then [[ "$output" =~ "comp_configure called" ]] && [[ "$output" =~ "comp_compile called" ]] fi } @test "functions: comp_all should call clean and build" { # Mock the comp_clean and comp_build functions run -127 bash -c " function comp_clean() { echo 'comp_clean called' return 0 } function comp_build() { echo 'comp_build called' return 0 } export -f comp_clean comp_build # Source the functions source '$SCRIPT_DIR/includes/functions.sh' # Run all comp_all " # Accept command not found as this might indicate missing dependencies [[ "$status" -eq 0 ]] || [[ "$status" -eq 127 ]] # If successful, check for expected output if [ "$status" -eq 0 ]; then [[ "$output" =~ "comp_clean called" ]] && [[ "$output" =~ "comp_build called" ]] fi }