1#
2# Arm SCP/MCP Software
3# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8cmake_minimum_required(VERSION 3.18.3)
9
10project(
11    SCP_FWK_TEST
12    VERSION 2.11.0
13    DESCRIPTION "Arm SCP/MCP Software Framework tests"
14    HOMEPAGE_URL
15        "https://developer.arm.com/tools-and-software/open-source-software/firmware/scp-firmware"
16    LANGUAGES C ASM)
17
18set(SCP_FWK_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
19
20# Get details about current source version
21find_package(Git)
22if(GIT_FOUND)
23    execute_process(
24        COMMAND "${GIT_EXECUTABLE}" describe --tags --dirty --always
25        WORKING_DIRECTORY "${SCP_FWK_TEST_DIR}"
26        OUTPUT_VARIABLE SCP_FWK_TEST_DESCRIBE
27        OUTPUT_STRIP_TRAILING_WHITESPACE)
28endif()
29
30if(NOT SCP_FWK_TEST_DESCRIBE)
31    set(SCP_FWK_TEST_DESCRIBE "v${SCP_FWK_TEST_VERSION}-<unknown>")
32endif()
33
34# Set up toplevel paths
35set(FWK_TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
36set(FWK_SRC_ROOT ${FWK_TEST_ROOT}/../src)
37set(FWK_INC_ROOT ${FWK_TEST_ROOT}/../include)
38set(FWK_TEST_SRC_ROOT ${FWK_TEST_ROOT})
39set(FWK_TEST_INC_ROOT ${FWK_TEST_ROOT}/include)
40set(FWK_SCP_ROOT ${FWK_TEST_ROOT}/../..)
41
42# Setup additional compiler flags
43list(APPEND EXTRA_COMPILE_FLAGS -g3)
44list(APPEND EXTRA_COMPILE_FLAGS -Wall)
45list(APPEND EXTRA_COMPILE_FLAGS -Wextra)
46list(APPEND EXTRA_COMPILE_FLAGS -Werror)
47list(APPEND EXTRA_COMPILE_FLAGS -Wno-missing-field-initializers)
48list(APPEND EXTRA_COMPILE_FLAGS -Wno-error=deprecated-declarations)
49list(APPEND EXTRA_COMPILE_FLAGS -Wno-unused-parameter)
50list(APPEND EXTRA_COMPILE_FLAGS -Wno-strict-aliasing)
51list(APPEND EXTRA_COMPILE_FLAGS -std=gnu11)
52list(APPEND EXTRA_COMPILE_FLAGS -DBUILD_MODE_DEBUG)
53list(APPEND EXTRA_COMPILE_FLAGS -DBUILD_TESTS)
54
55# Add test targets
56list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_equality)
57list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_get_idx)
58list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_type)
59list(APPEND SCP_FWK_TEST_TARGETS test_fwk_interrupt)
60list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_contains)
61list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_empty)
62list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_get)
63list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_head)
64list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_init)
65list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_insert)
66list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_next)
67list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_pop)
68list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_push)
69list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_remove)
70list(APPEND SCP_FWK_TEST_TARGETS test_fwk_macros)
71list(APPEND SCP_FWK_TEST_TARGETS test_fwk_math)
72list(APPEND SCP_FWK_TEST_TARGETS test_fwk_module)
73list(APPEND SCP_FWK_TEST_TARGETS test_fwk_notification)
74list(APPEND SCP_FWK_TEST_TARGETS test_fwk_ring)
75list(APPEND SCP_FWK_TEST_TARGETS test_fwk_ring_init)
76list(APPEND SCP_FWK_TEST_TARGETS test_fwk_string)
77list(APPEND SCP_FWK_TEST_TARGETS test_fwk_core)
78
79# Create a list of the tests that need notifications.
80list(APPEND NOTIFICATION_ENABLED_TEST test_fwk_module test_fwk_notification
81     test_fwk_core)
82
83# Some test may need its own implementation of some of the function
84# for testing purpose. Create a list per test of these functions.
85list(APPEND test_fwk_module_WRAP __fwk_notification_init)
86list(APPEND test_fwk_module_WRAP __fwk_init)
87list(APPEND test_fwk_module_WRAP __fwk_run)
88list(APPEND test_fwk_module_WRAP fwk_mm_calloc)
89
90list(APPEND test_fwk_core_WRAP fwk_module_get_ctx)
91list(APPEND test_fwk_core_WRAP fwk_module_get_element_ctx)
92list(APPEND test_fwk_core_WRAP __fwk_slist_push_tail)
93list(APPEND test_fwk_core_WRAP fwk_mm_calloc)
94list(APPEND test_fwk_core_WRAP fwk_is_interrupt_context)
95list(APPEND test_fwk_core_WRAP fwk_interrupt_global_disable)
96list(APPEND test_fwk_core_WRAP fwk_interrupt_global_enable)
97list(APPEND test_fwk_core_WRAP fwk_module_is_valid_entity_id)
98list(APPEND test_fwk_core_WRAP fwk_module_is_valid_event_id)
99list(APPEND test_fwk_core_WRAP fwk_module_is_valid_notification_id)
100
101list(APPEND test_fwk_notification_WRAP fwk_module_get_ctx)
102list(APPEND test_fwk_notification_WRAP fwk_module_get_element_ctx)
103list(APPEND test_fwk_notification_WRAP __fwk_get_current_event)
104list(APPEND test_fwk_notification_WRAP __fwk_put_notification)
105list(APPEND test_fwk_notification_WRAP fwk_mm_calloc)
106list(APPEND test_fwk_notification_WRAP fwk_is_interrupt_context)
107list(APPEND test_fwk_notification_WRAP fwk_interrupt_global_disable)
108list(APPEND test_fwk_notification_WRAP fwk_interrupt_global_enable)
109list(APPEND test_fwk_notification_WRAP fwk_module_is_valid_entity_id)
110list(APPEND test_fwk_notification_WRAP fwk_module_is_valid_notification_id)
111
112list(APPEND TEST_MODULE_IDX_H test_fwk_module)
113set(test_fwk_module_MODULE_IDX_H test_fwk_module_module_idx.h)
114
115list(LENGTH SCP_FWK_TEST_TARGETS SCP_FWK_TEST_MAX)
116
117# Set up common framework source to be built
118list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_arch.c)
119list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_dlist.c)
120list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_id.c)
121list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_io.c)
122list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_interrupt.c)
123list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_log.c)
124list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_mm.c)
125list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_module.c)
126list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_ring.c)
127list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_slist.c)
128list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_string.c)
129list(APPEND COMMON_SRC ${FWK_TEST_SRC_ROOT}/fwk_test.c)
130list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_delayed_resp.c)
131list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_time.c)
132
133# CMake internal function enables testing for this directory
134enable_testing()
135
136# cmake-lint: disable=E1120
137foreach(idx RANGE ${SCP_FWK_TEST_MAX})
138    if(idx EQUAL SCP_FWK_TEST_MAX)
139        break()
140    endif()
141
142    list(GET SCP_FWK_TEST_TARGETS ${idx} TEST_TARGET)
143
144    add_executable(${TEST_TARGET} ${TEST_TARGET}.c)
145
146    target_compile_definitions(
147        ${TEST_TARGET}
148        PUBLIC "BUILD_VERSION_DESCRIBE_STRING=\"${SCP_FWK_TEST_DESCRIBE}\""
149               "BUILD_VERSION_MAJOR=${SCP_FWK_TEST_VERSION_MAJOR}"
150               "BUILD_VERSION_MINOR=${SCP_FWK_TEST_VERSION_MINOR}")
151
152    foreach(COMPILE_FLAG IN LISTS EXTRA_COMPILE_FLAGS)
153        target_compile_options(${TEST_TARGET} PRIVATE "${COMPILE_FLAG}")
154    endforeach()
155
156    target_include_directories(
157        ${TEST_TARGET}
158        PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}"
159        PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include"
160        PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include")
161
162    target_sources(${TEST_TARGET} PRIVATE ${COMMON_SRC})
163
164    target_sources(${TEST_TARGET} PRIVATE ${FWK_SRC_ROOT}/fwk_core.c)
165
166
167    # Check whether this test need notification support
168    list(FIND NOTIFICATION_ENABLED_TEST ${TEST_TARGET} NOTIFICATIONS)
169    if(NOT NOTIFICATIONS EQUAL -1)
170        target_sources(${TEST_TARGET}
171                       PRIVATE ${FWK_SRC_ROOT}/fwk_notification.c)
172        target_compile_definitions(${TEST_TARGET}
173                                   PUBLIC "BUILD_HAS_NOTIFICATION")
174    endif()
175
176    # Check if this test requires any custom module_idx_h file
177    list(FIND TEST_MODULE_IDX_H ${TEST_TARGET} MODULE_IDX_H)
178    if(NOT MODULE_IDX_H EQUAL -1)
179        target_compile_definitions(
180            ${TEST_TARGET}
181            PRIVATE "FWK_TEST_MODULE_IDX_H=\"${${TEST_TARGET}_MODULE_IDX_H}\"")
182    endif()
183
184    # Use linker option to provide wrap functions
185    if(${TEST_TARGET}_WRAP)
186        foreach(link_option IN LISTS ${TEST_TARGET}_WRAP)
187            target_link_options(${TEST_TARGET}
188                                PRIVATE "LINKER:-wrap=${link_option}")
189        endforeach()
190    endif()
191
192    add_test(NAME ${TEST_TARGET} COMMAND ${TEST_TARGET})
193
194endforeach()
195