2026-01-20 12:13:21 -05:00
# Copyright (c) Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
2025-04-15 18:39:53 -04:00
#
# configuration and functions for testing
2023-01-24 18:53:23 -06:00
#
include_guard ( DIRECTORY )
2025-11-03 11:03:35 -05:00
set ( ROCPROFSYS_ABORT_FAIL_REGEX
"### ERROR ###|unknown-hash=|address of faulting memory reference|exiting with non-zero exit code|terminate called after throwing an instance|calling abort.. in |Exit code: [1-9]"
CACHE INTERNAL
"Regex to catch abnormal exits when a PASS_REGULAR_EXPRESSION is set"
FORCE
)
2023-02-04 10:59:50 -06:00
if ( EXISTS /etc/os-release AND NOT IS_DIRECTORY /etc/os-release )
file ( READ /etc/os-release _OS_RELEASE_RAW )
if ( _OS_RELEASE_RAW )
string ( REPLACE "\"" "" _OS_RELEASE_RAW " ${ _OS_RELEASE_RAW } ")
string(REPLACE " - " " " _OS_RELEASE_RAW " ${ _OS_RELEASE_RAW } ")
2025-06-22 10:44:33 -04:00
string(
REGEX REPLACE
" NAME=.*\nVERSION=([0-9]+ ) \.([0-9]+).*\nID=([a-z]+).*"
"\\3-\\1.\\2"
_OS_RELEASE
"${_OS_RELEASE_RAW}"
)
2023-02-04 10:59:50 -06:00
endif ()
unset ( _OS_RELEASE_RAW )
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message ( STATUS "OS release: ${_OS_RELEASE}" )
2023-02-04 10:59:50 -06:00
2023-01-24 18:53:23 -06:00
include ( ProcessorCount )
if ( NOT DEFINED NUM_PROCS_REAL )
2025-06-22 10:44:33 -04:00
ProcessorCount ( NUM_PROCS_REAL )
2023-01-24 18:53:23 -06:00
endif ()
if ( NOT DEFINED NUM_PROCS )
set ( NUM_PROCS 2 )
endif ()
math ( EXPR NUM_SAMPLING_PROCS "${NUM_PROCS_REAL}-1" )
if ( NUM_SAMPLING_PROCS GREATER 3 )
set ( NUM_SAMPLING_PROCS 3 )
endif ()
math ( EXPR NUM_THREADS "${NUM_PROCS_REAL} + (${NUM_PROCS_REAL} / 2)" )
if ( NUM_THREADS GREATER 12 )
set ( NUM_THREADS 12 )
endif ()
2024-10-15 11:20:40 -04:00
math ( EXPR MAX_CAUSAL_ITERATIONS "(${ROCPROFSYS_MAX_THREADS} - 1) / 2" )
2023-01-24 18:53:23 -06:00
if ( MAX_CAUSAL_ITERATIONS GREATER 100 )
set ( MAX_CAUSAL_ITERATIONS 100 )
endif ()
2025-10-20 17:40:10 -04:00
if (
DEFINED ROCmVersion_FULL_VERSION
AND ROCmVersion_FULL_VERSION VERSION_GREATER_EQUAL "7.0"
)
set ( ENABLE_ROCPD_TEST YES )
else ()
set ( ENABLE_ROCPD_TEST NO )
endif ()
rocprofiler_systems_message (
STATUS
"ROCm ${ROCmVersion_FULL_VERSION} - Including ROCPD Test: ${ENABLE_ROCPD_TEST}"
)
2025-10-03 21:33:02 -04:00
if ( DEFINED ROCM_PATH )
set ( ROCM_LLVM_LIB_PATH "${ROCM_PATH}/lib/llvm/lib" )
set ( _test_library_path
"LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}:${ROCM_LLVM_LIB_PATH}/:$ENV{LD_LIBRARY_PATH}"
)
else ()
set ( _test_library_path
"LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}:$ENV{LD_LIBRARY_PATH}"
)
endif ()
2023-01-24 18:53:23 -06:00
set ( _test_openmp_env "OMP_PROC_BIND=spread" "OMP_PLACES=threads" "OMP_NUM_THREADS=2" )
set ( _base_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2025-06-22 10:44:33 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=ON"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_FILE_OUTPUT=ON"
"${_test_openmp_env}"
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
set ( _flat_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_COUT_OUTPUT=ON"
"ROCPROFSYS_FLAT_PROFILE=ON"
"ROCPROFSYS_TIMELINE_PROFILE=OFF"
"ROCPROFSYS_COLLAPSE_PROCESSES=ON"
"ROCPROFSYS_COLLAPSE_THREADS=ON"
"ROCPROFSYS_SAMPLING_FREQ=50"
"ROCPROFSYS_TIMEMORY_COMPONENTS=wall_clock,trip_count"
2023-01-24 18:53:23 -06:00
"${_test_openmp_env}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
set ( _lock_environment
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_USE_SAMPLING=ON"
"ROCPROFSYS_USE_PROCESS_SAMPLING=OFF"
"ROCPROFSYS_SAMPLING_FREQ=750"
"ROCPROFSYS_COLLAPSE_THREADS=ON"
"ROCPROFSYS_TRACE_THREAD_LOCKS=ON"
"ROCPROFSYS_TRACE_THREAD_SPIN_LOCKS=ON"
"ROCPROFSYS_TRACE_THREAD_RW_LOCKS=ON"
"ROCPROFSYS_COUT_OUTPUT=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_TIMELINE_PROFILE=OFF"
2026-01-14 21:27:51 +01:00
"ROCPROFSYS_LOG_LEVEL=trace"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
set ( _perfetto_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=OFF"
"ROCPROFSYS_USE_SAMPLING=ON"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_PERFETTO_BACKEND=inprocess"
"ROCPROFSYS_PERFETTO_FILL_POLICY=ring_buffer"
2023-01-24 18:53:23 -06:00
"${_test_openmp_env}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
set ( _timemory_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=OFF"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=ON"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_TIMEMORY_COMPONENTS=wall_clock,trip_count,peak_rss"
2023-01-24 18:53:23 -06:00
"${_test_openmp_env}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
2024-04-23 09:35:44 -05:00
set ( _test_environment ${ _base_environment } )
2023-01-24 18:53:23 -06:00
set ( _causal_environment
2025-06-22 10:44:33 -04:00
"${_test_openmp_env}"
"${_test_library_path}"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_FILE_OUTPUT=ON"
"ROCPROFSYS_CAUSAL_RANDOM_SEED=1342342"
)
2023-01-24 18:53:23 -06:00
set ( _python_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=OFF"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_TREE_OUTPUT=OFF"
"ROCPROFSYS_USE_PID=OFF"
"ROCPROFSYS_TIMEMORY_COMPONENTS=wall_clock,trip_count"
2023-01-24 18:53:23 -06:00
"${_test_library_path}"
2025-06-22 10:44:33 -04:00
"PYTHONPATH=${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}"
)
2023-01-24 18:53:23 -06:00
set ( _attach_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=OFF"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_USE_OMPT=ON"
"ROCPROFSYS_USE_KOKKOSP=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_USE_PID=OFF"
"ROCPROFSYS_TIMEMORY_COMPONENTS=wall_clock,trip_count"
2023-01-24 18:53:23 -06:00
"OMP_NUM_THREADS=${NUM_PROCS_REAL}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
set ( _rccl_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=OFF"
"ROCPROFSYS_USE_PROCESS_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_USE_PID=OFF"
2025-06-06 11:36:17 -04:00
"ROCPROFSYS_USE_RCCLP=ON"
"ROCPROFSYS_ROCM_DOMAINS=hip_runtime_api,kernel_dispatch,memory_copy"
2023-01-24 18:53:23 -06:00
"${_test_openmp_env}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-01-24 18:53:23 -06:00
2023-02-03 14:10:42 -06:00
set ( _window_environment
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=OFF"
"ROCPROFSYS_USE_PROCESS_SAMPLING=OFF"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"ROCPROFSYS_FILE_OUTPUT=ON"
2026-01-14 21:27:51 +01:00
# TODO: Deprecate ROCPROFSYS_VERBOSE
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_VERBOSE=2"
2026-01-14 21:27:51 +01:00
"ROCPROFSYS_LOG_LEVEL=trace"
2023-02-03 14:10:42 -06:00
"${_test_openmp_env}"
2025-06-22 10:44:33 -04:00
"${_test_library_path}"
)
2023-02-03 14:10:42 -06:00
2023-01-24 18:53:23 -06:00
# -------------------------------------------------------------------------------------- #
set ( MPIEXEC_EXECUTABLE_ARGS )
option (
2024-10-15 11:20:40 -04:00
ROCPROFSYS_CI_MPI_RUN_AS_ROOT
2023-01-24 18:53:23 -06:00
"Enabled --allow-run-as-root in MPI tests with OpenMPI. Enable with care! Should only be in docker containers"
2025-06-22 10:44:33 -04:00
OFF
)
2024-10-15 11:20:40 -04:00
mark_as_advanced ( ROCPROFSYS_CI_MPI_RUN_AS_ROOT )
if ( ROCPROFSYS_CI_MPI_RUN_AS_ROOT )
2023-01-24 18:53:23 -06:00
execute_process (
COMMAND ${ MPIEXEC_EXECUTABLE } --allow-run-as-root --help
RESULT_VARIABLE _mpiexec_allow_run_as_root
2025-06-22 10:44:33 -04:00
OUTPUT_QUIET
ERROR_QUIET
)
2023-01-24 18:53:23 -06:00
if ( _mpiexec_allow_run_as_root EQUAL 0 )
list ( APPEND MPIEXEC_EXECUTABLE_ARGS --allow-run-as-root )
endif ()
endif ()
execute_process (
COMMAND ${ MPIEXEC_EXECUTABLE } --oversubscribe -n 1 ls
RESULT_VARIABLE _mpiexec_oversubscribe
2025-06-22 10:44:33 -04:00
OUTPUT_QUIET
ERROR_QUIET
)
2023-01-24 18:53:23 -06:00
2024-10-15 11:20:40 -04:00
set ( rocprofiler_systems_perf_event_paranoid "4" )
set ( rocprofiler_systems_cap_sys_admin "1" )
set ( rocprofiler_systems_cap_perfmon "1" )
2023-06-14 11:55:22 -05:00
if ( EXISTS "/proc/sys/kernel/perf_event_paranoid" )
2025-06-22 10:44:33 -04:00
file (
2025-11-10 19:08:44 +01:00
STRINGS "/proc/sys/kernel/perf_event_paranoid"
2025-06-22 10:44:33 -04:00
rocprofiler_systems_perf_event_paranoid
LIMIT_COUNT 1
)
2023-06-14 11:55:22 -05:00
endif ()
execute_process (
2025-06-22 10:44:33 -04:00
COMMAND
${ CMAKE_CXX_COMPILER } -O2 -g -std=c++17
${ CMAKE_CURRENT_LIST_DIR } /rocprof-sys-capchk.cpp -o rocprof-sys-capchk
2023-06-14 11:55:22 -05:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR } /bin
RESULT_VARIABLE _capchk_compile
2025-06-22 10:44:33 -04:00
OUTPUT_QUIET
ERROR_QUIET
)
2023-06-14 11:55:22 -05:00
if ( _capchk_compile EQUAL 0 )
execute_process (
2024-10-15 11:20:40 -04:00
COMMAND ${ PROJECT_BINARY_DIR } /bin/rocprof-sys-capchk CAP_SYS_ADMIN effective
2023-06-14 11:55:22 -05:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
2024-10-15 11:20:40 -04:00
RESULT_VARIABLE rocprofiler_systems_cap_sys_admin
2025-06-22 10:44:33 -04:00
OUTPUT_QUIET
ERROR_QUIET
)
2023-06-14 11:55:22 -05:00
execute_process (
2024-10-15 11:20:40 -04:00
COMMAND ${ PROJECT_BINARY_DIR } /bin/rocprof-sys-capchk CAP_PERFMON effective
2023-06-14 11:55:22 -05:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
2024-10-15 11:20:40 -04:00
RESULT_VARIABLE rocprofiler_systems_cap_perfmon
2025-06-22 10:44:33 -04:00
OUTPUT_QUIET
ERROR_QUIET
)
2023-06-14 11:55:22 -05:00
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2025-06-22 10:44:33 -04:00
STATUS "perf_event_paranoid: ${rocprofiler_systems_perf_event_paranoid}"
)
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message ( STATUS "CAP_SYS_ADMIN: ${rocprofiler_systems_cap_sys_admin}" )
rocprofiler_systems_message ( STATUS "CAP_PERFMON: ${rocprofiler_systems_cap_perfmon}" )
2023-06-14 11:55:22 -05:00
2023-01-24 18:53:23 -06:00
if ( _mpiexec_oversubscribe EQUAL 0 )
list ( APPEND MPIEXEC_EXECUTABLE_ARGS --oversubscribe )
endif ()
# -------------------------------------------------------------------------------------- #
set ( _VALID_GPU OFF )
2024-12-13 18:48:39 -05:00
if ( ROCPROFSYS_USE_ROCM AND ( NOT DEFINED ROCPROFSYS_CI_GPU OR ROCPROFSYS_CI_GPU ))
2023-01-24 18:53:23 -06:00
set ( _VALID_GPU ON )
find_program (
2025-03-25 17:31:27 -04:00
ROCPROFSYS_AMD_SMI_EXE
NAMES amd-smi
2023-01-24 18:53:23 -06:00
HINTS ${ ROCmVersion_DIR }
PATHS ${ ROCmVersion_DIR }
2025-06-22 10:44:33 -04:00
PATH_SUFFIXES bin
)
2025-03-25 17:31:27 -04:00
if ( ROCPROFSYS_AMD_SMI_EXE )
2023-01-24 18:53:23 -06:00
execute_process (
2025-03-25 17:31:27 -04:00
COMMAND ${ ROCPROFSYS_AMD_SMI_EXE }
OUTPUT_VARIABLE _AMDSMI_OUT
ERROR_VARIABLE _AMDSMI_ERR
2025-06-22 10:44:33 -04:00
RESULT_VARIABLE _AMDSMI_RET
)
2025-03-25 17:31:27 -04:00
if ( _AMDSMI_RET EQUAL 0 )
if ( "${_AMDSMI_OUTPUT}" MATCHES "ERROR" OR "${_AMDSMI_ERR}" MATCHES "ERROR" )
2023-01-24 18:53:23 -06:00
set ( _VALID_GPU OFF )
endif ()
else ()
set ( _VALID_GPU OFF )
endif ()
endif ()
if ( NOT _VALID_GPU )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2025-06-22 10:44:33 -04:00
AUTHOR_WARNING "amd-smi did not successfully run. Disabling GPU tests..."
)
2023-01-24 18:53:23 -06:00
endif ()
endif ()
2024-12-13 18:48:39 -05:00
set ( LULESH_USE_GPU ${ LULESH_USE_ROCM } )
2023-01-24 18:53:23 -06:00
if ( LULESH_USE_CUDA )
set ( LULESH_USE_GPU ON )
endif ()
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
macro ( ROCPROFILER_SYSTEMS_CHECK_PASS_FAIL_REGEX NAME PASS FAIL )
2025-06-22 10:44:33 -04:00
if (
NOT "${${PASS}}" STREQUAL ""
AND NOT "${${FAIL}}" STREQUAL ""
AND NOT "${${FAIL}}" MATCHES "\\|ROCPROFSYS_ABORT_FAIL_REGEX"
AND NOT "${${FAIL}}" MATCHES "${ROCPROFSYS_ABORT_FAIL_REGEX}"
)
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2023-06-14 11:55:22 -05:00
FATAL_ERROR
2024-10-15 11:20:40 -04:00
"${NAME} has set pass and fail regexes but fail regex does not include '|ROCPROFSYS_ABORT_FAIL_REGEX'"
2025-06-22 10:44:33 -04:00
)
2023-06-14 11:55:22 -05:00
endif ()
if ( "${${FAIL}}" STREQUAL "" )
2024-10-15 11:20:40 -04:00
set ( ${ FAIL } "(${ROCPROFSYS_ABORT_FAIL_REGEX})" )
2023-06-14 11:55:22 -05:00
else ()
2025-06-22 10:44:33 -04:00
string (
REPLACE
"|ROCPROFSYS_ABORT_FAIL_REGEX"
"|${ROCPROFSYS_ABORT_FAIL_REGEX}"
${ FAIL }
"${${FAIL}}"
)
2023-06-14 11:55:22 -05:00
endif ()
endmacro ()
# -------------------------------------------------------------------------------------- #
2025-03-11 14:12:28 -04:00
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_WRITE_TEST_CONFIG _FILE _ENV )
2023-01-24 18:53:23 -06:00
set ( _ENV_ONLY
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_(CI|CI_TIMEOUT|MODE|USE_MPIP|DEBUG_[A-Z_]+|FORCE_ROCPROFILER_INIT|DEFAULT_MIN_INSTRUCTIONS|MONOCHROME|VERBOSE)="
2025-06-22 10:44:33 -04:00
)
2023-01-24 18:53:23 -06:00
set ( _FILE_CONTENTS )
set ( _ENV_CONTENTS )
2023-04-13 02:14:35 -05:00
set ( _DEBUG_SETTINGS ON )
2023-01-24 18:53:23 -06:00
foreach ( _VAL ${ ${_ENV } } )
2024-10-15 11:20:40 -04:00
if ( "${_VAL}" MATCHES "^ROCPROFSYS_DEBUG_SETTINGS=" )
2023-04-13 02:14:35 -05:00
set ( _DEBUG_SETTINGS OFF )
endif ()
2024-10-15 11:20:40 -04:00
if ( "${_VAL}" MATCHES "^ROCPROFSYS_" AND NOT "${_VAL}" MATCHES "${_ENV_ONLY}" )
2023-01-24 18:53:23 -06:00
set ( _FILE_CONTENTS "${_FILE_CONTENTS}${_VAL}\n" )
else ()
list ( APPEND _ENV_CONTENTS "${_VAL}" )
endif ()
endforeach ()
2024-10-15 11:20:40 -04:00
set ( _CONFIG_FILE ${ PROJECT_BINARY_DIR } /rocprof-sys-tests-config/ ${ _FILE } )
2023-01-24 18:53:23 -06:00
file (
2025-11-10 19:08:44 +01:00
WRITE ${ _CONFIG_FILE }
2023-01-24 18:53:23 -06:00
"# auto-generated by cmake
# default values
2024-10-15 11:20:40 -04:00
ROCPROFSYS_CI = ON
ROCPROFSYS_VERBOSE = 1
2026-01-14 21:27:51 +01:00
ROCPROFSYS_LOG_LEVEL = info
2024-10-15 11:20:40 -04:00
ROCPROFSYS_DL_VERBOSE = 1
ROCPROFSYS_SAMPLING_FREQ = 300
ROCPROFSYS_SAMPLING_DELAY = 0.05
ROCPROFSYS_SAMPLING_CPUS = 0-${NUM_SAMPLING_PROCS}
ROCPROFSYS_SAMPLING_GPUS = $env:HIP_VISIBLE_DEVICES
2023-01-24 18:53:23 -06:00
# test-specific values
${_FILE_CONTENTS}
2025-06-22 10:44:33 -04:00
"
)
2024-10-15 11:20:40 -04:00
list ( APPEND _ENV_CONTENTS "ROCPROFSYS_CONFIG_FILE=${_CONFIG_FILE}" )
2023-04-13 02:14:35 -05:00
if ( _DEBUG_SETTINGS )
2024-10-15 11:20:40 -04:00
list ( APPEND _ENV_CONTENTS "ROCPROFSYS_DEBUG_SETTINGS=1" )
2023-04-13 02:14:35 -05:00
endif ()
2025-06-22 10:44:33 -04:00
set ( ${ _ENV } "${_ENV_CONTENTS}" PARENT_SCOPE )
2023-01-24 18:53:23 -06:00
endfunction ()
2023-02-27 12:09:03 -06:00
# -------------------------------------------------------------------------------------- #
# extends the timeout when sanitizers are used due to slowdown
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_ADJUST_TIMEOUT_FOR_SANITIZER _VAR )
if ( ROCPROFSYS_USE_SANITIZER )
2023-02-27 12:09:03 -06:00
math ( EXPR _timeout_v "2 * ${${_VAR}}" )
2025-06-22 10:44:33 -04:00
set ( ${ _VAR } "${_timeout_v}" PARENT_SCOPE )
2023-02-27 12:09:03 -06:00
endif ()
endfunction ()
# -------------------------------------------------------------------------------------- #
# extends the timeout when sanitizers are used due to slowdown
2024-10-15 11:20:40 -04:00
macro ( ROCPROFILER_SYSTEMS_PATCH_SANITIZER_ENVIRONMENT _VAR )
if ( ROCPROFSYS_USE_SANITIZER )
if ( ROCPROFSYS_USE_SANITIZER )
if ( ROCPROFSYS_SANITIZER_TYPE MATCHES "address" )
2023-02-27 12:09:03 -06:00
if ( NOT ASAN_LIBRARY )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2023-02-27 12:09:03 -06:00
FATAL_ERROR
"Please define the realpath to the address sanitizer library in variable ASAN_LIBRARY"
2025-06-22 10:44:33 -04:00
)
2023-02-27 12:09:03 -06:00
endif ()
list ( APPEND ${ _VAR } "LD_PRELOAD=${ASAN_LIBRARY}" )
2024-10-15 11:20:40 -04:00
elseif ( ROCPROFSYS_SANITIZER_TYPE MATCHES "thread" )
2023-02-27 12:09:03 -06:00
if ( NOT TSAN_LIBRARY )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2023-02-27 12:09:03 -06:00
FATAL_ERROR
"Please define the realpath to the thread sanitizer library in variable TSAN_LIBRARY"
2025-06-22 10:44:33 -04:00
)
2023-02-27 12:09:03 -06:00
endif ()
list ( APPEND ${ _VAR } "LD_PRELOAD=${TSAN_LIBRARY}" )
endif ()
endif ()
endif ()
endmacro ()
2023-01-24 18:53:23 -06:00
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_ADD_TEST )
2025-06-22 10:44:33 -04:00
foreach (
_PREFIX
SAMPLING
RUNTIME
REWRITE
REWRITE_RUN
BASELINE
2025-11-14 19:42:33 -05:00
SYS_RUN
2025-06-22 10:44:33 -04:00
)
2023-01-24 18:53:23 -06:00
foreach ( _TYPE PASS FAIL SKIP )
list ( APPEND _REGEX_OPTS "${_PREFIX}_${_TYPE}_REGEX" )
endforeach ()
endforeach ()
2025-06-22 10:44:33 -04:00
set ( _KWARGS
REWRITE_ARGS
RUNTIME_ARGS
SAMPLING_ARGS
RUN_ARGS
ENVIRONMENT
LABELS
PROPERTIES
${ _REGEX_OPTS }
)
2023-01-24 18:53:23 -06:00
cmake_parse_arguments (
2025-06-22 10:44:33 -04:00
TEST
2025-11-14 19:42:33 -05:00
"SKIP_BASELINE;SKIP_SAMPLING;SKIP_REWRITE;SKIP_RUNTIME;SKIP_SYS_RUN"
"NAME;TARGET;MPI;GPU;NUM_PROCS;SAMPLING_TIMEOUT;REWRITE_TIMEOUT;RUNTIME_TIMEOUT;SYS_RUN_TIMEOUT;WILL_FAIL;DISABLED"
2025-06-22 10:44:33 -04:00
"${_KWARGS}"
${ ARGN }
)
foreach (
_PREFIX
SAMPLING
RUNTIME
REWRITE
REWRITE_RUN
BASELINE
2025-11-14 19:42:33 -05:00
SYS_RUN
2025-06-22 10:44:33 -04:00
)
2023-03-23 01:13:12 -05:00
if ( "${${_PREFIX}_FAIL_REGEX}" STREQUAL "" )
2024-10-15 11:20:40 -04:00
set ( ${ _PREFIX } _FAIL_REGEX "(${ROCPROFSYS_ABORT_FAIL_REGEX})" )
2023-03-23 01:13:12 -05:00
endif ()
endforeach ()
2023-01-24 18:53:23 -06:00
if ( TEST_GPU AND NOT _VALID_GPU )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2025-06-22 10:44:33 -04:00
STATUS "${TEST_NAME} requires a GPU and no valid GPUs were found"
)
2023-01-24 18:53:23 -06:00
return ()
endif ()
if ( "${TEST_MPI}" STREQUAL "" )
set ( TEST_MPI OFF )
endif ()
list ( INSERT TEST_REWRITE_ARGS 0 --print-instrumented functions )
list ( INSERT TEST_RUNTIME_ARGS 0 --print-instrumented functions )
if ( NOT DEFINED TEST_NUM_PROCS )
set ( TEST_NUM_PROCS ${ NUM_PROCS } )
endif ()
if ( NUM_PROCS EQUAL 0 )
set ( TEST_NUM_PROCS 0 )
endif ()
if ( NOT TEST_REWRITE_TIMEOUT )
set ( TEST_REWRITE_TIMEOUT 120 )
endif ()
if ( NOT TEST_RUNTIME_TIMEOUT )
set ( TEST_RUNTIME_TIMEOUT 300 )
endif ()
2023-04-13 02:14:35 -05:00
if ( NOT TEST_SAMPLING_TIMEOUT )
set ( TEST_SAMPLING_TIMEOUT 120 )
2023-01-24 18:53:23 -06:00
endif ()
2025-11-14 19:42:33 -05:00
if ( NOT TEST_SYS_RUN_TIMEOUT )
set ( TEST_SYS_RUN_TIMEOUT 300 )
endif ()
2025-07-23 21:28:26 -04:00
if ( NOT TEST_DISABLED )
set ( TEST_DISABLED OFF )
endif ()
if ( NOT TEST_WILL_FAIL )
set ( TEST_WILL_FAIL OFF )
endif ()
2023-01-24 18:53:23 -06:00
if ( NOT DEFINED TEST_ENVIRONMENT OR "${TEST_ENVIRONMENT}" STREQUAL "" )
set ( TEST_ENVIRONMENT "${_test_environment}" )
endif ()
2024-10-15 11:20:40 -04:00
list ( APPEND TEST_ENVIRONMENT "ROCPROFSYS_CI=ON" )
2023-01-24 18:53:23 -06:00
2023-03-23 01:13:12 -05:00
if ( TEST_GPU )
list ( APPEND TEST_LABELS "gpu" )
2024-12-13 18:48:39 -05:00
if ( NOT "ROCPROFSYS_USE_ROCM=OFF" IN_LIST TEST_ENVIRONMENT )
list ( APPEND TEST_LABELS "rocm" )
2023-03-23 01:13:12 -05:00
endif ()
2024-12-13 18:48:39 -05:00
if ( NOT "ROCPROFSYS_USE_ROCM=OFF" IN_LIST TEST_ENVIRONMENT )
2025-03-25 17:31:27 -04:00
list ( APPEND TEST_LABELS "amd-smi" )
2023-03-23 01:13:12 -05:00
endif ()
endif ()
2025-06-22 10:44:33 -04:00
if (
"ROCPROFSYS_USE_ROCM=ON" IN_LIST TEST_ENVIRONMENT
AND NOT "rocm" IN_LIST TEST_ENVIRONMENT
)
2024-12-13 18:48:39 -05:00
list ( APPEND TEST_LABELS "rocm" )
2023-03-23 01:13:12 -05:00
endif ()
2025-06-22 10:44:33 -04:00
if (
"ROCPROFSYS_USE_AMD_SMI=ON" IN_LIST TEST_ENVIRONMENT
AND NOT "amd-smi" IN_LIST TEST_ENVIRONMENT
)
2025-03-25 17:31:27 -04:00
list ( APPEND TEST_LABELS "amd-smi" )
2023-03-23 01:13:12 -05:00
endif ()
2023-01-24 18:53:23 -06:00
if ( TARGET ${ TEST_TARGET } )
2025-06-22 10:44:33 -04:00
if ( DEFINED TEST_MPI AND ${ TEST_MPI } AND TEST_NUM_PROCS GREATER 0 )
2023-01-24 18:53:23 -06:00
if ( NOT TEST_NUM_PROCS GREATER NUM_PROCS_REAL )
2025-06-22 10:44:33 -04:00
set ( COMMAND_PREFIX
${ MPIEXEC_EXECUTABLE }
${ MPIEXEC_EXECUTABLE_ARGS }
${ MPIEXEC_NUMPROC_FLAG }
${ TEST_NUM_PROCS }
)
2023-01-24 18:53:23 -06:00
list ( APPEND TEST_LABELS mpi parallel- ${ TEST_NUM_PROCS } )
list ( APPEND TEST_PROPERTIES PARALLEL_LEVEL ${ TEST_NUM_PROCS } )
else ()
2025-06-22 10:44:33 -04:00
set ( COMMAND_PREFIX
${ MPIEXEC_EXECUTABLE }
${ MPIEXEC_EXECUTABLE_ARGS }
${ MPIEXEC_NUMPROC_FLAG }
1
)
2023-01-24 18:53:23 -06:00
endif ()
else ()
2024-10-15 11:20:40 -04:00
list ( APPEND TEST_ENVIRONMENT "ROCPROFSYS_USE_PID=OFF" )
2023-01-24 18:53:23 -06:00
endif ()
2024-10-15 11:20:40 -04:00
if ( NOT TEST_SKIP_BASELINE AND NOT ROCPROFSYS_USE_SANITIZER )
2023-01-24 18:53:23 -06:00
add_test (
NAME ${ TEST_NAME } -baseline
COMMAND ${ COMMAND_PREFIX } $< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
2023-04-13 02:14:35 -05:00
if ( NOT TEST_SKIP_SAMPLING )
2023-01-24 18:53:23 -06:00
add_test (
2023-04-13 02:14:35 -05:00
NAME ${ TEST_NAME } -sampling
COMMAND
2024-10-15 11:20:40 -04:00
${ COMMAND_PREFIX } $< TARGET_FILE:rocprofiler-systems-sample >
${ TEST_SAMPLE_ARGS } -- $< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
if ( NOT TEST_SKIP_REWRITE )
add_test (
NAME ${ TEST_NAME } -binary-rewrite
COMMAND
2024-10-15 11:20:40 -04:00
$< TARGET_FILE:rocprofiler-systems-instrument > -o
2023-01-24 18:53:23 -06:00
$< TARGET_FILE_DIR:${TEST_TARGET} > / ${ TEST_NAME } .inst
${ TEST_REWRITE_ARGS } -- $< TARGET_FILE:${TEST_TARGET} >
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
add_test (
NAME ${ TEST_NAME } -binary-rewrite-run
COMMAND
2024-10-15 11:20:40 -04:00
${ COMMAND_PREFIX } $< TARGET_FILE:rocprofiler-systems-run > --
2023-03-14 19:48:29 -05:00
$< TARGET_FILE_DIR:${TEST_TARGET} > / ${ TEST_NAME } .inst ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2025-11-29 00:51:54 +01:00
add_test (
NAME ${ TEST_NAME } -binary-rewrite-cleanup
COMMAND
${ CMAKE_COMMAND } -E rm -rf
$< TARGET_FILE_DIR:${TEST_TARGET} > / ${ TEST_NAME } .inst
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } -binary-rewrite
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
2024-10-15 11:20:40 -04:00
if ( NOT TEST_SKIP_RUNTIME AND NOT ROCPROFSYS_USE_SANITIZER )
2023-01-24 18:53:23 -06:00
add_test (
NAME ${ TEST_NAME } -runtime-instrument
2025-06-22 10:44:33 -04:00
COMMAND
$< TARGET_FILE:rocprofiler-systems-instrument > ${ TEST_RUNTIME_ARGS } --
$< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2025-11-29 00:51:54 +01:00
add_test (
NAME ${ TEST_NAME } -runtime-instrument-cleanup
COMMAND
${ CMAKE_COMMAND } -E rm -rf
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } -runtime-instrument
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
2025-11-14 19:42:33 -05:00
if ( NOT TEST_SKIP_SYS_RUN )
add_test (
NAME ${ TEST_NAME } -sys-run
COMMAND
${ COMMAND_PREFIX } $< TARGET_FILE:rocprofiler-systems-run > --
$< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
endif ()
2023-01-24 18:53:23 -06:00
if ( TEST ${ TEST_NAME } -binary-rewrite-run )
2025-06-22 10:44:33 -04:00
set_tests_properties (
${ TEST_NAME } -binary-rewrite-run
PROPERTIES DEPENDS ${ TEST_NAME } -binary-rewrite
)
2023-01-24 18:53:23 -06:00
endif ()
2025-06-22 10:44:33 -04:00
foreach (
_TEST
baseline
sampling
binary-rewrite
binary-rewrite-run
2025-11-29 00:51:54 +01:00
binary-rewrite-cleanup
2025-06-22 10:44:33 -04:00
runtime-instrument
2025-11-29 00:51:54 +01:00
runtime-instrument-cleanup
2025-11-14 19:42:33 -05:00
sys-run
2025-06-22 10:44:33 -04:00
)
2025-11-14 19:42:33 -05:00
string (
REGEX REPLACE
"rewrite-run(-|/)"
"rewrite\\1"
_prefix
"${TEST_NAME}-${_TEST}/"
)
2023-01-24 18:53:23 -06:00
set ( _labels "${_TEST}" )
2025-11-14 19:42:33 -05:00
string ( REPLACE "rewrite-run" "rewrite" _labels "${_TEST}" )
2023-01-24 18:53:23 -06:00
if ( TEST_TARGET )
list ( APPEND _labels "${TEST_TARGET}" )
endif ()
if ( TEST_LABELS )
list ( APPEND _labels "${TEST_LABELS}" )
endif ()
set ( _environ
2025-06-22 10:44:33 -04:00
"ROCPROFSYS_DEFAULT_MIN_INSTRUCTIONS=64"
"${TEST_ENVIRONMENT}"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_OUTPUT_PATH=${PROJECT_BINARY_DIR}/rocprof-sys-tests-output"
2025-06-22 10:44:33 -04:00
"ROCPROFSYS_OUTPUT_PREFIX=${_prefix}"
)
2023-01-24 18:53:23 -06:00
set ( _timeout ${ TEST_REWRITE_TIMEOUT } )
2023-04-13 02:14:35 -05:00
if ( "${_TEST}" MATCHES "sampling" )
set ( _timeout ${ TEST_SAMPLING_TIMEOUT } )
2023-01-24 18:53:23 -06:00
elseif ( "${_TEST}" MATCHES "runtime-instrument" )
set ( _timeout ${ TEST_RUNTIME_TIMEOUT } )
2025-11-14 19:42:33 -05:00
elseif ( "${_TEST}" MATCHES "sys-run" )
set ( _timeout ${ TEST_SYS_RUN_TIMEOUT } )
2023-01-24 18:53:23 -06:00
endif ()
set ( _props )
2025-11-14 19:42:33 -05:00
if ( "${_TEST}" MATCHES "sys-run|sampling|baseline" )
2023-01-24 18:53:23 -06:00
set ( _props ${ TEST_PROPERTIES } )
if ( NOT "RUN_SERIAL" IN_LIST _props )
list ( APPEND _props RUN_SERIAL ON )
endif ()
endif ()
2025-11-29 00:51:54 +01:00
if ( "${_TEST}" MATCHES "-cleanup$" )
set ( _REGEX_VAR )
elseif ( "${_TEST}" MATCHES "binary-rewrite-run" )
2023-01-24 18:53:23 -06:00
set ( _REGEX_VAR REWRITE_RUN )
elseif ( "${_TEST}" MATCHES "runtime-instrument" )
set ( _REGEX_VAR RUNTIME )
elseif ( "${_TEST}" MATCHES "binary-rewrite" )
set ( _REGEX_VAR REWRITE )
elseif ( "${_TEST}" MATCHES "baseline" )
set ( _REGEX_VAR BASELINE )
2023-04-13 02:14:35 -05:00
elseif ( "${_TEST}" MATCHES "sampling" )
set ( _REGEX_VAR SAMPLING )
2025-11-14 19:42:33 -05:00
elseif ( "${_TEST}" MATCHES "sys-run" )
set ( _REGEX_VAR SYS_RUN )
2023-01-24 18:53:23 -06:00
else ()
set ( _REGEX_VAR )
endif ()
2025-11-14 19:42:33 -05:00
if (
"${_TEST}"
MATCHES
"binary-rewrite-run|runtime-instrument|sampling|sys-run"
)
2024-10-15 11:20:40 -04:00
rocprofiler_systems_patch_sanitizer_environment ( _environ )
2023-02-27 12:09:03 -06:00
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_adjust_timeout_for_sanitizer ( _timeout )
2023-02-27 12:09:03 -06:00
2023-01-24 18:53:23 -06:00
foreach ( _TYPE PASS FAIL SKIP )
if ( _REGEX_VAR )
set ( _ ${ _TYPE } _REGEX TEST_ ${ _REGEX_VAR } _ ${ _TYPE } _REGEX )
else ()
set ( _ ${ _TYPE } _REGEX )
endif ()
endforeach ()
2024-10-15 11:20:40 -04:00
list ( APPEND _environ "ROCPROFSYS_CI_TIMEOUT=${_timeout}" )
2023-06-14 11:55:22 -05:00
2024-10-15 11:20:40 -04:00
rocprofiler_systems_check_pass_fail_regex ( "${TEST_NAME}-${_TEST}"
2025-11-14 03:01:04 +01:00
"${_PASS_REGEX}" "${_FAIL_REGEX}"
2025-06-22 10:44:33 -04:00
)
2023-01-24 18:53:23 -06:00
if ( TEST ${ TEST_NAME } - ${ _TEST } )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_write_test_config ( ${ TEST_NAME } - ${ _TEST } .cfg _environ )
2023-01-24 18:53:23 -06:00
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
2025-06-22 10:44:33 -04:00
PROPERTIES
ENVIRONMENT "${_environ}"
TIMEOUT ${ _timeout }
LABELS "${_labels}"
PASS_REGULAR_EXPRESSION "${${_PASS_REGEX}}"
FAIL_REGULAR_EXPRESSION "${${_FAIL_REGEX}}"
SKIP_REGULAR_EXPRESSION "${${_SKIP_REGEX}}"
2025-07-23 21:28:26 -04:00
WILL_FAIL ${ TEST_WILL_FAIL }
DISABLED ${ TEST_DISABLED }
2025-11-14 03:01:04 +01:00
FIXTURES_REQUIRED rocprofsys-global-tmp-files
2025-06-22 10:44:33 -04:00
${ _props }
)
2025-11-29 00:51:54 +01:00
if ( "${_TEST}" STREQUAL "binary-rewrite" )
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
PROPERTIES FIXTURES_SETUP ${ TEST_NAME } -binary-rewrite-fixture
)
elseif ( "${_TEST}" STREQUAL "binary-rewrite-run" )
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
PROPERTIES
FIXTURES_REQUIRED
"rocprofsys-global-tmp-files;${TEST_NAME}-binary-rewrite-fixture"
)
elseif ( "${_TEST}" STREQUAL "binary-rewrite-cleanup" )
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
PROPERTIES FIXTURES_CLEANUP ${ TEST_NAME } -binary-rewrite-fixture
)
elseif ( "${_TEST}" STREQUAL "runtime-instrument" )
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
PROPERTIES FIXTURES_SETUP ${ TEST_NAME } -runtime-instrument-fixture
)
elseif ( "${_TEST}" STREQUAL "runtime-instrument-cleanup" )
set_tests_properties (
${ TEST_NAME } - ${ _TEST }
PROPERTIES
FIXTURES_CLEANUP ${ TEST_NAME } -runtime-instrument-fixture
)
endif ()
2023-01-24 18:53:23 -06:00
endif ()
endforeach ()
endif ()
endfunction ()
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_ADD_CAUSAL_TEST )
2023-01-24 18:53:23 -06:00
foreach ( _PREFIX CAUSAL CAUSAL_VALIDATE )
foreach ( _TYPE PASS FAIL SKIP )
list ( APPEND _REGEX_OPTS "${_PREFIX}_${_TYPE}_REGEX" )
endforeach ()
endforeach ()
2025-06-22 10:44:33 -04:00
set ( _KWARGS
CAUSAL_ARGS
CAUSAL_VALIDATE_ARGS
RUN_ARGS
ENVIRONMENT
LABELS
PROPERTIES
${ _REGEX_OPTS }
)
2023-01-24 18:53:23 -06:00
cmake_parse_arguments (
2025-06-22 10:44:33 -04:00
TEST
"SKIP_BASELINE"
"NAME;TARGET;CAUSAL_MODE;CAUSAL_TIMEOUT;CAUSAL_VALIDATE_TIMEOUT"
"${_KWARGS}"
${ ARGN }
)
2023-01-24 18:53:23 -06:00
if ( NOT DEFINED TEST_CAUSAL_MODE )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message ( FATAL_ERROR
2025-11-14 03:01:04 +01:00
"${TEST_NAME} :: CAUSAL_MODE must be defined"
2025-06-22 10:44:33 -04:00
)
2023-01-24 18:53:23 -06:00
endif ()
if ( NOT TEST_CAUSAL_TIMEOUT )
set ( TEST_CAUSAL_TIMEOUT 600 )
endif ()
if ( NOT TEST_CAUSAL_VALIDATE_TIMEOUT )
set ( TEST_CAUSAL_VALIDATE_TIMEOUT 60 )
endif ()
2023-04-13 02:14:35 -05:00
if ( "${TEST_CAUSAL_FAIL_REGEX}" STREQUAL "" )
2024-10-15 11:20:40 -04:00
set ( TEST_CAUSAL_FAIL_REGEX "(${ROCPROFSYS_ABORT_FAIL_REGEX})" )
2023-04-13 02:14:35 -05:00
endif ()
2023-01-24 18:53:23 -06:00
if ( TARGET ${ TEST_TARGET } )
2025-06-22 10:44:33 -04:00
set ( COMMAND_PREFIX
$< TARGET_FILE:rocprofiler-systems-causal >
--reset
-m
${ TEST_CAUSAL_MODE }
${ TEST_CAUSAL_ARGS }
--
)
2023-01-24 18:53:23 -06:00
if ( NOT TEST_SKIP_BASELINE )
add_test (
NAME ${ TEST_NAME } -baseline
COMMAND $< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
add_test (
NAME causal- ${ TEST_NAME }
COMMAND ${ COMMAND_PREFIX } $< TARGET_FILE:${TEST_TARGET} > ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
if ( NOT "${TEST_CAUSAL_VALIDATE_ARGS}" STREQUAL "" )
2025-06-22 10:44:33 -04:00
if (
"$ENV{ROCPROFSYS_CI}" MATCHES "ON|on|1|true|TRUE"
OR "$ENV{CI}" MATCHES "true"
OR NOT "$ENV{GITHUB_RUN_ID}" STREQUAL ""
)
2023-02-27 12:09:03 -06:00
set ( _VALIDATE_EXTRA "--ci" )
else ()
set ( _VALIDATE_EXTRA "" )
endif ()
2023-01-24 18:53:23 -06:00
add_test (
NAME validate-causal- ${ TEST_NAME }
2025-06-22 10:44:33 -04:00
COMMAND
${ CMAKE_CURRENT_LIST_DIR } /validate-causal-json.py ${ _VALIDATE_EXTRA }
${ TEST_CAUSAL_VALIDATE_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
if ( TEST validate-causal- ${ TEST_NAME } )
2025-06-22 10:44:33 -04:00
set_tests_properties (
validate-causal- ${ TEST_NAME }
PROPERTIES DEPENDS causal- ${ TEST_NAME }
)
2023-01-24 18:53:23 -06:00
endif ()
foreach ( _TEST baseline causal validate-causal )
if ( NOT TEST ${ _TEST } - ${ TEST_NAME } )
2023-06-14 11:55:22 -05:00
if ( NOT TEST ${ TEST_NAME } - ${ _TEST } )
continue ()
else ()
set ( _NAME "${TEST_NAME}-${_TEST}" )
endif ()
else ()
set ( _NAME "${_TEST}-${TEST_NAME}" )
2023-01-24 18:53:23 -06:00
endif ()
2023-06-14 11:55:22 -05:00
set ( _prefix "${_NAME}/" )
2023-01-24 18:53:23 -06:00
set ( _labels "${_TEST}" "causal-profiling" )
if ( TEST_TARGET )
list ( APPEND _labels "${TEST_TARGET}" )
endif ()
if ( TEST_LABELS )
list ( APPEND _labels "${TEST_LABELS}" )
endif ()
set ( _environ
"${_causal_environment}"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_OUTPUT_PATH=${PROJECT_BINARY_DIR}/rocprof-sys-tests-output"
"ROCPROFSYS_OUTPUT_PREFIX=${_prefix}"
"ROCPROFSYS_CI=ON"
"ROCPROFSYS_USE_PID=OFF"
"ROCPROFSYS_THREAD_POOL_SIZE=0"
"ROCPROFSYS_VERBOSE=1"
2026-01-14 21:27:51 +01:00
"ROCPROFSYS_LOG_LEVEL=info"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_DL_VERBOSE=0"
"ROCPROFSYS_DEBUG_SETTINGS=0"
2025-06-22 10:44:33 -04:00
"${TEST_ENVIRONMENT}"
)
2023-01-24 18:53:23 -06:00
set ( _timeout ${ TEST_CAUSAL_TIMEOUT } )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_adjust_timeout_for_sanitizer ( _timeout )
2023-02-27 12:09:03 -06:00
2023-01-24 18:53:23 -06:00
if ( "${_TEST}" MATCHES "validate-causal" )
set ( _timeout ${ TEST_CAUSAL_VALIDATE_TIMEOUT } )
endif ()
set ( _props ${ TEST_PROPERTIES } )
if ( "${_TEST}" STREQUAL "validate-causal" )
set ( _REGEX_VAR CAUSAL_VALIDATE )
elseif ( "${_TEST}" STREQUAL "causal" )
set ( _REGEX_VAR CAUSAL )
else ()
set ( _REGEX_VAR )
endif ()
foreach ( _TYPE PASS FAIL SKIP )
if ( _REGEX_VAR )
set ( _ ${ _TYPE } _REGEX TEST_ ${ _REGEX_VAR } _ ${ _TYPE } _REGEX )
else ()
set ( _ ${ _TYPE } _REGEX )
endif ()
endforeach ()
2024-10-15 11:20:40 -04:00
list ( APPEND _environ "ROCPROFSYS_CI_TIMEOUT=${_timeout}" )
rocprofiler_systems_write_test_config ( ${ _NAME } .cfg _environ )
rocprofiler_systems_check_pass_fail_regex ( "${_NAME}" "${_PASS_REGEX}"
2025-11-14 03:01:04 +01:00
"${_FAIL_REGEX}"
2025-06-22 10:44:33 -04:00
)
2023-01-24 18:53:23 -06:00
set_tests_properties (
2023-06-14 11:55:22 -05:00
${ _NAME }
2025-06-22 10:44:33 -04:00
PROPERTIES
ENVIRONMENT "${_environ}"
TIMEOUT ${ _timeout }
LABELS "${_labels}"
PASS_REGULAR_EXPRESSION "${${_PASS_REGEX}}"
FAIL_REGULAR_EXPRESSION "${${_FAIL_REGEX}}"
SKIP_REGULAR_EXPRESSION "${${_SKIP_REGEX}}"
2025-11-14 03:01:04 +01:00
FIXTURES_REQUIRED rocprofsys-global-tmp-files
2025-06-22 10:44:33 -04:00
${ _props }
)
2023-01-24 18:53:23 -06:00
endforeach ()
endif ()
endfunction ()
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_ADD_PYTHON_TEST )
if ( NOT ROCPROFSYS_USE_PYTHON )
2023-01-24 18:53:23 -06:00
return ()
endif ()
cmake_parse_arguments (
TEST
"STANDALONE" # options
"NAME;FILE;TIMEOUT;PYTHON_EXECUTABLE;PYTHON_VERSION" # single value args
2025-11-29 00:51:54 +01:00
"PROFILE_ARGS;RUN_ARGS;ENVIRONMENT;LABELS;PROPERTIES;PASS_REGEX;FAIL_REGEX;SKIP_REGEX;DEPENDS;COMMAND;FIXTURES_REQUIRED" # multiple
2023-01-24 18:53:23 -06:00
# value args
2025-06-22 10:44:33 -04:00
${ ARGN }
)
2023-01-24 18:53:23 -06:00
if ( NOT TEST_TIMEOUT )
set ( TEST_TIMEOUT 120 )
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_adjust_timeout_for_sanitizer ( TEST_TIMEOUT )
2023-02-27 12:09:03 -06:00
2023-01-24 18:53:23 -06:00
set ( PYTHON_EXECUTABLE "${TEST_PYTHON_EXECUTABLE}" )
if ( NOT DEFINED TEST_ENVIRONMENT OR "${TEST_ENVIRONMENT}" STREQUAL "" )
set ( TEST_ENVIRONMENT "${_python_environment}" )
endif ()
list ( APPEND TEST_LABELS "python" "python-${TEST_PYTHON_VERSION}" )
if ( NOT TEST_COMMAND )
2025-06-22 10:44:33 -04:00
list (
2025-11-10 19:08:44 +01:00
APPEND TEST_ENVIRONMENT
2025-06-22 10:44:33 -04:00
"ROCPROFSYS_CI=ON"
"ROCPROFSYS_OUTPUT_PATH=${PROJECT_BINARY_DIR}/rocprof-sys-tests-output"
)
2023-01-24 18:53:23 -06:00
get_filename_component ( _TEST_FILE "${TEST_FILE}" NAME )
set ( _TEST_FILE
2025-06-22 10:44:33 -04:00
${ PROJECT_BINARY_DIR } /python/tests/ ${ TEST_PYTHON_VERSION } / ${ _TEST_FILE }
)
2025-10-28 13:06:07 -04:00
if ( ${ ENABLE_ROCPD_TEST } AND ${ _VALID_GPU } )
list ( APPEND TEST_LABELS "rocpd" )
list ( APPEND TEST_ENVIRONMENT "ROCPROFSYS_USE_ROCPD=ON" )
endif ()
2023-01-24 18:53:23 -06:00
configure_file ( ${ TEST_FILE } ${ _TEST_FILE } @ONLY )
2025-10-28 13:06:07 -04:00
2023-01-24 18:53:23 -06:00
if ( TEST_STANDALONE )
add_test (
NAME ${ TEST_NAME } - ${ TEST_PYTHON_VERSION }
COMMAND ${ TEST_PYTHON_EXECUTABLE } ${ _TEST_FILE } ${ TEST_RUN_ARGS }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
else ()
add_test (
NAME ${ TEST_NAME } - ${ TEST_PYTHON_VERSION }
2025-06-22 10:44:33 -04:00
COMMAND
${ TEST_PYTHON_EXECUTABLE } -m rocprofsys ${ TEST_PROFILE_ARGS } --
${ _TEST_FILE } ${ TEST_RUN_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
add_test (
NAME ${ TEST_NAME } - ${ TEST_PYTHON_VERSION } -annotated
2025-06-22 10:44:33 -04:00
COMMAND
${ TEST_PYTHON_EXECUTABLE } -m rocprofsys ${ TEST_PROFILE_ARGS }
--annotate-trace -- ${ _TEST_FILE } ${ TEST_RUN_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
else ()
list ( APPEND TEST_LABELS "python-check" "python-${TEST_PYTHON_VERSION}-check" )
add_test (
NAME ${ TEST_NAME } - ${ TEST_PYTHON_VERSION }
COMMAND ${ TEST_COMMAND } ${ TEST_FILE }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-01-24 18:53:23 -06:00
endif ()
2025-06-22 10:44:33 -04:00
foreach (
_TEST
${ TEST_NAME } - ${ TEST_PYTHON_VERSION }
${ TEST_NAME } - ${ TEST_PYTHON_VERSION } -annotated
)
2023-01-24 18:53:23 -06:00
if ( NOT TEST "${_TEST}" )
continue ()
endif ()
2025-06-22 10:44:33 -04:00
string (
REPLACE
"${TEST_NAME}-${TEST_PYTHON_VERSION}"
"${TEST_NAME}"
_TEST_DIR
"${_TEST}"
)
2023-06-14 11:55:22 -05:00
set ( _TEST_ENV
"${TEST_ENVIRONMENT}"
2024-10-15 11:20:40 -04:00
"ROCPROFSYS_OUTPUT_PREFIX=${_TEST_DIR}/${TEST_PYTHON_VERSION}/"
2025-06-22 10:44:33 -04:00
"ROCPROFSYS_CI_TIMEOUT=${TEST_TIMEOUT}"
)
2023-01-24 18:53:23 -06:00
set ( _TEST_PROPERTIES "${TEST_PROPERTIES}" )
2023-06-14 11:55:22 -05:00
# assign pass variable to pass regex
set ( _PASS_REGEX TEST_PASS_REGEX )
# assign fail variable to fail regex
set ( _FAIL_REGEX TEST_FAIL_REGEX )
2023-01-24 18:53:23 -06:00
2024-10-15 11:20:40 -04:00
rocprofiler_systems_check_pass_fail_regex ( "${_TEST}" "${_PASS_REGEX}"
2025-11-14 03:01:04 +01:00
"${_FAIL_REGEX}"
2025-06-22 10:44:33 -04:00
)
2025-11-29 00:51:54 +01:00
set ( _PYTHON_FIXTURES "rocprofsys-global-tmp-files" )
if ( TEST_FIXTURES_REQUIRED )
list ( APPEND _PYTHON_FIXTURES "${TEST_FIXTURES_REQUIRED}" )
endif ()
2023-01-24 18:53:23 -06:00
set_tests_properties (
${ _TEST }
2025-06-22 10:44:33 -04:00
PROPERTIES
ENVIRONMENT "${_TEST_ENV}"
TIMEOUT ${ TEST_TIMEOUT }
LABELS "${TEST_LABELS}"
DEPENDS "${TEST_DEPENDS}"
PASS_REGULAR_EXPRESSION "${${_PASS_REGEX}}"
FAIL_REGULAR_EXPRESSION "${${_FAIL_REGEX}}"
SKIP_REGULAR_EXPRESSION "${TEST_SKIP_REGEX}"
REQUIRED_FILES "${TEST_FILE}"
2025-11-29 00:51:54 +01:00
FIXTURES_REQUIRED "${_PYTHON_FIXTURES}"
2025-06-22 10:44:33 -04:00
${ _TEST_PROPERTIES }
)
2023-01-24 18:53:23 -06:00
endforeach ()
endfunction ()
2023-02-03 14:10:42 -06:00
# -------------------------------------------------------------------------------------- #
#
# Find Python3 interpreter for output validation
#
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
if ( NOT ROCPROFSYS_USE_PYTHON )
2023-02-03 14:10:42 -06:00
find_package ( Python3 QUIET COMPONENTS Interpreter )
if ( Python3_FOUND )
2024-10-15 11:20:40 -04:00
set ( ROCPROFSYS_VALIDATION_PYTHON ${ Python3_EXECUTABLE } )
2025-06-22 10:44:33 -04:00
execute_process (
COMMAND ${ Python3_EXECUTABLE } -c "import perfetto"
RESULT_VARIABLE ROCPROFSYS_VALIDATION_PYTHON_PERFETTO
)
2023-02-03 14:10:42 -06:00
2024-10-15 11:20:40 -04:00
if ( NOT ROCPROFSYS_VALIDATION_PYTHON_PERFETTO EQUAL 0 )
rocprofiler_systems_message ( AUTHOR_WARNING
2025-11-14 03:01:04 +01:00
"Python3 found but perfetto support is disabled"
2025-06-22 10:44:33 -04:00
)
2023-02-03 14:10:42 -06:00
endif ()
endif ()
else ()
set ( _INDEX 0 )
2024-10-15 11:20:40 -04:00
foreach ( _VERSION ${ ROCPROFSYS_PYTHON_VERSIONS } )
if ( NOT ROCPROFSYS_USE_PYTHON )
2023-02-03 14:10:42 -06:00
continue ()
endif ()
2024-10-15 11:20:40 -04:00
list ( GET ROCPROFSYS_PYTHON_ROOT_DIRS ${ _INDEX } _PYTHON_ROOT_DIR )
2023-02-03 14:10:42 -06:00
2024-10-15 11:20:40 -04:00
rocprofiler_systems_find_python (
2023-02-03 14:10:42 -06:00
_PYTHON
ROOT_DIR "${_PYTHON_ROOT_DIR}"
2025-06-22 10:44:33 -04:00
COMPONENTS Interpreter
)
2023-02-03 14:10:42 -06:00
if ( _PYTHON_EXECUTABLE )
2024-10-15 11:20:40 -04:00
set ( ROCPROFSYS_VALIDATION_PYTHON ${ _PYTHON_EXECUTABLE } )
2025-06-22 10:44:33 -04:00
execute_process (
COMMAND ${ _PYTHON_EXECUTABLE } -c "import perfetto"
RESULT_VARIABLE ROCPROFSYS_VALIDATION_PYTHON_PERFETTO
)
2023-02-03 14:10:42 -06:00
# prefer Python3 with perfetto support
2024-10-15 11:20:40 -04:00
if ( ROCPROFSYS_VALIDATION_PYTHON_PERFETTO EQUAL 0 )
2023-02-03 14:10:42 -06:00
break ()
else ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2023-02-03 14:10:42 -06:00
AUTHOR_WARNING
2025-06-22 10:44:33 -04:00
"${_PYTHON_EXECUTABLE} found but perfetto support is disabled"
)
2023-02-03 14:10:42 -06:00
endif ()
endif ()
math ( EXPR _INDEX "${_INDEX} + 1" )
endforeach ()
endif ()
2024-10-15 11:20:40 -04:00
if ( NOT ROCPROFSYS_VALIDATION_PYTHON )
rocprofiler_systems_message (
2025-06-22 10:44:33 -04:00
AUTHOR_WARNING "Python3 interpreter not found. Validation tests will be disabled"
)
2023-02-03 14:10:42 -06:00
endif ()
# -------------------------------------------------------------------------------------- #
#
# Output validation test function
#
# -------------------------------------------------------------------------------------- #
2024-10-15 11:20:40 -04:00
function ( ROCPROFILER_SYSTEMS_ADD_VALIDATION_TEST )
if ( NOT ROCPROFSYS_VALIDATION_PYTHON )
2023-02-03 14:10:42 -06:00
return ()
endif ()
cmake_parse_arguments (
TEST
""
2025-10-20 17:40:10 -04:00
"NAME;TIMEOUT;TIMEMORY_METRIC;TIMEMORY_FILE;PERFETTO_METRIC;PERFETTO_FILE;ROCPD_FILE"
2025-03-05 16:05:18 -05:00
"ENVIRONMENT;LABELS;PROPERTIES;PASS_REGEX;FAIL_REGEX;SKIP_REGEX;DEPENDS;EXIST_FILES;ARGS"
2025-06-22 10:44:33 -04:00
${ ARGN }
)
2023-02-03 14:10:42 -06:00
2023-02-04 10:59:50 -06:00
if ( NOT TEST "${TEST_NAME}" )
2024-10-15 11:20:40 -04:00
rocprofiler_systems_message (
2023-02-04 10:59:50 -06:00
AUTHOR_WARNING
2025-06-22 10:44:33 -04:00
"No validation test(s) for ${TEST_NAME} because test does not exist"
)
2023-02-04 10:59:50 -06:00
return ()
endif ()
2023-02-03 14:10:42 -06:00
if ( NOT TEST_TIMEOUT )
set ( TEST_TIMEOUT 30 )
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_adjust_timeout_for_sanitizer ( TEST_TIMEOUT )
2023-02-27 12:09:03 -06:00
2024-10-15 11:20:40 -04:00
set ( PYTHON_EXECUTABLE "${ROCPROFSYS_VALIDATION_PYTHON}" )
2023-02-03 14:10:42 -06:00
list ( APPEND TEST_LABELS "validate" )
foreach ( _DEP ${ TEST_DEPENDS } )
list ( APPEND TEST_LABELS "validate-${_DEP}" )
endforeach ()
list ( APPEND TEST_DEPENDS "${TEST_NAME}" )
2023-04-13 02:14:35 -05:00
if ( "${TEST_NAME}" MATCHES "-binary-rewrite" )
list ( APPEND TEST_DEPENDS "${TEST_NAME}-run" )
endif ()
2023-02-03 14:10:42 -06:00
2025-11-13 21:49:07 -05:00
# Add labels from the parent test to the validation test
get_test_property ( ${ TEST_NAME } LABELS PARENT_TEST_LABELS )
if ( PARENT_TEST_LABELS )
list ( APPEND TEST_LABELS "${PARENT_TEST_LABELS}" )
list ( REMOVE_DUPLICATES TEST_LABELS )
list ( SORT TEST_LABELS )
endif ()
2023-02-03 14:10:42 -06:00
if ( NOT TEST_PASS_REGEX )
set ( TEST_PASS_REGEX
2025-10-20 17:40:10 -04:00
"rocprof-sys-tests-output/${TEST_NAME}/(${TEST_TIMEMORY_FILE}|${TEST_PERFETTO_FILE}|${TEST_ROCPD_FILE}) validated"
2025-06-22 10:44:33 -04:00
)
2023-02-03 14:10:42 -06:00
endif ()
2025-12-22 12:47:35 +01:00
set ( _EXIST_FILES_TESTS "" )
2025-03-05 16:05:18 -05:00
foreach ( _FILE ${ TEST_EXIST_FILES } )
add_test (
NAME validate- ${ TEST_NAME } - ${ _FILE } -exists
2025-06-22 10:44:33 -04:00
COMMAND
test -e
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } / ${ _FILE }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2025-12-22 12:47:35 +01:00
list ( APPEND _EXIST_FILES_TESTS "validate-${TEST_NAME}-${_FILE}-exists" )
2025-03-05 16:05:18 -05:00
endforeach ()
2023-06-19 19:18:04 -05:00
if ( TEST_TIMEMORY_FILE )
add_test (
NAME validate- ${ TEST_NAME } -timemory
COMMAND
2024-10-15 11:20:40 -04:00
${ ROCPROFSYS_VALIDATION_PYTHON }
2023-06-19 19:18:04 -05:00
${ CMAKE_CURRENT_LIST_DIR } /validate-timemory-json.py -m
"${TEST_TIMEMORY_METRIC}" ${ TEST_ARGS } -i
2024-10-15 11:20:40 -04:00
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } / ${ TEST_TIMEMORY_FILE }
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-06-19 19:18:04 -05:00
endif ()
2024-10-15 11:20:40 -04:00
if ( ROCPROFSYS_VALIDATION_PYTHON_PERFETTO EQUAL 0 AND TEST_PERFETTO_FILE )
2023-02-03 14:10:42 -06:00
add_test (
NAME validate- ${ TEST_NAME } -perfetto
COMMAND
2024-10-15 11:20:40 -04:00
${ ROCPROFSYS_VALIDATION_PYTHON }
2023-02-03 14:10:42 -06:00
${ CMAKE_CURRENT_LIST_DIR } /validate-perfetto-proto.py -m
2023-06-19 19:18:04 -05:00
"${TEST_PERFETTO_METRIC}" ${ TEST_ARGS } -i
2024-10-15 11:20:40 -04:00
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } / ${ TEST_PERFETTO_FILE }
2024-09-13 13:43:26 -04:00
-t /opt/trace_processor/bin/trace_processor_shell
2025-06-22 10:44:33 -04:00
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
2023-02-03 14:10:42 -06:00
endif ()
2025-10-20 17:40:10 -04:00
if ( TEST_ROCPD_FILE )
add_test (
NAME validate- ${ TEST_NAME } -rocpd
COMMAND
${ ROCPROFSYS_VALIDATION_PYTHON }
${ CMAKE_CURRENT_LIST_DIR } /validate-rocpd.py -db
${ PROJECT_BINARY_DIR } /rocprof-sys-tests-output/ ${ TEST_NAME } / ${ TEST_ROCPD_FILE }
${ TEST_ARGS }
WORKING_DIRECTORY ${ PROJECT_BINARY_DIR }
)
endif ()
2024-10-15 11:20:40 -04:00
list ( APPEND TEST_ENVIRONMENT "ROCPROFSYS_CI_TIMEOUT=${TEST_TIMEOUT}" )
2023-06-14 11:55:22 -05:00
2025-11-29 00:51:54 +01:00
# Determine the cleanup fixture this validation test should require
set ( _VALIDATION_FIXTURES "rocprofsys-global-tmp-files" )
if ( "${TEST_NAME}" MATCHES "-binary-rewrite(-run)?$" )
string ( REGEX REPLACE "-binary-rewrite(-run)?$" "" _BASE_TEST_NAME "${TEST_NAME}" )
list ( APPEND _VALIDATION_FIXTURES "${_BASE_TEST_NAME}-binary-rewrite-fixture" )
elseif ( "${TEST_NAME}" MATCHES "-runtime-instrument$" )
string ( REGEX REPLACE "-runtime-instrument$" "" _BASE_TEST_NAME "${TEST_NAME}" )
list ( APPEND _VALIDATION_FIXTURES "${_BASE_TEST_NAME}-runtime-instrument-fixture" )
endif ()
2025-10-20 17:40:10 -04:00
foreach (
_TEST
validate- ${ TEST_NAME } -timemory
validate- ${ TEST_NAME } -perfetto
validate- ${ TEST_NAME } -rocpd
)
# Skip tests that don't exist
2023-02-03 14:10:42 -06:00
if ( NOT TEST "${_TEST}" )
continue ()
endif ()
2025-10-20 17:40:10 -04:00
# Skip timemory validation if no timemory file is specified
if ( "${_TEST}" MATCHES "-timemory" AND NOT TEST_TIMEMORY_FILE )
continue ()
endif ()
# Skip perfetto validation if no perfetto file is specified
if ( "${_TEST}" MATCHES "-perfetto" AND NOT TEST_PERFETTO_FILE )
continue ()
endif ()
# Skip rocpd validation if no rocpd file is specified
if ( "${_TEST}" MATCHES "-rocpd" AND NOT TEST_ROCPD_FILE )
continue ()
endif ()
2024-10-15 11:20:40 -04:00
rocprofiler_systems_check_pass_fail_regex ( "${_TEST}" "TEST_PASS_REGEX"
2025-11-14 03:01:04 +01:00
"TEST_FAIL_REGEX"
2025-06-22 10:44:33 -04:00
)
2023-02-03 14:10:42 -06:00
set_tests_properties (
${ _TEST }
2025-06-22 10:44:33 -04:00
PROPERTIES
ENVIRONMENT "${TEST_ENVIRONMENT}"
TIMEOUT ${ TEST_TIMEOUT }
LABELS "${TEST_LABELS}"
DEPENDS "${TEST_DEPENDS};${TEST_NAME}"
PASS_REGULAR_EXPRESSION "${TEST_PASS_REGEX}"
FAIL_REGULAR_EXPRESSION "${TEST_FAIL_REGEX}"
SKIP_REGULAR_EXPRESSION "${TEST_SKIP_REGEX}"
REQUIRED_FILES "${TEST_FILE}"
2025-11-29 00:51:54 +01:00
FIXTURES_REQUIRED "${_VALIDATION_FIXTURES}"
2025-06-22 10:44:33 -04:00
${ TEST_PROPERTIES }
)
2023-02-03 14:10:42 -06:00
endforeach ()
2025-12-22 12:47:35 +01:00
# Set properties for file existence validation tests
foreach ( _TEST ${ _EXIST_FILES_TESTS } )
set_tests_properties (
${ _TEST }
PROPERTIES
TIMEOUT ${ TEST_TIMEOUT }
LABELS "${TEST_LABELS}"
DEPENDS "${TEST_DEPENDS};${TEST_NAME}"
FIXTURES_REQUIRED "${_VALIDATION_FIXTURES}"
)
endforeach ()
2023-02-03 14:10:42 -06:00
endfunction ()
2025-11-03 11:03:35 -05:00
# -------------------------------------------------------------------------------------- #
#
# Adds a ctest for executables
#
# -------------------------------------------------------------------------------------- #
function ( ROCPROFILER_SYSTEMS_ADD_BIN_TEST )
cmake_parse_arguments (
TEST
"" # options
"NAME;TARGET;TIMEOUT;WORKING_DIRECTORY" # single value args
"ARGS;ENVIRONMENT;LABELS;PROPERTIES;PASS_REGEX;FAIL_REGEX;SKIP_REGEX;DEPENDS;COMMAND" # multiple
# value args
${ ARGN }
)
if ( NOT TEST_WORKING_DIRECTORY )
set ( TEST_WORKING_DIRECTORY ${ PROJECT_BINARY_DIR } )
endif ()
if ( NOT TEST_ENVIRONMENT )
set ( TEST_ENVIRONMENT
2025-12-25 13:36:04 +01:00
"ROCPROFSYS_TRACE=ON"
2025-11-03 11:03:35 -05:00
"ROCPROFSYS_PROFILE=ON"
"ROCPROFSYS_USE_SAMPLING=ON"
"ROCPROFSYS_TIME_OUTPUT=OFF"
"LD_LIBRARY_PATH=${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}:$ENV{LD_LIBRARY_PATH}"
)
endif ()
# common
list (
2025-11-10 19:08:44 +01:00
APPEND TEST_ENVIRONMENT
2025-11-03 11:03:35 -05:00
"ROCPROFSYS_CI=ON"
"ROCPROFSYS_CI_TIMEOUT=${TEST_TIMEOUT}"
"ROCPROFSYS_CONFIG_FILE="
"ROCPROFSYS_OUTPUT_PATH=${PROJECT_BINARY_DIR}/rocprof-sys-tests-output"
"TWD=${TEST_WORKING_DIRECTORY}"
)
# copy for inverse
set ( TEST_ENVIRONMENT_INV "${TEST_ENVIRONMENT}" )
# different for regular test and inverse test
list ( APPEND TEST_ENVIRONMENT "ROCPROFSYS_OUTPUT_PREFIX=${TEST_NAME}/" )
list ( APPEND TEST_ENVIRONMENT_INV "ROCPROFSYS_OUTPUT_PREFIX=${TEST_NAME}-inverse/" )
if (
NOT "${TEST_PASS_REGEX}" STREQUAL ""
AND NOT "${TEST_FAIL_REGEX}" STREQUAL ""
AND NOT "${TEST_FAIL_REGEX}" MATCHES "\\|ROCPROFSYS_ABORT_FAIL_REGEX"
)
rocprofiler_systems_message (
FATAL_ERROR
"${TEST_NAME} has set pass and fail regexes but fail regex does not include '|ROCPROFSYS_ABORT_FAIL_REGEX'"
)
endif ()
if ( "${TEST_FAIL_REGEX}" STREQUAL "" )
set ( TEST_FAIL_REGEX "(${ROCPROFSYS_ABORT_FAIL_REGEX})" )
else ()
string (
REPLACE
"|ROCPROFSYS_ABORT_FAIL_REGEX"
"|${ROCPROFSYS_ABORT_FAIL_REGEX}"
TEST_FAIL_REGEX
"${TEST_FAIL_REGEX}"
)
endif ()
if ( TEST_COMMAND )
add_test (
NAME ${ TEST_NAME }
COMMAND ${ TEST_COMMAND } ${ TEST_ARGS }
WORKING_DIRECTORY ${ TEST_WORKING_DIRECTORY }
)
set_tests_properties (
${ TEST_NAME }
PROPERTIES
ENVIRONMENT "${TEST_ENVIRONMENT}"
TIMEOUT ${ TEST_TIMEOUT }
DEPENDS "${TEST_DEPENDS}"
LABELS "rocprofiler-systems-bin;${TEST_LABELS}"
PASS_REGULAR_EXPRESSION "${TEST_PASS_REGEX}"
FAIL_REGULAR_EXPRESSION "${TEST_FAIL_REGEX}"
SKIP_REGULAR_EXPRESSION "${TEST_SKIP_REGEX}"
2025-11-14 03:01:04 +01:00
FIXTURES_REQUIRED rocprofsys-global-tmp-files
2025-11-03 11:03:35 -05:00
${ TEST_PROPERTIES }
)
elseif ( TARGET ${ TEST_TARGET } )
add_test (
NAME ${ TEST_NAME }
COMMAND $< TARGET_FILE:${TEST_TARGET} > ${ TEST_ARGS }
WORKING_DIRECTORY ${ TEST_WORKING_DIRECTORY }
)
set_tests_properties (
${ TEST_NAME }
PROPERTIES
ENVIRONMENT "${TEST_ENVIRONMENT}"
TIMEOUT ${ TEST_TIMEOUT }
DEPENDS "${TEST_DEPENDS}"
LABELS "rocprofiler-systems-bin;${TEST_LABELS}"
PASS_REGULAR_EXPRESSION "${TEST_PASS_REGEX}"
FAIL_REGULAR_EXPRESSION "${TEST_FAIL_REGEX}"
SKIP_REGULAR_EXPRESSION "${TEST_SKIP_REGEX}"
2025-11-14 03:01:04 +01:00
FIXTURES_REQUIRED rocprofsys-global-tmp-files
2025-11-03 11:03:35 -05:00
${ TEST_PROPERTIES }
)
elseif ( ROCPROFSYS_BUILD_TESTING )
message ( FATAL_ERROR "Error! ${TEST_TARGET} does not exist" )
endif ()
endfunction ()