1set(libs 2 ${mbedtls_target} 3 ${CMAKE_THREAD_LIBS_INIT} 4) 5 6# Set the project root directory if it's not already defined, as may happen if 7# the tests folder is included directly by a parent project, without including 8# the top level CMakeLists.txt. 9if(NOT DEFINED MBEDTLS_DIR) 10 set(MBEDTLS_DIR ${CMAKE_SOURCE_DIR}) 11endif() 12 13if(NOT MBEDTLS_PYTHON_EXECUTABLE) 14 message(FATAL_ERROR "Cannot build test suites without Python 3") 15endif() 16 17# generated .data files will go there 18file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/suites) 19 20# Get base names for generated files 21execute_process( 22 COMMAND 23 ${MBEDTLS_PYTHON_EXECUTABLE} 24 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_bignum_tests.py 25 --list-for-cmake 26 WORKING_DIRECTORY 27 ${CMAKE_CURRENT_SOURCE_DIR}/.. 28 OUTPUT_VARIABLE 29 base_bignum_generated_data_files) 30string(REGEX REPLACE "[^;]*/" "" 31 base_bignum_generated_data_files "${base_bignum_generated_data_files}") 32 33execute_process( 34 COMMAND 35 ${MBEDTLS_PYTHON_EXECUTABLE} 36 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_config_tests.py 37 --list-for-cmake 38 WORKING_DIRECTORY 39 ${CMAKE_CURRENT_SOURCE_DIR}/.. 40 OUTPUT_VARIABLE 41 base_config_generated_data_files) 42string(REGEX REPLACE "[^;]*/" "" 43 base_config_generated_data_files "${base_config_generated_data_files}") 44 45execute_process( 46 COMMAND 47 ${MBEDTLS_PYTHON_EXECUTABLE} 48 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_ecp_tests.py 49 --list-for-cmake 50 WORKING_DIRECTORY 51 ${CMAKE_CURRENT_SOURCE_DIR}/.. 52 OUTPUT_VARIABLE 53 base_ecp_generated_data_files) 54string(REGEX REPLACE "[^;]*/" "" 55 base_ecp_generated_data_files "${base_ecp_generated_data_files}") 56 57execute_process( 58 COMMAND 59 ${MBEDTLS_PYTHON_EXECUTABLE} 60 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_psa_tests.py 61 --list-for-cmake 62 WORKING_DIRECTORY 63 ${CMAKE_CURRENT_SOURCE_DIR}/.. 64 OUTPUT_VARIABLE 65 base_psa_generated_data_files) 66string(REGEX REPLACE "[^;]*/" "" 67 base_psa_generated_data_files "${base_psa_generated_data_files}") 68 69# Derive generated file paths in the build directory. The generated data 70# files go into the suites/ subdirectory. 71set(base_generated_data_files 72 ${base_bignum_generated_data_files} ${base_config_generated_data_files} 73 ${base_ecp_generated_data_files} ${base_psa_generated_data_files}) 74string(REGEX REPLACE "([^;]+)" "suites/\\1" 75 all_generated_data_files "${base_generated_data_files}") 76set(bignum_generated_data_files "") 77set(config_generated_data_files "") 78set(ecp_generated_data_files "") 79set(psa_generated_data_files "") 80foreach(file ${base_bignum_generated_data_files}) 81 list(APPEND bignum_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 82endforeach() 83foreach(file ${base_config_generated_data_files}) 84 list(APPEND config_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 85endforeach() 86foreach(file ${base_ecp_generated_data_files}) 87 list(APPEND ecp_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 88endforeach() 89foreach(file ${base_psa_generated_data_files}) 90 list(APPEND psa_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 91endforeach() 92 93if(GEN_FILES) 94 add_custom_command( 95 OUTPUT 96 ${bignum_generated_data_files} 97 WORKING_DIRECTORY 98 ${CMAKE_CURRENT_SOURCE_DIR}/.. 99 COMMAND 100 ${MBEDTLS_PYTHON_EXECUTABLE} 101 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_bignum_tests.py 102 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 103 DEPENDS 104 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_bignum_tests.py 105 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_common.py 106 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_core.py 107 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_mod_raw.py 108 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_mod.py 109 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_case.py 110 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_data_generation.py 111 ) 112 add_custom_command( 113 OUTPUT 114 ${config_generated_data_files} 115 WORKING_DIRECTORY 116 ${CMAKE_CURRENT_SOURCE_DIR}/.. 117 COMMAND 118 ${MBEDTLS_PYTHON_EXECUTABLE} 119 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_config_tests.py 120 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 121 DEPENDS 122 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_config_tests.py 123 # Do not declare the configuration files as dependencies: they 124 # change too often in ways that don't affect the result 125 # ((un)commenting some options). 126 ) 127 add_custom_command( 128 OUTPUT 129 ${ecp_generated_data_files} 130 WORKING_DIRECTORY 131 ${CMAKE_CURRENT_SOURCE_DIR}/.. 132 COMMAND 133 ${MBEDTLS_PYTHON_EXECUTABLE} 134 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_ecp_tests.py 135 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 136 DEPENDS 137 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_ecp_tests.py 138 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_common.py 139 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/ecp.py 140 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_case.py 141 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_data_generation.py 142 ) 143 add_custom_command( 144 OUTPUT 145 ${psa_generated_data_files} 146 WORKING_DIRECTORY 147 ${CMAKE_CURRENT_SOURCE_DIR}/.. 148 COMMAND 149 ${MBEDTLS_PYTHON_EXECUTABLE} 150 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_psa_tests.py 151 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 152 DEPENDS 153 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_psa_tests.py 154 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/crypto_data_tests.py 155 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/crypto_knowledge.py 156 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/macro_collector.py 157 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/psa_information.py 158 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/psa_storage.py 159 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_case.py 160 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_data_generation.py 161 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_config.h 162 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_values.h 163 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_extra.h 164 ) 165 166else() 167 foreach(file ${all_generated_data_files}) 168 link_to_source(${file}) 169 endforeach() 170endif() 171# CMake generates sub-makefiles for each target and calls them in subprocesses. 172# Without this command, cmake will generate rules in each sub-makefile. As a result, 173# they can cause race conditions in parallel builds. 174# With this line, only 4 sub-makefiles include the above command, that reduces 175# the risk of a race. 176add_custom_target(test_suite_bignum_generated_data DEPENDS ${bignum_generated_data_files}) 177add_custom_target(test_suite_config_generated_data DEPENDS ${config_generated_data_files}) 178add_custom_target(test_suite_ecp_generated_data DEPENDS ${ecp_generated_data_files}) 179add_custom_target(test_suite_psa_generated_data DEPENDS ${psa_generated_data_files}) 180# If SKIP_TEST_SUITES is not defined with -D, get it from the environment. 181if((NOT DEFINED SKIP_TEST_SUITES) AND (DEFINED ENV{SKIP_TEST_SUITES})) 182 set(SKIP_TEST_SUITES $ENV{SKIP_TEST_SUITES}) 183endif() 184# Test suites caught by SKIP_TEST_SUITES are built but not executed. 185# "foo" as a skip pattern skips "test_suite_foo" and "test_suite_foo.bar" 186# but not "test_suite_foobar". 187string(REGEX REPLACE "[ ,;]" "|" SKIP_TEST_SUITES_REGEX "${SKIP_TEST_SUITES}") 188string(REPLACE "." "\\." SKIP_TEST_SUITES_REGEX "${SKIP_TEST_SUITES_REGEX}") 189set(SKIP_TEST_SUITES_REGEX "^(${SKIP_TEST_SUITES_REGEX})(\$|\\.)") 190 191function(add_test_suite suite_name) 192 if(ARGV1) 193 set(data_name ${ARGV1}) 194 else() 195 set(data_name ${suite_name}) 196 endif() 197 198 # Get the test names of the tests with generated .data files 199 # from the generated_data_files list in parent scope. 200 set(bignum_generated_data_names "") 201 set(config_generated_data_names "") 202 set(ecp_generated_data_names "") 203 set(psa_generated_data_names "") 204 foreach(generated_data_file ${bignum_generated_data_files}) 205 # Get the plain filename 206 get_filename_component(generated_data_name ${generated_data_file} NAME) 207 # Remove the ".data" extension 208 get_name_without_last_ext(generated_data_name ${generated_data_name}) 209 # Remove leading "test_suite_" 210 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 211 list(APPEND bignum_generated_data_names ${generated_data_name}) 212 endforeach() 213 foreach(generated_data_file ${config_generated_data_files}) 214 # Get the plain filename 215 get_filename_component(generated_data_name ${generated_data_file} NAME) 216 # Remove the ".data" extension 217 get_name_without_last_ext(generated_data_name ${generated_data_name}) 218 # Remove leading "test_suite_" 219 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 220 list(APPEND config_generated_data_names ${generated_data_name}) 221 endforeach() 222 foreach(generated_data_file ${ecp_generated_data_files}) 223 # Get the plain filename 224 get_filename_component(generated_data_name ${generated_data_file} NAME) 225 # Remove the ".data" extension 226 get_name_without_last_ext(generated_data_name ${generated_data_name}) 227 # Remove leading "test_suite_" 228 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 229 list(APPEND ecp_generated_data_names ${generated_data_name}) 230 endforeach() 231 foreach(generated_data_file ${psa_generated_data_files}) 232 # Get the plain filename 233 get_filename_component(generated_data_name ${generated_data_file} NAME) 234 # Remove the ".data" extension 235 get_name_without_last_ext(generated_data_name ${generated_data_name}) 236 # Remove leading "test_suite_" 237 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 238 list(APPEND psa_generated_data_names ${generated_data_name}) 239 endforeach() 240 241 if(";${bignum_generated_data_names};" MATCHES ";${data_name};") 242 set(data_file 243 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 244 set(dependency test_suite_bignum_generated_data) 245 elseif(";${config_generated_data_names};" MATCHES ";${data_name};") 246 set(data_file 247 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 248 set(dependency test_suite_config_generated_data) 249 elseif(";${ecp_generated_data_names};" MATCHES ";${data_name};") 250 set(data_file 251 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 252 set(dependency test_suite_ecp_generated_data) 253 elseif(";${psa_generated_data_names};" MATCHES ";${data_name};") 254 set(data_file 255 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 256 set(dependency test_suite_psa_generated_data) 257 else() 258 set(data_file 259 ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${data_name}.data) 260 set(dependency 261 test_suite_bignum_generated_data 262 test_suite_config_generated_data 263 test_suite_ecp_generated_data 264 test_suite_psa_generated_data) 265 endif() 266 267 add_custom_command( 268 OUTPUT 269 # The output filename of generate_test_code.py is derived from the -d 270 # input argument. 271 test_suite_${data_name}.c 272 COMMAND 273 ${MBEDTLS_PYTHON_EXECUTABLE} 274 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_test_code.py 275 -f ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${suite_name}.function 276 -d ${data_file} 277 -t ${CMAKE_CURRENT_SOURCE_DIR}/suites/main_test.function 278 -p ${CMAKE_CURRENT_SOURCE_DIR}/suites/host_test.function 279 -s ${CMAKE_CURRENT_SOURCE_DIR}/suites 280 --helpers-file ${CMAKE_CURRENT_SOURCE_DIR}/suites/helpers.function 281 -o . 282 DEPENDS 283 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_test_code.py 284 ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${suite_name}.function 285 ${data_file} 286 ${CMAKE_CURRENT_SOURCE_DIR}/suites/main_test.function 287 ${CMAKE_CURRENT_SOURCE_DIR}/suites/host_test.function 288 ${CMAKE_CURRENT_SOURCE_DIR}/suites/helpers.function 289 ${mbedtls_target} 290 BYPRODUCTS 291 test_suite_${data_name}.datax 292 ) 293 294 add_executable(test_suite_${data_name} test_suite_${data_name}.c 295 $<TARGET_OBJECTS:mbedtls_test> 296 $<TARGET_OBJECTS:mbedtls_test_helpers>) 297 add_dependencies(test_suite_${data_name} ${dependency}) 298 target_link_libraries(test_suite_${data_name} ${libs}) 299 # Include test-specific header files from ./include and private header 300 # files (used by some invasive tests) from ../library. Public header 301 # files are automatically included because the library targets declare 302 # them as PUBLIC. 303 target_include_directories(test_suite_${data_name} 304 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include 305 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../library) 306 # Request C11, which is needed for memory poisoning tests 307 set_target_properties(test_suite_${data_name} PROPERTIES C_STANDARD 11) 308 309 if(${data_name} MATCHES ${SKIP_TEST_SUITES_REGEX}) 310 message(STATUS "The test suite ${data_name} will not be executed.") 311 else() 312 add_test(${data_name}-suite test_suite_${data_name} --verbose) 313 endif() 314endfunction(add_test_suite) 315 316# Enable definition of various functions used throughout the testsuite 317# (gethostname, strdup, fileno...) even when compiling with -std=c99. Harmless 318# on non-POSIX platforms. 319add_definitions("-D_POSIX_C_SOURCE=200809L") 320 321if(CMAKE_COMPILER_IS_CLANG) 322 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code") 323endif(CMAKE_COMPILER_IS_CLANG) 324 325if(MSVC) 326 # If a warning level has been defined, suppress all warnings for test code 327 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W0") 328 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX-") 329endif(MSVC) 330 331file(GLOB test_suites RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" suites/*.data) 332list(APPEND test_suites ${all_generated_data_files}) 333# If the generated .data files are present in the source tree, we just added 334# them twice, both through GLOB and through ${all_generated_data_files}. 335list(REMOVE_DUPLICATES test_suites) 336list(SORT test_suites) 337foreach(test_suite ${test_suites}) 338 get_filename_component(data_name ${test_suite} NAME) 339 string(REGEX REPLACE "\\.data\$" "" data_name "${data_name}") 340 string(REPLACE "test_suite_" "" data_name "${data_name}") 341 string(REGEX MATCH "[^.]*" function_name "${data_name}") 342 add_test_suite(${function_name} ${data_name}) 343endforeach(test_suite) 344 345# Make scripts and data files needed for testing available in an 346# out-of-source build. 347if (NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) 348 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/seedfile") 349 link_to_source(seedfile) 350 endif() 351 link_to_source(Descriptions.txt) 352 link_to_source(compat.sh) 353 link_to_source(context-info.sh) 354 link_to_source(../framework/data_files) 355 link_to_source(scripts) 356 link_to_source(ssl-opt.sh) 357 link_to_source(opt-testcases) 358endif() 359