| # SPDX-License-Identifier: 0BSD |
| |
| ############################################################################# |
| # |
| # Optional file to be included by the top-level CMakeLists.txt to run tests |
| # |
| # The CMake rules for the tests are in this separate optional file so |
| # that it's trivial to just delete the whole "tests" directory and still |
| # get an otherwise normal CMake-based build. This way it's easy to ensure |
| # that nothing in the "tests" directory can affect the build process. |
| # |
| # Author: Lasse Collin |
| # |
| ############################################################################# |
| |
| include(CTest) |
| |
| if(BUILD_TESTING) |
| ################################ |
| # Windows Application Manifest # |
| ################################ |
| |
| # On Windows (but not on Cygwin or MSYS2) we want to add the |
| # application manifest to the test programs so that they are |
| # run in the same configuration as the programs that are installed. |
| # The same object file can be used for all test programs. |
| add_library(tests_w32res OBJECT) |
| |
| # CMake requires that even an object library must have at least once |
| # source file. Give it a header file that results in no output files. |
| target_sources(tests_w32res PRIVATE tests/tests.h) |
| |
| # The Ninja Generator requires setting the linker language since it |
| # cannot guess the programming language of a header file. |
| set_target_properties(tests_w32res PROPERTIES LINKER_LANGUAGE C) |
| |
| target_include_directories(tests_w32res PRIVATE src/common |
| src/common |
| src/liblzma/api |
| ) |
| |
| if(WIN32) |
| target_sources(tests_w32res PRIVATE tests/tests_w32res.rc) |
| set_source_files_properties(tests/tests_w32res.rc PROPERTIES |
| OBJECT_DEPENDS "${W32RES_DEPENDENCIES}" |
| ) |
| endif() |
| |
| ################# |
| # liblzma tests # |
| ################# |
| |
| set(LIBLZMA_TESTS |
| test_bcj_exact_size |
| test_block_header |
| test_check |
| test_filter_flags |
| test_filter_str |
| test_hardware |
| test_index |
| test_index_hash |
| test_lzip_decoder |
| test_memlimit |
| test_stream_flags |
| test_vli |
| ) |
| |
| # MicroLZMA encoder is needed for both encoder and decoder tests. |
| # If MicroLZMA decoder is not configured but LZMA1 decoder is, then |
| # test_microlzma will fail to compile because this configuration is |
| # not possible in the Autotools build, so the test was not made to |
| # support it since it would have required additional changes. |
| if (MICROLZMA_ENCODER AND (MICROLZMA_DECODER |
| OR NOT "lzma1" IN_LIST DECODERS)) |
| list(APPEND LIBLZMA_TESTS test_microlzma) |
| endif() |
| |
| foreach(TEST IN LISTS LIBLZMA_TESTS) |
| add_executable("${TEST}" "tests/${TEST}.c") |
| |
| target_include_directories("${TEST}" PRIVATE |
| src/common |
| src/liblzma/api |
| src/liblzma |
| ) |
| |
| target_link_libraries("${TEST}" PRIVATE liblzma tests_w32res) |
| |
| # Put the test programs into their own subdirectory so they don't |
| # pollute the top-level dir which might contain xz and xzdec. |
| set_target_properties("${TEST}" PROPERTIES |
| RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/tests_bin" |
| ) |
| |
| add_test(NAME "${TEST}" |
| COMMAND "${CMAKE_CURRENT_BINARY_DIR}/tests_bin/${TEST}" |
| ) |
| |
| # Set srcdir environment variable so that the tests find their |
| # input files from the source tree. |
| # |
| # Set the return code for skipped tests to match Automake convention. |
| set_tests_properties("${TEST}" PROPERTIES |
| ENVIRONMENT "srcdir=${CMAKE_CURRENT_SOURCE_DIR}/tests" |
| SKIP_RETURN_CODE 77 |
| ) |
| endforeach() |
| |
| |
| ########################### |
| # Command line tool tests # |
| ########################### |
| |
| # Since the CMake-based build doesn't use config.h, the test scripts |
| # cannot grep the contents of config.h to know which features have |
| # been disabled. When config.h is missing, they assume that all |
| # features are enabled. Thus, check if certain groups of features have |
| # been disabled and then possibly skip some of the tests entirely instead |
| # of letting them fail. |
| set(SUPPORTED_FILTERS_SORTED "${SUPPORTED_FILTERS}") |
| list(SORT SUPPORTED_FILTERS_SORTED) |
| |
| set(ENCODERS_SORTED "${ENCODERS}") |
| list(SORT ENCODERS_SORTED) |
| |
| if("${ENCODERS_SORTED}" STREQUAL "${SUPPORTED_FILTERS_SORTED}") |
| set(HAVE_ALL_ENCODERS ON) |
| else() |
| set(HAVE_ALL_ENCODERS OFF) |
| endif() |
| |
| set(DECODERS_SORTED "${DECODERS}") |
| list(SORT DECODERS_SORTED) |
| |
| if("${DECODERS_SORTED}" STREQUAL "${SUPPORTED_FILTERS_SORTED}") |
| set(HAVE_ALL_DECODERS ON) |
| else() |
| set(HAVE_ALL_DECODERS OFF) |
| endif() |
| |
| set(ADDITIONAL_SUPPORTED_CHECKS_SORTED "${ADDITIONAL_SUPPORTED_CHECKS}") |
| list(SORT ADDITIONAL_SUPPORTED_CHECKS_SORTED) |
| |
| set(ADDITIONAL_CHECK_TYPES_SORTED "${ADDITIONAL_CHECK_TYPES}") |
| list(SORT ADDITIONAL_CHECK_TYPES_SORTED) |
| |
| if("${ADDITIONAL_SUPPORTED_CHECKS_SORTED}" STREQUAL |
| "${ADDITIONAL_CHECK_TYPES_SORTED}") |
| set(HAVE_ALL_CHECK_TYPES ON) |
| else() |
| set(HAVE_ALL_CHECK_TYPES OFF) |
| endif() |
| |
| # test_scripts.sh only needs LZMA2 decoder and CRC32. |
| if(UNIX AND HAVE_DECODERS) |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_scripts") |
| |
| add_test(NAME test_scripts.sh |
| COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_scripts.sh" ".." |
| WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_scripts" |
| ) |
| |
| set_tests_properties(test_scripts.sh PROPERTIES |
| ENVIRONMENT "srcdir=${CMAKE_CURRENT_SOURCE_DIR}/tests" |
| SKIP_RETURN_CODE 77 |
| ) |
| endif() |
| |
| # test_suffix.sh only needs LZMA2 encoder and decoder. |
| if(UNIX AND HAVE_ENCODERS AND HAVE_DECODERS) |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_suffix") |
| |
| add_test(NAME test_suffix.sh |
| COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_suffix.sh" ".." |
| WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_suffix" |
| ) |
| |
| set_tests_properties(test_suffix.sh PROPERTIES |
| SKIP_RETURN_CODE 77 |
| ) |
| endif() |
| |
| # The test_compress.sh based tests compress and decompress using different |
| # filters so run it only if all encoders and decoders have been enabled. |
| if(UNIX AND HAVE_ALL_ENCODERS AND HAVE_ALL_DECODERS) |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_compress") |
| |
| add_executable(create_compress_files tests/create_compress_files.c) |
| target_link_libraries(create_compress_files PRIVATE tests_w32res) |
| target_include_directories(create_compress_files PRIVATE src/common) |
| set_target_properties(create_compress_files PROPERTIES |
| RUNTIME_OUTPUT_DIRECTORY test_compress) |
| |
| foreach(T compress_generated_abc |
| compress_generated_text |
| compress_generated_random) |
| add_test(NAME "test_${T}" |
| COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_compress.sh" |
| "${T}" ".." |
| WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_compress" |
| ) |
| |
| set_tests_properties("test_${T}" PROPERTIES |
| ENVIRONMENT "srcdir=${CMAKE_CURRENT_SOURCE_DIR}/tests" |
| SKIP_RETURN_CODE 77 |
| ) |
| endforeach() |
| endif() |
| |
| # test_files.sh decompresses files that use different filters and |
| # check types so run it only if support for all of them has been enabled. |
| if(UNIX AND HAVE_ALL_DECODERS AND HAVE_ALL_CHECK_TYPES AND LZIP_DECODER) |
| # test_files.sh doesn't make any temporary files but it |
| # must not be run at the top-level build directory because |
| # it checks if ../config.h exists. We don't want to read |
| # files outside the build directory! |
| file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_files") |
| |
| add_test(NAME test_files.sh |
| COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_files.sh" ".." |
| WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test_files" |
| ) |
| |
| set_tests_properties(test_files.sh PROPERTIES |
| ENVIRONMENT "srcdir=${CMAKE_CURRENT_SOURCE_DIR}/tests" |
| SKIP_RETURN_CODE 77 |
| ) |
| endif() |
| endif() |