1#
2# Arm SCP/MCP Software
3# Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8if(TEST_ON_HOST)
9    # Duplicate list of framework sources to be added to build
10    foreach(fwk_src IN LISTS FWK_SRC)
11        list(APPEND ${TEST_FILE}_FWK_SRC ${fwk_src})
12    endforeach()
13
14    # Duplicate list of framework mock sources to be added to build
15    foreach(fwk_mock_src IN LISTS FWK_MOCK_SRC)
16        list(APPEND ${TEST_FILE}_FWK_MOCK_SRC ${fwk_mock_src})
17    endforeach()
18
19    # Create unit test target
20    add_executable(${UNIT_TEST_TARGET}
21                   ${MODULE_UT_SRC}/${TEST_FILE}_unit_test.c)
22endif()
23
24if(TEST_ON_TARGET)
25    # Add sources to test target
26    target_sources(${UNIT_TEST_TARGET}
27                  PRIVATE ${MODULE_UT_SRC}/${TEST_FILE}_unit_test.c)
28
29    target_compile_definitions(
30        ${UNIT_TEST_TARGET}
31        PUBLIC "UNITY_INCLUDE_CONFIG_H=\"unity_config.h\""
32        PUBLIC "TEST_ON_TARGET")
33endif()
34
35# Include test module source in unit test c source file.
36target_compile_definitions(
37    ${UNIT_TEST_TARGET}
38    PUBLIC "UNIT_TEST_SRC=\"${MODULE_SRC}/${TEST_SRC}.c\"")
39
40
41target_include_directories(
42    ${UNIT_TEST_TARGET}
43    PRIVATE ${MODULE_SRC}
44            ${MODULE_INC}
45            ${OTHER_MODULE_INC}
46            ${UNITY_SRC_ROOT}
47            ${CMOCK_SRC_ROOT}
48            ${MODULE_UT_SRC}
49            ${MODULE_UT_INC}
50            ${MODULE_UT_MOCK_SRC})
51
52if(EXISTS ${MODULE_INC}/internal)
53    target_include_directories(${UNIT_TEST_TARGET}
54                               PRIVATE ${MODULE_INC}/internal)
55endif()
56
57if(EXISTS ${MODULE_UT_MOCK_SRC}/Mock${TEST_FILE}_extra.c)
58    target_sources(${UNIT_TEST_TARGET}
59                   PRIVATE ${MODULE_UT_MOCK_SRC}/Mock${TEST_FILE}_extra.c)
60endif()
61
62if(TEST_ON_HOST)
63    target_include_directories(
64        ${UNIT_TEST_TARGET}
65        PRIVATE ${FWK_MOCKS_SRC_ROOT}
66                ${FWK_MOCKS_SRC_ROOT}/..
67        )
68
69    if(EXISTS ${MODULE_UT_INC}/fwk_module_idx.h)
70        target_compile_definitions(
71            ${UNIT_TEST_TARGET}
72            PRIVATE "FWK_TEST_FILE_IDX_H=\"${${TEST_TARGET}_MODULE_IDX_H}\"")
73    endif()
74
75    macro(replace_with_mock FILENAME)
76        list(FILTER ${TEST_FILE}_FWK_SRC EXCLUDE REGEX "${FILENAME}.c")
77        list(APPEND ${TEST_FILE}_FWK_SRC ${FWK_MOCKS_SRC_ROOT}/Mock${FILENAME}.c)
78        if(EXISTS ${FWK_MOCKS_SRC_ROOT}/internal/Mock${FILENAME}_internal.c)
79            list(APPEND ${TEST_FILE}_FWK_SRC
80                        ${FWK_MOCKS_SRC_ROOT}/internal/Mock${FILENAME}_internal.c)
81        endif()
82    endmacro()
83
84    foreach(MOCK IN LISTS MOCK_REPLACEMENTS)
85        if(${MOCK} STREQUAL fwk_notify)
86            target_compile_definitions(${UNIT_TEST_TARGET} PUBLIC "BUILD_HAS_NOTIFICATION")
87            list(APPEND ${TEST_FILE}_FWK_SRC ${FWK_MOCKS_SRC_ROOT}/Mockfwk_notification.c)
88            list(APPEND ${TEST_FILE}_FWK_SRC
89                        ${FWK_MOCKS_SRC_ROOT}/internal/Mockfwk_notification_internal.c)
90        elseif(${MOCK} STREQUAL fwk_core)
91            replace_with_mock(fwk_core)
92            list(FILTER ${TEST_FILE}_FWK_SRC EXCLUDE REGEX "fwk_delayed_resp.c")
93        else()
94            replace_with_mock(${MOCK})
95        endif()
96    endforeach()
97
98    target_sources(${UNIT_TEST_TARGET} PRIVATE ${${TEST_FILE}_FWK_SRC}
99                   ${${TEST_FILE}_FWK_MOCK_SRC})
100
101    target_compile_definitions(
102        ${UNIT_TEST_TARGET}
103        PUBLIC "BUILD_VERSION_DESCRIBE_STRING=\"${SCP_UNIT_TEST_DESCRIBE}\""
104               "BUILD_VERSION_MAJOR=${SCP_UNIT_TEST_VERSION_MAJOR}"
105               "BUILD_VERSION_MINOR=${SCP_UNIT_TEST_VERSION_MINOR}"
106               "BUILD_VERSION_PATCH=0")
107
108    target_compile_definitions(${UNIT_TEST_TARGET} PUBLIC "PERF_OPT")
109
110    foreach(COMPILE_FLAG IN LISTS EXTRA_COMPILE_FLAGS)
111        target_compile_options(${UNIT_TEST_TARGET} PRIVATE "${COMPILE_FLAG}")
112    endforeach()
113
114    # Include framework includes
115    target_include_directories(${UNIT_TEST_TARGET} PUBLIC "${FWK_INC_ROOT}")
116    target_sources(${UNIT_TEST_TARGET} PUBLIC ${SCP_UNITY_SRC})
117    target_link_options(${UNIT_TEST_TARGET}
118                        PRIVATE "LINKER:-wrap=fwk_log_printf --coverage -lgcov")
119    target_link_libraries(${UNIT_TEST_TARGET} PRIVATE gcov)
120    # Add test to CTest
121    add_test(NAME ${UNIT_TEST_TARGET} COMMAND ${UNIT_TEST_TARGET})
122endif()
123
124unset(MOCK_REPLACEMENTS)
125