summaryrefslogtreecommitdiffstats
path: root/tests/tests.cmake
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/tests.cmake198
1 files changed, 198 insertions, 0 deletions
diff --git a/tests/tests.cmake b/tests/tests.cmake
new file mode 100644
index 0000000..62c546c
--- /dev/null
+++ b/tests/tests.cmake
@@ -0,0 +1,198 @@
+# 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)
+ #################
+ # 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)
+
+ # 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_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()