quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

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()