#!/bin/bash # Copyright (c) Advanced Micro Devices, Inc., or its affiliates. # SPDX-License-Identifier: MIT # CK Test - Run Composable Kernel tests # Environment-agnostic: works natively on ROCm hosts or inside containers set -e set -o pipefail # Find script directory and load common utilities SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" # Initialize configuration PROJECT_ROOT=$(find_project_root "${SCRIPT_DIR}" || get_project_root "${SCRIPT_DIR}") BUILD_DIR=$(get_build_dir "${PROJECT_ROOT}") # Help message show_help() { cat << EOF CK Test - Run Composable Kernel tests Usage: ck-test [options] [test_name] [-- gtest_options] Options: -h, --help Show this help message --build-dir Build directory (default: ./build) --no-build Skip building, run test directly --list List available tests --smoke Run all smoke tests (via CTest -L SMOKE_TEST) --regression Run all regression tests (via CTest -L REGRESSION_TEST) --all Run all tests (via CTest) --filter Shorthand for --gtest_filter= Arguments: test_name Name of test executable (optional for --smoke/--regression/--all) gtest_options Additional options passed to test (after --) Environment: CK_BUILD_DIR - Override build directory Examples: ck-test test_amdgcn_mma # Build and run specific test ck-test test_amdgcn_mma --filter '*Fp16*' # Run with gtest filter ck-test test_amdgcn_mma -- --gtest_filter=*Fp16* # Explicit gtest options ck-test --no-build test_amdgcn_mma # Run without rebuilding ck-test --list # List available tests ck-test --smoke # Run all smoke tests ck-test --regression # Run all regression tests ck-test --all # Run all tests EOF } # Parse arguments test_name="" no_build=false list_tests=false run_smoke=false run_regression=false run_all=false gtest_filter="" gtest_options=() parsing_gtest=false while [[ $# -gt 0 ]]; do if [ "$parsing_gtest" = true ]; then gtest_options+=("$1") shift continue fi case $1 in -h|--help) show_help exit 0 ;; --build-dir) require_arg "$1" "${2:-}" BUILD_DIR="$2" shift 2 ;; --no-build) no_build=true shift ;; --list) list_tests=true shift ;; --smoke) run_smoke=true shift ;; --regression) run_regression=true shift ;; --all) run_all=true shift ;; --filter) require_arg "$1" "${2:-}" gtest_filter="$2" shift 2 ;; --) parsing_gtest=true shift ;; --gtest_*) gtest_options+=("$1") shift ;; *) if [ -z "$test_name" ]; then test_name="$1" else gtest_options+=("$1") fi shift ;; esac done # Add filter to gtest options if specified if [ -n "$gtest_filter" ]; then gtest_options+=("--gtest_filter=${gtest_filter}") fi # Validate mutual exclusivity of test suite options suite_count=0 [ "$run_smoke" = true ] && suite_count=$((suite_count + 1)) [ "$run_regression" = true ] && suite_count=$((suite_count + 1)) [ "$run_all" = true ] && suite_count=$((suite_count + 1)) if [ "$suite_count" -gt 1 ]; then error "Options --smoke, --regression, and --all are mutually exclusive" exit 1 fi # Check build is configured if ! is_build_configured "${BUILD_DIR}"; then error "Build not configured. Run 'ck-configure' first" exit 1 fi # Handle --list if [ "$list_tests" = true ]; then info "Available tests:" if [ -d "${BUILD_DIR}/bin" ]; then ls -1 "${BUILD_DIR}/bin/" 2>/dev/null | grep -E '^test_' | sort || echo " (No test binaries found)" else echo " (No bin directory found)" fi echo "" echo "CTest labels:" cd "${BUILD_DIR}" ctest -N 2>/dev/null | head -20 || echo " (Run 'ctest -N' for full list)" exit 0 fi # Handle CTest-based test suites if [ "$run_smoke" = true ] || [ "$run_regression" = true ] || [ "$run_all" = true ]; then cd "${BUILD_DIR}" ctest_cmd=(ctest --output-on-failure) if [ "$run_smoke" = true ]; then ctest_cmd+=(-L SMOKE_TEST) info "Running smoke tests..." elif [ "$run_regression" = true ]; then ctest_cmd+=(-L REGRESSION_TEST) info "Running regression tests..." else info "Running all tests..." fi "${ctest_cmd[@]}" exit_code=$? echo "" if [ $exit_code -eq 0 ]; then info "Tests completed successfully" else error "Tests failed with exit code: ${exit_code}" fi exit $exit_code fi # Validate test name for individual test runs if [ -z "$test_name" ]; then error "test_name required (or use --smoke/--regression/--all for test suites)" echo "" show_help exit 1 fi # Build test if needed (unless --no-build is specified) if [ "$no_build" = false ]; then info "Building ${test_name}..." "${SCRIPT_DIR}/ck-build" --build-dir "${BUILD_DIR}" "${test_name}" echo "" fi # Verify test executable exists test_binary="${BUILD_DIR}/bin/${test_name}" if [ ! -f "$test_binary" ]; then error "Test executable not found: ${test_binary}" echo "Run 'ck-build ${test_name}' first" exit 1 fi # Run test echo "Running: ${test_name} ${gtest_options[*]}" echo "---" cd "${BUILD_DIR}" "./bin/${test_name}" "${gtest_options[@]}" exit_code=$? echo "---" if [ $exit_code -eq 0 ]; then info "Test completed successfully" else error "Test failed with exit code: ${exit_code}" fi exit $exit_code