# ----------------------------------------------------------------------------
# Copyright (c) 2026 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# ----------------------------------------------------------------------------

cmake_minimum_required(VERSION 3.16)

if(UT_TEST_ALL OR OP_GRAPH_UT)
    gen_es_math_lib_ready()
    if(TARGET ${OP_GRAPH_MODULE_NAME}_cases_obj)
        add_dependencies(${OP_GRAPH_MODULE_NAME}_cases_obj json build_es_math)
        target_link_libraries(${OP_GRAPH_MODULE_NAME}_cases_obj PRIVATE es_math)
    endif()

    ## add opgraph ut exe:  math_op_graph_ut
    set(OP_GRAPH_UT_EXE ${PKG_NAME}_op_graph_ut)
    
    add_executable(${OP_GRAPH_UT_EXE}
            test_op_graph_main.cpp
    )

    target_include_directories(${OP_GRAPH_UT_EXE} PRIVATE
        ${OP_PROTO_INCLUDE}
        ${OPBASE_INC_DIRS}
        ${PROJECT_SOURCE_DIR}/common/inc
    )

    # 当前桩函数实现不完整,优先从环境变量中链接so
    set_target_properties(${OP_GRAPH_UT_EXE} PROPERTIES
        SKIP_BUILD_RPATH TRUE
    )

    target_compile_definitions(${OP_GRAPH_UT_EXE} PRIVATE LOG_CPP)
    target_compile_options(${OP_GRAPH_UT_EXE} PUBLIC -fPIE -fno-access-control)
    add_dependencies(${OP_GRAPH_UT_EXE} json build_es_math opbase_util_objs opbase_infer_objs)
    target_link_directories(${OP_GRAPH_UT_EXE} PRIVATE ${ASCEND_DIR}/${SYSTEM_PREFIX}/lib64)
    target_link_libraries(${OP_GRAPH_UT_EXE} PRIVATE
        es_math
        $<BUILD_INTERFACE:intf_llt_pub_asan_cxx17>
        -Wl,--whole-archive
        $<$<TARGET_EXISTS:${OP_GRAPH_MODULE_NAME}_static_lib>:${OP_GRAPH_MODULE_NAME}_static_lib>
        -Wl,--no-whole-archive
        -Wl,--no-as-needed
        metadef
        -Wl,--as-needed
        error_manager
        exe_graph
        graph_base
        GTest::gtest
        graph
        register
        platform
        unified_dlog
        opp_registry
        c_sec
        ge_common
        dl
    )

    if(ENABLE_UT_EXEC)
        if(NOT "${GTEST_FILTER}" STREQUAL "")
            set(GTEST_FILTER_ARG "--gtest_filter=${GTEST_FILTER}")
        else()
            set(GTEST_FILTER_ARG "")
        endif()
        if(${ENABLE_ASAN} STREQUAL "TRUE")
            execute_process(
                COMMAND ${CMAKE_C_COMPILER} -print-file-name=libasan.so
                OUTPUT_VARIABLE LIBASAN_PATH
                OUTPUT_STRIP_TRAILING_WHITESPACE
                RESULT_VARIABLE result
            )
            if(NOT result EQUAL 0)
                message(FATAL_ERROR "compiler not support asan, please disable asan")
            endif()
        
            execute_process(
                COMMAND ${CMAKE_C_COMPILER} -print-file-name=libstdc++.so
                OUTPUT_VARIABLE LIBSTDC_PATH
                OUTPUT_STRIP_TRAILING_WHITESPACE
                RESULT_VARIABLE stdc_result
            )
            if(NOT stdc_result EQUAL 0)
                message(FATAL_ERROR "not find libstdc++.so, please confirm.")
            endif()

            add_custom_command(
                TARGET ${OP_GRAPH_UT_EXE} POST_BUILD
                COMMAND export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/es_packages_math/lib64:${CMAKE_BINARY_DIR}/es_packages/lib64:${LIB_OP_TILING_SO_PATH}:$ENV{LD_LIBRARY_PATH} && BUILD_PATH=${BUILD_PATH}
                LD_PRELOAD=${LIBASAN_PATH}:${LIBSTDC_PATH} ASAN_OPTIONS=detect_leaks=0 && ./${OP_GRAPH_UT_EXE} ${GTEST_FILTER_ARG}
                COMMENT "Run ops op_graph utest with asan"
            )
        else()
            add_custom_command(
                TARGET ${OP_GRAPH_UT_EXE} POST_BUILD
                COMMAND export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/es_packages_math/lib64:${CMAKE_BINARY_DIR}/es_packages/lib64:${LIB_OP_TILING_SO_PATH}:$ENV{LD_LIBRARY_PATH}:${ASCEND_DIR}/${SYSTEM_PREFIX}/lib64 && ./${OP_GRAPH_UT_EXE} ${GTEST_FILTER_ARG}
                COMMENT "Run ops op_graph utest"
            )
        endif()
    endif()

    if(${ENABLE_VALGRIND} STREQUAL "TRUE")
        if(NOT LIB_OP_TILING_SO_PATH)
            message(FATAL_ERROR "Can not found optiling so!")
            return()
        endif()
        add_custom_command(
            TARGET ${OP_GRAPH_UT_EXE} POST_BUILD
            COMMAND export LD_LIBRARY_PATH=${LIB_OP_TILING_SO_PATH}:$ENV{LD_LIBRARY_PATH} &&
            valgrind --undef-value-errors=no --leak-check=full ./${OP_GRAPH_UT_EXE} ${GTEST_FILTER_ARG}
            COMMENT "Run ops op_graph utest by valgrind"
        )
    endif()
endif()