CMakeLists.txt 13 KB

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