CMakeLists.txt (18035B)
1 set(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. 9 if(NOT DEFINED MBEDTLS_DIR) 10 set(MBEDTLS_DIR ${CMAKE_SOURCE_DIR}) 11 endif() 12 13 if(NOT MBEDTLS_PYTHON_EXECUTABLE) 14 message(FATAL_ERROR "Cannot build test suites without Python 3") 15 endif() 16 17 # generated .data files will go there 18 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/suites) 19 20 # Get base names for generated files 21 execute_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) 30 string(REGEX REPLACE "[^;]*/" "" 31 base_bignum_generated_data_files "${base_bignum_generated_data_files}") 32 33 execute_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) 42 string(REGEX REPLACE "[^;]*/" "" 43 base_config_generated_data_files "${base_config_generated_data_files}") 44 45 execute_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) 54 string(REGEX REPLACE "[^;]*/" "" 55 base_ecp_generated_data_files "${base_ecp_generated_data_files}") 56 57 execute_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) 66 string(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. 71 set(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}) 74 string(REGEX REPLACE "([^;]+)" "suites/\\1" 75 all_generated_data_files "${base_generated_data_files}") 76 set(bignum_generated_data_files "") 77 set(config_generated_data_files "") 78 set(ecp_generated_data_files "") 79 set(psa_generated_data_files "") 80 foreach(file ${base_bignum_generated_data_files}) 81 list(APPEND bignum_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 82 endforeach() 83 foreach(file ${base_config_generated_data_files}) 84 list(APPEND config_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 85 endforeach() 86 foreach(file ${base_ecp_generated_data_files}) 87 list(APPEND ecp_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 88 endforeach() 89 foreach(file ${base_psa_generated_data_files}) 90 list(APPEND psa_generated_data_files ${CMAKE_CURRENT_BINARY_DIR}/suites/${file}) 91 endforeach() 92 93 if(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 128 add_custom_command( 129 OUTPUT 130 ${CMAKE_CURRENT_SOURCE_DIR}/opt-testcases/handshake-generated.sh 131 WORKING_DIRECTORY 132 ${CMAKE_CURRENT_SOURCE_DIR}/.. 133 COMMAND 134 "${MBEDTLS_PYTHON_EXECUTABLE}" 135 "${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_tls_handshake_tests.py" 136 DEPENDS 137 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/tls_test_case.py 138 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_tls_handshake_tests.py 139 ) 140 add_custom_target(handshake-generated.sh 141 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/opt-testcases/handshake-generated.sh) 142 set_target_properties(handshake-generated.sh PROPERTIES EXCLUDE_FROM_ALL NO) 143 add_dependencies(${ssl_opt_target} handshake-generated.sh) 144 145 add_custom_command( 146 OUTPUT 147 ${ecp_generated_data_files} 148 WORKING_DIRECTORY 149 ${CMAKE_CURRENT_SOURCE_DIR}/.. 150 COMMAND 151 ${MBEDTLS_PYTHON_EXECUTABLE} 152 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_ecp_tests.py 153 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 154 DEPENDS 155 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_ecp_tests.py 156 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/bignum_common.py 157 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/ecp.py 158 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_case.py 159 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_data_generation.py 160 ) 161 add_custom_command( 162 OUTPUT 163 ${psa_generated_data_files} 164 WORKING_DIRECTORY 165 ${CMAKE_CURRENT_SOURCE_DIR}/.. 166 COMMAND 167 ${MBEDTLS_PYTHON_EXECUTABLE} 168 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_psa_tests.py 169 --directory ${CMAKE_CURRENT_BINARY_DIR}/suites 170 DEPENDS 171 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_psa_tests.py 172 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/crypto_data_tests.py 173 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/crypto_knowledge.py 174 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/macro_collector.py 175 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/psa_information.py 176 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/psa_storage.py 177 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/psa_test_case.py 178 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_case.py 179 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/mbedtls_framework/test_data_generation.py 180 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_config.h 181 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_values.h 182 ${CMAKE_CURRENT_SOURCE_DIR}/../include/psa/crypto_extra.h 183 ) 184 185 add_custom_command( 186 OUTPUT 187 ${CMAKE_CURRENT_SOURCE_DIR}/opt-testcases/tls13-compat.sh 188 WORKING_DIRECTORY 189 ${CMAKE_CURRENT_SOURCE_DIR}/.. 190 COMMAND 191 "${MBEDTLS_PYTHON_EXECUTABLE}" 192 "${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_tls13_compat_tests.py" 193 DEPENDS 194 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_tls13_compat_tests.py 195 ) 196 add_custom_target(tls13-compat.sh 197 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/opt-testcases/tls13-compat.sh) 198 set_target_properties(tls13-compat.sh PROPERTIES EXCLUDE_FROM_ALL NO) 199 add_dependencies(${ssl_opt_target} tls13-compat.sh) 200 201 else() 202 foreach(file ${all_generated_data_files}) 203 link_to_source(${file}) 204 endforeach() 205 endif() 206 # CMake generates sub-makefiles for each target and calls them in subprocesses. 207 # Without this command, cmake will generate rules in each sub-makefile. As a result, 208 # they can cause race conditions in parallel builds. 209 # With this line, only 4 sub-makefiles include the above command, that reduces 210 # the risk of a race. 211 add_custom_target(test_suite_bignum_generated_data DEPENDS ${bignum_generated_data_files}) 212 add_custom_target(test_suite_config_generated_data DEPENDS ${config_generated_data_files}) 213 add_custom_target(test_suite_ecp_generated_data DEPENDS ${ecp_generated_data_files}) 214 add_custom_target(test_suite_psa_generated_data DEPENDS ${psa_generated_data_files}) 215 # If SKIP_TEST_SUITES is not defined with -D, get it from the environment. 216 if((NOT DEFINED SKIP_TEST_SUITES) AND (DEFINED ENV{SKIP_TEST_SUITES})) 217 set(SKIP_TEST_SUITES $ENV{SKIP_TEST_SUITES}) 218 endif() 219 # Test suites caught by SKIP_TEST_SUITES are built but not executed. 220 # "foo" as a skip pattern skips "test_suite_foo" and "test_suite_foo.bar" 221 # but not "test_suite_foobar". 222 string(REGEX REPLACE "[ ,;]" "|" SKIP_TEST_SUITES_REGEX "${SKIP_TEST_SUITES}") 223 string(REPLACE "." "\\." SKIP_TEST_SUITES_REGEX "${SKIP_TEST_SUITES_REGEX}") 224 set(SKIP_TEST_SUITES_REGEX "^(${SKIP_TEST_SUITES_REGEX})(\$|\\.)") 225 226 function(add_test_suite suite_name) 227 if(ARGV1) 228 set(data_name ${ARGV1}) 229 else() 230 set(data_name ${suite_name}) 231 endif() 232 233 # Get the test names of the tests with generated .data files 234 # from the generated_data_files list in parent scope. 235 set(bignum_generated_data_names "") 236 set(config_generated_data_names "") 237 set(ecp_generated_data_names "") 238 set(psa_generated_data_names "") 239 foreach(generated_data_file ${bignum_generated_data_files}) 240 # Get the plain filename 241 get_filename_component(generated_data_name ${generated_data_file} NAME) 242 # Remove the ".data" extension 243 get_name_without_last_ext(generated_data_name ${generated_data_name}) 244 # Remove leading "test_suite_" 245 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 246 list(APPEND bignum_generated_data_names ${generated_data_name}) 247 endforeach() 248 foreach(generated_data_file ${config_generated_data_files}) 249 # Get the plain filename 250 get_filename_component(generated_data_name ${generated_data_file} NAME) 251 # Remove the ".data" extension 252 get_name_without_last_ext(generated_data_name ${generated_data_name}) 253 # Remove leading "test_suite_" 254 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 255 list(APPEND config_generated_data_names ${generated_data_name}) 256 endforeach() 257 foreach(generated_data_file ${ecp_generated_data_files}) 258 # Get the plain filename 259 get_filename_component(generated_data_name ${generated_data_file} NAME) 260 # Remove the ".data" extension 261 get_name_without_last_ext(generated_data_name ${generated_data_name}) 262 # Remove leading "test_suite_" 263 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 264 list(APPEND ecp_generated_data_names ${generated_data_name}) 265 endforeach() 266 foreach(generated_data_file ${psa_generated_data_files}) 267 # Get the plain filename 268 get_filename_component(generated_data_name ${generated_data_file} NAME) 269 # Remove the ".data" extension 270 get_name_without_last_ext(generated_data_name ${generated_data_name}) 271 # Remove leading "test_suite_" 272 string(SUBSTRING ${generated_data_name} 11 -1 generated_data_name) 273 list(APPEND psa_generated_data_names ${generated_data_name}) 274 endforeach() 275 276 if(";${bignum_generated_data_names};" MATCHES ";${data_name};") 277 set(data_file 278 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 279 set(dependency test_suite_bignum_generated_data) 280 elseif(";${config_generated_data_names};" MATCHES ";${data_name};") 281 set(data_file 282 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 283 set(dependency test_suite_config_generated_data) 284 elseif(";${ecp_generated_data_names};" MATCHES ";${data_name};") 285 set(data_file 286 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 287 set(dependency test_suite_ecp_generated_data) 288 elseif(";${psa_generated_data_names};" MATCHES ";${data_name};") 289 set(data_file 290 ${CMAKE_CURRENT_BINARY_DIR}/suites/test_suite_${data_name}.data) 291 set(dependency test_suite_psa_generated_data) 292 else() 293 set(data_file 294 ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${data_name}.data) 295 set(dependency 296 test_suite_bignum_generated_data 297 test_suite_config_generated_data 298 test_suite_ecp_generated_data 299 test_suite_psa_generated_data) 300 endif() 301 302 add_custom_command( 303 OUTPUT 304 # The output filename of generate_test_code.py is derived from the -d 305 # input argument. 306 test_suite_${data_name}.c 307 COMMAND 308 ${MBEDTLS_PYTHON_EXECUTABLE} 309 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_test_code.py 310 -f ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${suite_name}.function 311 -d ${data_file} 312 -t ${CMAKE_CURRENT_SOURCE_DIR}/suites/main_test.function 313 -p ${CMAKE_CURRENT_SOURCE_DIR}/suites/host_test.function 314 -s ${CMAKE_CURRENT_SOURCE_DIR}/suites 315 --helpers-file ${CMAKE_CURRENT_SOURCE_DIR}/suites/helpers.function 316 -o . 317 DEPENDS 318 ${CMAKE_CURRENT_SOURCE_DIR}/../framework/scripts/generate_test_code.py 319 ${CMAKE_CURRENT_SOURCE_DIR}/suites/test_suite_${suite_name}.function 320 ${data_file} 321 ${CMAKE_CURRENT_SOURCE_DIR}/suites/main_test.function 322 ${CMAKE_CURRENT_SOURCE_DIR}/suites/host_test.function 323 ${CMAKE_CURRENT_SOURCE_DIR}/suites/helpers.function 324 ${mbedtls_target} 325 BYPRODUCTS 326 test_suite_${data_name}.datax 327 ) 328 329 add_executable(test_suite_${data_name} test_suite_${data_name}.c 330 $<TARGET_OBJECTS:mbedtls_test> 331 $<TARGET_OBJECTS:mbedtls_test_helpers>) 332 add_dependencies(test_suite_${data_name} ${dependency}) 333 target_link_libraries(test_suite_${data_name} ${libs}) 334 # Include test-specific header files from ./include and private header 335 # files (used by some invasive tests) from ../library. Public header 336 # files are automatically included because the library targets declare 337 # them as PUBLIC. 338 target_include_directories(test_suite_${data_name} 339 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include 340 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include 341 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../framework/tests/include 342 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../library) 343 # Request C11, which is needed for memory poisoning tests 344 set_target_properties(test_suite_${data_name} PROPERTIES C_STANDARD 11) 345 346 if(${data_name} MATCHES ${SKIP_TEST_SUITES_REGEX}) 347 message(STATUS "The test suite ${data_name} will not be executed.") 348 else() 349 add_test(${data_name}-suite test_suite_${data_name} --verbose) 350 endif() 351 endfunction(add_test_suite) 352 353 # Enable definition of various functions used throughout the testsuite 354 # (gethostname, strdup, fileno...) even when compiling with -std=c99. Harmless 355 # on non-POSIX platforms. 356 add_definitions("-D_POSIX_C_SOURCE=200809L") 357 358 if(CMAKE_COMPILER_IS_CLANG) 359 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code") 360 endif(CMAKE_COMPILER_IS_CLANG) 361 362 if(MSVC) 363 # If a warning level has been defined, suppress all warnings for test code 364 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W0") 365 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX-") 366 endif(MSVC) 367 368 file(GLOB test_suites RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" suites/*.data) 369 list(APPEND test_suites ${all_generated_data_files}) 370 # If the generated .data files are present in the source tree, we just added 371 # them twice, both through GLOB and through ${all_generated_data_files}. 372 list(REMOVE_DUPLICATES test_suites) 373 list(SORT test_suites) 374 foreach(test_suite ${test_suites}) 375 get_filename_component(data_name ${test_suite} NAME) 376 string(REGEX REPLACE "\\.data\$" "" data_name "${data_name}") 377 string(REPLACE "test_suite_" "" data_name "${data_name}") 378 string(REGEX MATCH "[^.]*" function_name "${data_name}") 379 add_test_suite(${function_name} ${data_name}) 380 endforeach(test_suite) 381 382 # Make scripts and data files needed for testing available in an 383 # out-of-source build. 384 if (NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) 385 if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/seedfile") 386 link_to_source(seedfile) 387 endif() 388 link_to_source(Descriptions.txt) 389 link_to_source(compat.sh) 390 link_to_source(context-info.sh) 391 link_to_source(../framework/data_files) 392 link_to_source(scripts) 393 link_to_source(ssl-opt.sh) 394 link_to_source(opt-testcases) 395 endif()