#
# Copyright (c) 2022 Arm Limited.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the License); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

add_subdirectory(test_message_handler)

set(TEST_MESSAGE_HANDLER_MODEL_0 "model.h" CACHE STRING "Path to built in model 0")
set(TEST_MESSAGE_HANDLER_MODEL_1 "" CACHE STRING "Path to built in model 1")
set(TEST_MESSAGE_HANDLER_MODEL_2 "" CACHE STRING "Path to built in model 2")
set(TEST_MESSAGE_HANDLER_MODEL_3 "" CACHE STRING "Path to built in model 3")

function(ethosu_add_message_handler_test testname)
    if(TARGET ethosu_core_driver)
        file(GLOB models LIST_DIRECTORIES true "${CMAKE_CURRENT_SOURCE_DIR}/../../baremetal/models/${ETHOSU_TARGET_NPU_CONFIG}/*")
    endif()

    foreach(model ${models})
        get_filename_component(modelname ${model} NAME)
        ethosu_add_executable_test(mh_${testname}_${modelname}
            SOURCES
                ${testname}.cpp
                message_client.cpp
            LIBRARIES
                message_handler_lib
                freertos_kernel)

        get_target_property(INTERFACE_LINK_LIBRARIES ethosu_target_startup INTERFACE_LINK_LIBRARIES)
        if (NOT ethosu_mhu_dummy IN_LIST INTERFACE_LINK_LIBRARIES)
            target_link_libraries(mh_${testname}_${modelname} PRIVATE ethosu_mhu_dummy)
        endif()


        target_include_directories(mh_${testname}_${modelname} PRIVATE
            ../indexed_networks
            ${model}
            ${LINUX_DRIVER_STACK_PATH}/kernel)

        target_compile_definitions(mh_${testname}_${modelname} PRIVATE
            TENSOR_ARENA_SIZE=${MESSAGE_HANDLER_ARENA_SIZE}
            $<$<BOOL:${TEST_MESSAGE_HANDLER_MODEL_0}>:MODEL_0=${TEST_MESSAGE_HANDLER_MODEL_0}>
            $<$<BOOL:${TEST_MESSAGE_HANDLER_MODEL_1}>:MODEL_1=${TEST_MESSAGE_HANDLER_MODEL_1}>
            $<$<BOOL:${TEST_MESSAGE_HANDLER_MODEL_2}>:MODEL_2=${TEST_MESSAGE_HANDLER_MODEL_2}>
            $<$<BOOL:${TEST_MESSAGE_HANDLER_MODEL_3}>:MODEL_3=${TEST_MESSAGE_HANDLER_MODEL_3}>)
    endforeach()
endfunction()

ethosu_add_message_handler_test(run_inference_test)
ethosu_add_message_handler_test(cancel_reject_inference_test)
