summaryrefslogtreecommitdiff
path: root/apps/test-framework/run-bash-tests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'apps/test-framework/run-bash-tests.sh')
-rwxr-xr-xapps/test-framework/run-bash-tests.sh314
1 files changed, 314 insertions, 0 deletions
diff --git a/apps/test-framework/run-bash-tests.sh b/apps/test-framework/run-bash-tests.sh
new file mode 100755
index 0000000000..ce624a95a2
--- /dev/null
+++ b/apps/test-framework/run-bash-tests.sh
@@ -0,0 +1,314 @@
+#!/usr/bin/env bash
+
+# AzerothCore Universal Test Runner
+# This script provides a unified way to run BATS tests across all modules
+
+# Get the script directory and project root
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+
+# Count cores for parallel execution
+if [[ -z "$ACORE_TEST_CORES" ]]; then
+ if command -v nproc >/dev/null 2>&1; then
+ ACORE_TEST_CORES=$(nproc)
+ elif command -v sysctl >/dev/null 2>&1; then
+ ACORE_TEST_CORES=$(sysctl -n hw.ncpu)
+ else
+ ACORE_TEST_CORES=1 # Fallback to single core if detection fails
+ fi
+ export ACORE_TEST_CORES
+fi
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+show_help() {
+ echo -e "${BLUE}AzerothCore Universal Test Runner${NC}"
+ echo ""
+ echo "Usage: $0 [OPTIONS] [TEST_MODULES...]"
+ echo ""
+ echo "Options:"
+ echo " -h, --help Show this help message"
+ echo " -v, --verbose Enable verbose output"
+ echo " -t, --tap Use TAP output format (for CI/CD)"
+ echo " -p, --pretty Use pretty output format (default)"
+ echo " -f, --filter Run only tests matching pattern"
+ echo " -c, --count Show test count only"
+ echo " -d, --debug Enable debug mode (shows output on failure)"
+ echo " -l, --list List available test modules"
+ echo " -j, --jobs <num> Set number of parallel jobs (default: $ACORE_TEST_CORES)"
+ echo " --dir <path> Run tests in specific directory"
+ echo " --all Run all tests in all modules"
+ echo ""
+ echo "Test Modules:"
+ echo " startup-scripts - Startup script tests"
+ echo " compiler - Compiler script tests"
+ echo " docker - Docker-related tests"
+ echo " installer - Installer script tests"
+ echo ""
+ echo "Examples:"
+ echo " $0 # Run tests in current directory"
+ echo " $0 --all # Run all tests in all modules"
+ echo " $0 startup-scripts # Run startup-scripts tests only"
+ echo " $0 --dir apps/docker # Run tests in specific directory"
+ echo " $0 --verbose startup-scripts # Run with verbose output"
+ echo " $0 --filter starter # Run only tests matching 'starter'"
+ echo " $0 --tap # Output in TAP format for CI"
+}
+
+# Parse command line arguments
+VERBOSE=false
+TAP=false
+PRETTY=true
+FILTER=""
+COUNT_ONLY=false
+DEBUG=false
+LIST_MODULES=false
+RUN_ALL=false
+TEST_DIRS=()
+TEST_MODULES=()
+
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ -h|--help)
+ show_help
+ exit 0
+ ;;
+ -v|--verbose)
+ VERBOSE=true
+ shift
+ ;;
+ -t|--tap)
+ TAP=true
+ PRETTY=false
+ shift
+ ;;
+ -p|--pretty)
+ PRETTY=true
+ TAP=false
+ shift
+ ;;
+ -f|--filter)
+ FILTER="$2"
+ shift 2
+ ;;
+ -c|--count)
+ COUNT_ONLY=true
+ shift
+ ;;
+ -d|--debug)
+ DEBUG=true
+ shift
+ ;;
+ -l|--list)
+ LIST_MODULES=true
+ shift
+ ;;
+ --dir)
+ TEST_DIRS+=("$2")
+ shift 2
+ ;;
+ --all)
+ RUN_ALL=true
+ shift
+ ;;
+ -j|--jobs)
+ if [[ "$2" =~ ^[0-9]+$ ]]; then
+ ACORE_TEST_CORES="$2"
+ export ACORE_TEST_CORES
+ shift 2
+ else
+ echo -e "${RED}Error: Invalid number of jobs specified: $2${NC}"
+ echo "Please provide a valid number."
+ exit 1
+ fi
+ ;;
+ *.bats)
+ # Individual test files
+ TEST_FILES+=("$1")
+ shift
+ ;;
+ *)
+ # Assume it's a module name
+ TEST_MODULES+=("$1")
+ shift
+ ;;
+ esac
+done
+
+# Check if BATS is installed
+if ! command -v bats >/dev/null 2>&1; then
+ echo -e "${RED}Error: BATS is not installed${NC}"
+ echo "Please install BATS first:"
+ echo " sudo apt install bats # On Ubuntu/Debian"
+ echo " brew install bats-core # On macOS"
+ echo "Or run: make install-bats"
+ exit 1
+fi
+
+# Function to find test directories
+find_test_directories() {
+ local search_paths=()
+
+ if [[ "$RUN_ALL" == true ]]; then
+ # Find all test directories
+ mapfile -t search_paths < <(find "$PROJECT_ROOT/apps" -type d -name "test" 2>/dev/null)
+ elif [[ ${#TEST_DIRS[@]} -gt 0 ]]; then
+ # Use specified directories
+ for dir in "${TEST_DIRS[@]}"; do
+ if [[ -d "$PROJECT_ROOT/$dir/test" ]]; then
+ search_paths+=("$PROJECT_ROOT/$dir/test")
+ elif [[ -d "$dir/test" ]]; then
+ search_paths+=("$dir/test")
+ elif [[ -d "$dir" ]]; then
+ search_paths+=("$dir")
+ else
+ echo -e "${YELLOW}Warning: Test directory not found: $dir${NC}"
+ fi
+ done
+ elif [[ ${#TEST_MODULES[@]} -gt 0 ]]; then
+ # Use specified modules
+ for module in "${TEST_MODULES[@]}"; do
+ if [[ -d "$PROJECT_ROOT/apps/$module/test" ]]; then
+ search_paths+=("$PROJECT_ROOT/apps/$module/test")
+ else
+ echo -e "${YELLOW}Warning: Module test directory not found: $module${NC}"
+ fi
+ done
+ else
+ # Default: use current directory or startup-scripts if run from test-framework
+ if [[ "$(basename "$PWD")" == "test-framework" ]]; then
+ search_paths=("$PROJECT_ROOT/apps/startup-scripts/test")
+ elif [[ -d "./test" ]]; then
+ search_paths=("./test")
+ else
+ echo -e "${YELLOW}No test directory found. Use --all or specify a module.${NC}"
+ exit 0
+ fi
+ fi
+
+ echo "${search_paths[@]}"
+}
+
+# Function to list available modules
+list_modules() {
+ echo -e "${BLUE}Available test modules:${NC}"
+ find "$PROJECT_ROOT/apps" -type d -name "test" 2>/dev/null | while read -r test_dir; do
+ module_name=$(basename "$(dirname "$test_dir")")
+ test_count=$(find "$test_dir" -name "*.bats" | wc -l)
+ echo -e " ${GREEN}$module_name${NC} ($test_count test files)"
+ done
+}
+
+# Show available modules if requested
+if [[ "$LIST_MODULES" == true ]]; then
+ list_modules
+ exit 0
+fi
+
+# Find test directories
+TEST_SEARCH_PATHS=($(find_test_directories))
+
+if [[ ${#TEST_SEARCH_PATHS[@]} -eq 0 ]]; then
+ echo -e "${YELLOW}No test directories found.${NC}"
+ echo "Use --list to see available modules."
+ exit 0
+fi
+
+# Collect all test files
+TEST_FILES=()
+for test_dir in "${TEST_SEARCH_PATHS[@]}"; do
+ if [[ -d "$test_dir" ]]; then
+ if [[ -n "$FILTER" ]]; then
+ # Find test files matching filter
+ mapfile -t filtered_files < <(find "$test_dir" -name "*.bats" -exec grep -l "$FILTER" {} \; 2>/dev/null)
+ TEST_FILES+=("${filtered_files[@]}")
+ else
+ # Use all test files in directory
+ mapfile -t dir_files < <(find "$test_dir" -name "*.bats" 2>/dev/null)
+ TEST_FILES+=("${dir_files[@]}")
+ fi
+ fi
+done
+
+if [[ ${#TEST_FILES[@]} -eq 0 ]]; then
+ if [[ -n "$FILTER" ]]; then
+ echo -e "${YELLOW}No test files found matching filter: $FILTER${NC}"
+ else
+ echo -e "${YELLOW}No test files found in specified directories.${NC}"
+ fi
+ exit 0
+fi
+
+# Show test count only
+if [[ "$COUNT_ONLY" == true ]]; then
+ total_tests=0
+ for file in "${TEST_FILES[@]}"; do
+ count=$(grep -c "^@test" "$file" 2>/dev/null || echo 0)
+ total_tests=$((total_tests + count))
+ done
+ echo "Total tests: $total_tests"
+ echo "Test files: ${#TEST_FILES[@]}"
+ echo "Test directories: ${#TEST_SEARCH_PATHS[@]}"
+ exit 0
+fi
+
+# Build BATS command
+BATS_CMD="bats --jobs $ACORE_TEST_CORES"
+
+# Set output format
+if [[ "$TAP" == true ]]; then
+ BATS_CMD+=" --formatter tap"
+elif [[ "$PRETTY" == true ]]; then
+ BATS_CMD+=" --formatter pretty"
+fi
+
+# Enable verbose output
+if [[ "$VERBOSE" == true ]]; then
+ BATS_CMD+=" --verbose-run"
+fi
+
+# Add filter if specified
+if [[ -n "$FILTER" ]]; then
+ BATS_CMD+=" --filter '$FILTER'"
+fi
+
+# Add test files
+BATS_CMD+=" ${TEST_FILES[*]}"
+
+echo -e "${BLUE}Running AzerothCore Tests with ${ACORE_TEST_CORES} jobs${NC}"
+echo -e "${YELLOW}Test directories: ${TEST_SEARCH_PATHS[*]}${NC}"
+echo -e "${YELLOW}Test files: ${#TEST_FILES[@]}${NC}"
+if [[ -n "$FILTER" ]]; then
+ echo -e "${YELLOW}Filter: $FILTER${NC}"
+fi
+echo ""
+
+# Run tests
+if [[ "$DEBUG" == true ]]; then
+ echo -e "${YELLOW}Command: $BATS_CMD${NC}"
+ echo ""
+fi
+
+# Execute BATS
+if eval "$BATS_CMD"; then
+ echo ""
+ echo -e "${GREEN}✅ All tests passed!${NC}"
+ exit 0
+else
+ exit_code=$?
+ echo ""
+ echo -e "${RED}❌ Some tests failed!${NC}"
+
+ if [[ "$DEBUG" == true ]]; then
+ echo -e "${YELLOW}Tip: Check the output above for detailed error information${NC}"
+ echo -e "${YELLOW}You can also run individual tests for more detailed debugging:${NC}"
+ echo -e "${YELLOW} $0 --verbose --filter <test_name>${NC}"
+ fi
+
+ exit $exit_code
+fi