# Copyright (c) Advanced Micro Devices, Inc.
# SPDX-License-Identifier:  MIT

#
# rocprofiler-systems tests
#
include_guard(GLOBAL)

if(ROCPROFSYS_USE_PYTESTS)
    include(${CMAKE_CURRENT_LIST_DIR}/pytest/CMakeLists.txt)
else()
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-testing.cmake)

    # test groups
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-unit-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-config-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-instrument-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-pthread-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-rocm-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-user-api-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-mpi-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-ucx-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-kokkos-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-openmp-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-code-coverage-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-fork-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-time-window-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-attach-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-rccl-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-overflow-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-annotate-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-causal-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-python-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-decode-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-gpu-connect-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-nic-perf.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-roctx-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-rocm-hip-stream.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-binary-tests.cmake)
    include(${CMAKE_CURRENT_LIST_DIR}/rocprof-sys-thread-limit-tests.cmake)

    # -------------------------------------------------------------------------------------- #
    #
    # Global cleanup test for temporary files
    # This runs once after ALL tests complete to clean up trace cache temporary files
    # Uses FIXTURES_CLEANUP to ensure it runs after all tests requiring the fixture
    #
    # -------------------------------------------------------------------------------------- #

    #delete temp files created by rocprofiler-sys tests in /tmp owned by the current user. Always return success.
    add_test(
        NAME rocprofsys-cleanup-tmp-files
        COMMAND
            sh -c
            "find /tmp -maxdepth 1 -user $(whoami) \\( -name 'buffered_storage*.bin' -o -name 'metadata*.json' \\) -delete 2>/dev/null || true"
        WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
    )

    set_tests_properties(
        rocprofsys-cleanup-tmp-files
        PROPERTIES
            FIXTURES_CLEANUP rocprofsys-global-tmp-files
            LABELS "cleanup;global"
            TIMEOUT 30
    )
endif()

# ------------------------------------------------------------------------------#
#
# Move test files to build directory
#
# ------------------------------------------------------------------------------#

set(ROCPROFSYS_PYTHON_VALIDATION_FILES
    ${CMAKE_CURRENT_LIST_DIR}/validate-causal-json.py
    ${CMAKE_CURRENT_LIST_DIR}/validate-perfetto-proto.py
    ${CMAKE_CURRENT_LIST_DIR}/validate-rocpd.py
    ${CMAKE_CURRENT_LIST_DIR}/validate-timemory-json.py
)

set(ROCPROFSYS_TEST_SCRIPTS
    ${CMAKE_CURRENT_LIST_DIR}/run-rocprof-sys-pid.sh
    ${CMAKE_CURRENT_LIST_DIR}/get_default_nic.sh
    ${CMAKE_CURRENT_LIST_DIR}/generate_papi_nic_events.sh
)

add_custom_target(
    copy-test-files
    ALL
    COMMAND
        ${CMAKE_COMMAND} -E make_directory
        ${CMAKE_BINARY_DIR}/share/rocprofiler-systems/tests
    COMMAND
        ${CMAKE_COMMAND} -E copy_if_different ${ROCPROFSYS_PYTHON_VALIDATION_FILES}
        ${CMAKE_BINARY_DIR}/share/rocprofiler-systems/tests
    # copy_directory for directories (copy_if_different only works for files)
    COMMAND
        ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_CURRENT_LIST_DIR}/rocpd-validation-rules
        ${CMAKE_BINARY_DIR}/share/rocprofiler-systems/tests/rocpd-validation-rules
    COMMAND
        ${CMAKE_COMMAND} -E copy_if_different ${ROCPROFSYS_TEST_SCRIPTS}
        ${CMAKE_BINARY_DIR}/share/rocprofiler-systems/tests
)

# ------------------------------------------------------------------------------#
#
# Pytests install
#
# ------------------------------------------------------------------------------#

if(ROCPROFSYS_INSTALL_TESTING)
    # Python Validation scripts
    install(
        PROGRAMS ${ROCPROFSYS_PYTHON_VALIDATION_FILES}
        DESTINATION share/rocprofiler-systems/tests
        COMPONENT rocprofiler-systems-tests
    )
    install(
        DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/rocpd-validation-rules
        DESTINATION share/rocprofiler-systems/tests
        COMPONENT rocprofiler-systems-tests
    )
    # Scripts
    install(
        PROGRAMS ${ROCPROFSYS_TEST_SCRIPTS}
        DESTINATION share/rocprofiler-systems/tests
        COMPONENT rocprofiler-systems-tests
    )
endif()
