From: Nathan Moinvaziri Date: Mon, 4 Jul 2022 18:53:46 +0000 (-0700) Subject: Reorganize cmake scripts for tests. X-Git-Tag: 2.1.0-beta1~184 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1943c9721b61ebceaeeba4c299c461479101b773;p=thirdparty%2Fzlib-ng.git Reorganize cmake scripts for tests. * Moves cmake scripts for testing into test/cmake. * Separates out related add_tests into separate cmake scripts. * Moves building test binaries into CMakeLists.txt in test directory. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index fae09c7c7..d8f45b743 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1174,278 +1174,7 @@ option(ZLIB_ENABLE_TESTS "Build test binaries" ON) if(ZLIB_ENABLE_TESTS) enable_testing() - if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) - add_subdirectory(test) - if(WITH_BENCHMARKS) - add_subdirectory(test/benchmarks) - endif() - else() - message(WARNING "Minimum cmake version of 3.12 not met for GoogleTest or benchmarks!") - endif() - - macro(configure_test_executable target) - target_include_directories(${target} PUBLIC - "$" - "$") - if(NOT WITH_GZFILEOP) - target_compile_definitions(${target} PUBLIC -DWITH_GZFILEOP) - target_sources(${target} PRIVATE ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS}) - endif() - endmacro() - - macro(add_simple_test_executable target) - add_executable(${target} test/${target}.c) - configure_test_executable(${target}) - target_link_libraries(${target} zlib) - add_test(NAME ${target} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - endmacro() - - add_simple_test_executable(example) - - set(MINIGZIP_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_executable(minigzip test/minigzip.c) - configure_test_executable(minigzip) - if(NOT DEFINED BUILD_SHARED_LIBS) - target_link_libraries(minigzip zlibstatic) - else() - target_link_libraries(minigzip zlib) - endif() - if(BASEARCH_S360_FOUND) - if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) - set_source_files_properties(test/minigzip.c PROPERTIES COMPILE_DEFINITIONS BUFLEN=262144) - endif() - endif() - - set(MINIDEFLATE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_executable(minideflate test/minideflate.c) - configure_test_executable(minideflate) - target_link_libraries(minideflate zlib) - - if(INSTALL_UTILS) - install(TARGETS minigzip minideflate - RUNTIME DESTINATION "${BIN_INSTALL_DIR}" - ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" - LIBRARY DESTINATION "${LIB_INSTALL_DIR}") - endif() - - set(SWITCHLEVELS_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_executable(switchlevels test/switchlevels.c) - configure_test_executable(switchlevels) - target_link_libraries(switchlevels zlib) - - add_simple_test_executable(infcover) - if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) - target_sources(infcover PRIVATE inftrees.c) - endif() - - add_executable(makefixed tools/makefixed.c inftrees.c) - target_include_directories(makefixed PUBLIC - "$" - "$") - - set(MAKEFIXED_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_test(NAME makefixed - COMMAND ${CMAKE_COMMAND} - "-DCOMMAND=${MAKEFIXED_COMMAND}" - -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/inffixed_tbl._h - -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/inffixed_tbl.h - -DIGNORE_LINE_ENDINGS=ON - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) - - add_executable(maketrees tools/maketrees.c trees.c zutil.c) - target_include_directories(maketrees PUBLIC - "$" - "$") - - set(MAKETREES_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_test(NAME maketrees - COMMAND ${CMAKE_COMMAND} - "-DCOMMAND=${MAKETREES_COMMAND}" - -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/trees_tbl._h - -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/trees_tbl.h - -DIGNORE_LINE_ENDINGS=ON - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) - - add_executable(makecrct tools/makecrct.c) - target_include_directories(makecrct PUBLIC - "$" - "$") - - set(MAKECRCT_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - add_test(NAME makecrct - COMMAND ${CMAKE_COMMAND} - "-DCOMMAND=${MAKECRCT_COMMAND}" - -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/crc32_braid_tbl._h - -DCOMPARE=${CMAKE_CURRENT_SOURCE_DIR}/crc32_braid_tbl.h - -DIGNORE_LINE_ENDINGS=ON - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) - - if(WITH_FUZZERS) - add_subdirectory(test/fuzz) - endif() - - macro(test_minigzip name path) - # Construct compression arguments for minigzip - set(compress_args -k -c) - foreach(extra_arg IN ITEMS "${ARGN}") - list(APPEND compress_args ${extra_arg}) - endforeach() - - # Create unique friendly string for test - string(REPLACE ";" "" arg_list "${ARGN}") - string(REPLACE " " "" arg_list "${arg_list}") - string(REPLACE "-" "" arg_list "${arg_list}") - - set(test_id minigzip-${name}-${arg_list}) - - if(NOT TEST ${test_id}) - add_test(NAME ${test_id} - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIGZIP_COMMAND}" - "-DCOMPRESS_ARGS=${compress_args}" - "-DDECOMPRESS_ARGS=-d;-c" - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path} - -DTEST_NAME=${test_id} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - endif() - endmacro() - - set(TEST_CONFIGS - -R # Z_RLE - -h # Z_HUFFMAN_ONLY - -T # Direct store - -0 # No compression - -1 # Deflate quick - -4 # Deflate medium (lazy matches) - "-5;-F" # Deflate medium (Z_FIXED) - -6 # Deflate medium - -9 # Deflate slow - "-9;-f" # Deflate slow (Z_FILTERED) - ) - - file(GLOB_RECURSE TEST_FILE_PATHS - LIST_DIRECTORIES false - RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/test/data/*) - - foreach(TEST_FILE_PATH ${TEST_FILE_PATHS}) - if("${TEST_FILE_PATH}" MATCHES ".gz$" OR "${TEST_FILE_PATH}" MATCHES ".out$" OR - "${TEST_FILE_PATH}" MATCHES "/.git/" OR "${TEST_FILE_PATH}" MATCHES ".md$") - continue() - endif() - foreach(TEST_CONFIG ${TEST_CONFIGS}) - get_filename_component(TEST_NAME ${TEST_FILE_PATH} NAME) - if (TEST_NAME STREQUAL "") - continue() - endif() - test_minigzip(${TEST_NAME} ${TEST_FILE_PATH} ${TEST_CONFIG}) - endforeach() - endforeach() - - test_minigzip("detect-text" "test/data/lcet10.txt" -A) - test_minigzip("detect-binary" "test/data/paper-100k.pdf" -A) - - set(CVES CVE-2002-0059 CVE-2004-0797 CVE-2005-1849 CVE-2005-2096) - foreach(CVE ${CVES}) - set(CVE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ -d) - add_test(NAME ${CVE} - COMMAND ${CMAKE_COMMAND} - "-DCOMMAND=${CVE_COMMAND}" - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/${CVE}/test.gz - "-DSUCCESS_EXIT=0;1" - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake) - endforeach() - - set(TEST_LEVELS 6 1 2) - foreach(TEST_LEVEL ${TEST_LEVELS}) - add_test(NAME CVE-2018-25032-fixed-level-${TEST_LEVEL} - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIDEFLATE_COMMAND}" - "-DCOMPRESS_ARGS=-c;-k;-m;1;-w;-15;-s;4;-F;-${TEST_LEVEL}" - "-DDECOMPRESS_ARGS=-c;-k;-d;-m;1;-w;-15;-${TEST_LEVEL}" - -DGZIP_VERIFY=OFF - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/CVE-2018-25032/fixed.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME CVE-2018-25032-default-level-${TEST_LEVEL} - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIDEFLATE_COMMAND}" - "-DCOMPRESS_ARGS=-c;-k;-m;1;-w;-15;-s;4;-${TEST_LEVEL}" - "-DDECOMPRESS_ARGS=-c;-k;-d;-m;1;-w;-15;-${TEST_LEVEL}" - -DGZIP_VERIFY=OFF - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/CVE-2018-25032/default.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - endforeach() - - # Run tests targeting tools - include(cmake/test-tools.cmake) - - add_test(NAME GH-361 - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIGZIP_COMMAND}" - "-DCOMPRESS_ARGS=-c;-k;-4" - -DTEST_NAME=GH-361-test-txt - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-361/test.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-364 - COMMAND ${CMAKE_COMMAND} - "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" - "-DCOMPRESS_ARGS=1;5;9;3" - "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" - -DTEST_NAME=GH-364-test-bin - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-364/test.bin - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-382 - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIDEFLATE_COMMAND}" - "-DCOMPRESS_ARGS=-c;-m;1;-w;-15;-1;-s;4" - "-DDECOMPRESS_ARGS=-c;-d;-m;1;-w;-15" - -DGZIP_VERIFY=OFF - -DTEST_NAME=GH-382-defneg3-dat - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-382/defneg3.dat - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-536-segfault - COMMAND ${CMAKE_COMMAND} - "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" - "-DCOMPRESS_ARGS=6;9744;1;91207" - "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" - -DCOMPARE=OFF - -DGZIP_VERIFY=OFF - -DTEST_NAME=GH-536-segfault-lcet10-txt - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-536-incomplete-read - COMMAND ${CMAKE_COMMAND} - "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" - "-DCOMPRESS_ARGS=6;88933;1;195840;2;45761" - "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" - -DCOMPARE=OFF - -DGZIP_VERIFY=OFF - -DTEST_NAME=GH-536-incomplete-read-lcet10-txt - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-536-zero-stored-block - COMMAND ${CMAKE_COMMAND} - "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" - "-DCOMPRESS_ARGS=6;15248;1;1050;2;25217" - "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" - -DCOMPARE=OFF - -DGZIP_VERIFY=OFF - -DTEST_NAME=GH-536-zero-stored-block-lcet10-txt - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/data/lcet10.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) - - add_test(NAME GH-751 - COMMAND ${CMAKE_COMMAND} - "-DTARGET=${MINIGZIP_COMMAND}" - -DTEST_NAME=GH-751-test-txt - -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/test/GH-751/test.txt - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/test-compress.cmake) + add_subdirectory(test) endif() add_feature_info(WITH_GZFILEOP WITH_GZFILEOP "Compile with support for gzFile related functions") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f30f9ac3a..be508f61d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,128 +1,212 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.5.1) + +macro(configure_test_executable target) + target_include_directories(${target} PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) + set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + if(NOT WITH_GZFILEOP) + target_compile_definitions(${target} PRIVATE -DWITH_GZFILEOP) + target_sources(${target} PRIVATE ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS}) + endif() +endmacro() + +add_executable(example example.c) +configure_test_executable(example) +target_link_libraries(example zlib) +add_test(NAME example COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + +add_executable(minigzip minigzip.c) +configure_test_executable(minigzip) +if(NOT DEFINED BUILD_SHARED_LIBS) + target_link_libraries(minigzip zlibstatic) +else() + target_link_libraries(minigzip zlib) +endif() +if(BASEARCH_S360_FOUND) + if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) + set_source_files_properties(minigzip.c PROPERTIES COMPILE_DEFINITIONS BUFLEN=262144) + endif() +endif() +set(MINIGZIP_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + +add_executable(minideflate minideflate.c) +configure_test_executable(minideflate) +target_link_libraries(minideflate zlib) +set(MINIDEFLATE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + +if(INSTALL_UTILS) + install(TARGETS minigzip minideflate + RUNTIME DESTINATION "${BIN_INSTALL_DIR}" + ARCHIVE DESTINATION "${LIB_INSTALL_DIR}" + LIBRARY DESTINATION "${LIB_INSTALL_DIR}") +endif() + +add_executable(switchlevels switchlevels.c) +configure_test_executable(switchlevels) +target_link_libraries(switchlevels zlib) +set(SWITCHLEVELS_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) -include(FetchContent) +add_executable(infcover infcover.c) +configure_test_executable(infcover) +target_link_libraries(infcover zlib) +if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) + target_sources(infcover PRIVATE ${CMAKE_SOURCE_DIR}/inftrees.c) +endif() +add_test(NAME infcover COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) -enable_language(CXX) +add_executable(makefixed ${CMAKE_SOURCE_DIR}/tools/makefixed.c ${CMAKE_SOURCE_DIR}/inftrees.c) +configure_test_executable(makefixed) +set(MAKEFIXED_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) -# Google test requires at least C++11 -set(CMAKE_CXX_STANDARD 11) +add_executable(maketrees ${CMAKE_SOURCE_DIR}/tools/maketrees.c ${CMAKE_SOURCE_DIR}/trees.c ${CMAKE_SOURCE_DIR}/zutil.c) +configure_test_executable(maketrees) +set(MAKETREES_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) -# Google test requires MSAN instrumented LLVM C++ libraries -if(WITH_SANITIZER STREQUAL "Memory") - if(NOT DEFINED ENV{LLVM_BUILD_DIR}) - message(FATAL_ERROR "MSAN instrumented C++ libraries required!") - endif() +add_executable(makecrct ${CMAKE_SOURCE_DIR}/tools/makecrct.c) +configure_test_executable(makecrct) +set(MAKECRCT_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - # Must set include and compile options before fetching googletest - include_directories($ENV{LLVM_BUILD_DIR}/include $ENV{LLVM_BUILD_DIR}/include/c++/v1) - add_compile_options(-stdlib=libc++ -g) +# Runs tests targeting CVEs +include(cmake/test-cves.cmake) + +# Run tests with data files +include(cmake/test-data.cmake) + +# Run tests targeting GitHub issues +include(cmake/test-issues.cmake) + +# Run tests targeting tools +include(cmake/test-tools.cmake) + +if(WITH_FUZZERS) + add_subdirectory(fuzz) endif() -if(NOT TARGET GTest::GTest) - # Prevent overriding the parent project's compiler/linker settings for Windows - set(gtest_force_shared_crt ON CACHE BOOL - "Use shared (DLL) run-time lib even when Google Test is built as static lib." FORCE) +if(CMAKE_VERSION VERSION_LESS 3.12) + message(WARNING "Minimum cmake version of 3.12 not met for GoogleTest or benchmarks!") +else() + enable_language(CXX) - # Allow specifying alternative Google test repository - if(NOT DEFINED GTEST_REPOSITORY) - set(GTEST_REPOSITORY https://github.com/google/googletest.git) + include(FetchContent) + + if(WITH_BENCHMARKS) + add_subdirectory(benchmarks) endif() - if(NOT DEFINED GTEST_TAG) - # Use older version of Google test to support older versions of GCC - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS_EQUAL 5.3) - set(GTEST_TAG release-1.10.0) - else() - set(GTEST_TAG release-1.11.0) + + # Google test requires at least C++11 + set(CMAKE_CXX_STANDARD 11) + + # Google test requires MSAN instrumented LLVM C++ libraries + if(WITH_SANITIZER STREQUAL "Memory") + if(NOT DEFINED ENV{LLVM_BUILD_DIR}) + message(FATAL_ERROR "MSAN instrumented C++ libraries required!") endif() + + # Must set include and compile options before fetching googletest + include_directories($ENV{LLVM_BUILD_DIR}/include $ENV{LLVM_BUILD_DIR}/include/c++/v1) + add_compile_options(-stdlib=libc++ -g) endif() - # Fetch Google test source code from official repository - FetchContent_Declare(googletest - GIT_REPOSITORY ${GTEST_REPOSITORY} - GIT_TAG ${GTEST_TAG}) + if(NOT TARGET GTest::GTest) + # Prevent overriding the parent project's compiler/linker settings for Windows + set(gtest_force_shared_crt ON CACHE BOOL + "Use shared (DLL) run-time lib even when Google Test is built as static lib." FORCE) + + # Allow specifying alternative Google test repository + if(NOT DEFINED GTEST_REPOSITORY) + set(GTEST_REPOSITORY https://github.com/google/googletest.git) + endif() + if(NOT DEFINED GTEST_TAG) + # Use older version of Google test to support older versions of GCC + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS_EQUAL 5.3) + set(GTEST_TAG release-1.10.0) + else() + set(GTEST_TAG release-1.11.0) + endif() + endif() + + # Fetch Google test source code from official repository + FetchContent_Declare(googletest + GIT_REPOSITORY ${GTEST_REPOSITORY} + GIT_TAG ${GTEST_TAG}) - FetchContent_GetProperties(googletest) - if(NOT googletest_POPULATED) - FetchContent_Populate(googletest) - add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) + FetchContent_GetProperties(googletest) + if(NOT googletest_POPULATED) + FetchContent_Populate(googletest) + add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) + endif() + add_library(GTest::GTest ALIAS gtest) endif() - add_library(GTest::GTest ALIAS gtest) -endif() -set(TEST_SRCS - test_adler32.cc - test_aligned_alloc.cc - test_compare256.cc - test_compress.cc - test_compress_bound.cc - test_crc32.cc - test_cve-2003-0107.cc - test_deflate_bound.cc - test_deflate_copy.cc - test_deflate_dict.cc - test_deflate_hash_head_0.cc - test_deflate_header.cc - test_deflate_params.cc - test_deflate_pending.cc - test_deflate_prime.cc - test_deflate_quick_bi_valid.cc - test_deflate_quick_block_open.cc - test_deflate_tune.cc - test_dict.cc - test_inflate_adler32.cc - test_inflate_sync.cc - test_large_buffers.cc - test_small_buffers.cc - test_version.cc - ) - -if(WITH_GZFILEOP) - list(APPEND TEST_SRCS test_gzio.cc) -endif() + set(TEST_SRCS + test_adler32.cc + test_aligned_alloc.cc + test_compare256.cc + test_compress.cc + test_compress_bound.cc + test_crc32.cc + test_cve-2003-0107.cc + test_deflate_bound.cc + test_deflate_copy.cc + test_deflate_dict.cc + test_deflate_hash_head_0.cc + test_deflate_header.cc + test_deflate_params.cc + test_deflate_pending.cc + test_deflate_prime.cc + test_deflate_quick_bi_valid.cc + test_deflate_quick_block_open.cc + test_deflate_tune.cc + test_dict.cc + test_inflate_adler32.cc + test_inflate_sync.cc + test_large_buffers.cc + test_small_buffers.cc + test_version.cc + ) + + if(WITH_GZFILEOP) + list(APPEND TEST_SRCS test_gzio.cc) + endif() -add_executable(gtest_zlib test_main.cc ${TEST_SRCS}) + add_executable(gtest_zlib test_main.cc ${TEST_SRCS}) + configure_test_executable(gtest_zlib) -target_include_directories(gtest_zlib PRIVATE - ${CMAKE_SOURCE_DIR} - ${CMAKE_BINARY_DIR}) + if(WITH_SANITIZER STREQUAL "Memory") + target_link_directories(gtest_zlib PRIVATE $ENV{LLVM_BUILD_DIR}/lib) + target_link_options(gtest_zlib PRIVATE + -stdlib=libc++ + -lc++abi + -fsanitize=memory + -fsanitize-memory-track-origins) + endif() -if(WITH_SANITIZER STREQUAL "Memory") - target_link_directories(gtest_zlib PRIVATE $ENV{LLVM_BUILD_DIR}/lib) - target_link_options(gtest_zlib PRIVATE - -stdlib=libc++ - -lc++abi - -fsanitize=memory - -fsanitize-memory-track-origins) -endif() + if(ZLIB_DUAL_LINK AND NOT ZLIB_COMPAT) + find_package(ZLIB) + if(ZLIB_FOUND) + message(STATUS "Added dual linking tests against zlib") + message(STATUS " Zlib include dir: ${ZLIB_INCLUDE_DIR}") + message(STATUS " Zlib libraries: ${ZLIB_LIBRARIES}") -if(ZLIB_DUAL_LINK AND NOT ZLIB_COMPAT) - find_package(ZLIB) - if(ZLIB_FOUND) - message(STATUS "Added dual linking tests against zlib") - message(STATUS " Zlib include dir: ${ZLIB_INCLUDE_DIR}") - message(STATUS " Zlib libraries: ${ZLIB_LIBRARIES}") - - target_sources(gtest_zlib PRIVATE test_compress_dual.cc) - target_include_directories(gtest_zlib PRIVATE ${ZLIB_INCLUDE_DIR}) - target_link_libraries(gtest_zlib ${ZLIB_LIBRARIES}) - else() - message(WARNING "Zlib not found, skipping dual linking tests") + target_sources(gtest_zlib PRIVATE test_compress_dual.cc) + target_include_directories(gtest_zlib PRIVATE ${ZLIB_INCLUDE_DIR}) + target_link_libraries(gtest_zlib ${ZLIB_LIBRARIES}) + else() + message(WARNING "Zlib not found, skipping dual linking tests") + endif() endif() -endif() -target_link_libraries(gtest_zlib zlibstatic GTest::GTest) + target_link_libraries(gtest_zlib zlibstatic GTest::GTest) -find_package(Threads) -if(Threads_FOUND) - target_sources(gtest_zlib PRIVATE test_deflate_concurrency.cc) - if(UNIX AND NOT APPLE) - # On Linux, use a workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590 - target_link_libraries(gtest_zlib -Wl,--whole-archive -lpthread -Wl,--no-whole-archive) + find_package(Threads) + if(Threads_FOUND) + target_sources(gtest_zlib PRIVATE test_deflate_concurrency.cc) + if(UNIX AND NOT APPLE) + # On Linux, use a workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52590 + target_link_libraries(gtest_zlib -Wl,--whole-archive -lpthread -Wl,--no-whole-archive) + endif() + target_link_libraries(gtest_zlib Threads::Threads) endif() - target_link_libraries(gtest_zlib Threads::Threads) -endif() -if(ZLIB_ENABLE_TESTS) add_test(NAME gtest_zlib COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) endif() diff --git a/cmake/test-compress.cmake b/test/cmake/compress-and-verify.cmake similarity index 97% rename from cmake/test-compress.cmake rename to test/cmake/compress-and-verify.cmake index cfc7613ab..856f2cb35 100644 --- a/cmake/test-compress.cmake +++ b/test/cmake/compress-and-verify.cmake @@ -1,5 +1,5 @@ -# test-compress.cmake -- Runs a test against an input file to make sure that the specified -# targets are able to to compress and then decompress it successfully. Optionally verify +# compress-and-verify.cmake -- Runs a test against an input file to make sure that the specified +# targets are able to to compress and then decompress successfully. Optionally verify # the results with gzip. Output files are generated with unique names to prevent parallel # tests from corrupting one another. Default target arguments are compatible with minigzip. diff --git a/cmake/run-and-compare.cmake b/test/cmake/run-and-compare.cmake similarity index 100% rename from cmake/run-and-compare.cmake rename to test/cmake/run-and-compare.cmake diff --git a/cmake/run-and-redirect.cmake b/test/cmake/run-and-redirect.cmake similarity index 100% rename from cmake/run-and-redirect.cmake rename to test/cmake/run-and-redirect.cmake diff --git a/test/cmake/test-cves.cmake b/test/cmake/test-cves.cmake new file mode 100644 index 000000000..4a0860403 --- /dev/null +++ b/test/cmake/test-cves.cmake @@ -0,0 +1,33 @@ +# test-cves.cmake -- Tests targeting common vulnerabilities and exposures + +set(CVES CVE-2002-0059 CVE-2004-0797 CVE-2005-1849 CVE-2005-2096) +foreach(cve ${CVES}) + set(CVE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ -d) + add_test(NAME ${cve} + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${CVE_COMMAND}" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${cve}/test.gz + "-DSUCCESS_EXIT=0;1" + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake) +endforeach() + +set(CVE_COMPRESS_LEVELS 6 1 2) +foreach(cve_compress_level ${CVE_COMPRESS_LEVELS}) + add_test(NAME CVE-2018-25032-fixed-level-${cve_compress_level} + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIDEFLATE_COMMAND}" + "-DCOMPRESS_ARGS=-c;-k;-m;1;-w;-15;-s;4;-F;-${cve_compress_level}" + "-DDECOMPRESS_ARGS=-c;-k;-d;-m;1;-w;-15;-${cve_compress_level}" + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/CVE-2018-25032/fixed.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + + add_test(NAME CVE-2018-25032-default-level-${cve_compress_level} + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIDEFLATE_COMMAND}" + "-DCOMPRESS_ARGS=-c;-k;-m;1;-w;-15;-s;4;-${cve_compress_level}" + "-DDECOMPRESS_ARGS=-c;-k;-d;-m;1;-w;-15;-${cve_compress_level}" + -DGZIP_VERIFY=OFF + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/CVE-2018-25032/default.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) +endforeach() diff --git a/test/cmake/test-data.cmake b/test/cmake/test-data.cmake new file mode 100644 index 000000000..07013355a --- /dev/null +++ b/test/cmake/test-data.cmake @@ -0,0 +1,67 @@ +# test-data.cmake - Tests targeting data files in the data directory + +# Test compress and verify test against data file using extra args +macro(test_minigzip name path) + # Construct compression arguments for minigzip + set(compress_args -k -c) + foreach(extra_arg IN ITEMS "${ARGN}") + list(APPEND compress_args ${extra_arg}) + endforeach() + + # Create unique friendly string for test + string(REPLACE ";" "" arg_list "${ARGN}") + string(REPLACE " " "" arg_list "${arg_list}") + string(REPLACE "-" "" arg_list "${arg_list}") + + set(test_id minigzip-${name}-${arg_list}) + + if(NOT TEST ${test_id}) + add_test(NAME ${test_id} + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + "-DCOMPRESS_ARGS=${compress_args}" + "-DDECOMPRESS_ARGS=-d;-c" + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path} + -DTEST_NAME=${test_id} + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + endif() +endmacro() + +# List of arg combinations to use during compression +set(TEST_CONFIGS + -R # Z_RLE + -h # Z_HUFFMAN_ONLY + -T # Direct store + -0 # No compression + -1 # Deflate quick + -4 # Deflate medium (lazy matches) + "-5;-F" # Deflate medium (Z_FIXED) + -6 # Deflate medium + -9 # Deflate slow + "-9;-f" # Deflate slow (Z_FILTERED) +) + +# Enumerate all files in data directory to run tests against +file(GLOB_RECURSE TEST_FILE_PATHS + LIST_DIRECTORIES false + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/data/*) + +# For all files in the data directory, run tests against them +foreach(test_file_path ${TEST_FILE_PATHS}) + if("${test_file_path}" MATCHES ".gz$" OR "${test_file_path}" MATCHES ".out$" OR + "${test_file_path}" MATCHES "/.git/" OR "${test_file_path}" MATCHES ".md$") + continue() + endif() + foreach(test_config ${TEST_CONFIGS}) + get_filename_component(test_name ${test_file_path} NAME) + if (test_name STREQUAL "") + continue() + endif() + test_minigzip(${test_name} ${test_file_path} ${test_config}) + endforeach() +endforeach() + +# Additional tests to verify with automatic data type detection arg +test_minigzip("detect-text" "data/lcet10.txt" -A) +test_minigzip("detect-binary" "data/paper-100k.pdf" -A) diff --git a/test/cmake/test-issues.cmake b/test/cmake/test-issues.cmake new file mode 100644 index 000000000..1ffb3abda --- /dev/null +++ b/test/cmake/test-issues.cmake @@ -0,0 +1,68 @@ +# test-issues.cmake -- Tests targeting specific GitHub issues + +add_test(NAME GH-361 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + "-DCOMPRESS_ARGS=-c;-k;-4" + -DTEST_NAME=GH-361-test-txt + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/GH-361/test.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-364 + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=1;5;9;3" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DTEST_NAME=GH-364-test-bin + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/GH-364/test.bin + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-382 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIDEFLATE_COMMAND}" + "-DCOMPRESS_ARGS=-c;-m;1;-w;-15;-1;-s;4" + "-DDECOMPRESS_ARGS=-c;-d;-m;1;-w;-15" + -DGZIP_VERIFY=OFF + -DTEST_NAME=GH-382-defneg3-dat + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/GH-382/defneg3.dat + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-536-segfault + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;9744;1;91207" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DTEST_NAME=GH-536-segfault-lcet10-txt + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-536-incomplete-read + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;88933;1;195840;2;45761" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DTEST_NAME=GH-536-incomplete-read-lcet10-txt + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-536-zero-stored-block + COMMAND ${CMAKE_COMMAND} + "-DCOMPRESS_TARGET=${SWITCHLEVELS_COMMAND}" + "-DCOMPRESS_ARGS=6;15248;1;1050;2;25217" + "-DDECOMPRESS_TARGET=${MINIGZIP_COMMAND}" + -DCOMPARE=OFF + -DGZIP_VERIFY=OFF + -DTEST_NAME=GH-536-zero-stored-block-lcet10-txt + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/data/lcet10.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) + +add_test(NAME GH-751 + COMMAND ${CMAKE_COMMAND} + "-DTARGET=${MINIGZIP_COMMAND}" + -DTEST_NAME=GH-751-test-txt + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/GH-751/test.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/compress-and-verify.cmake) diff --git a/cmake/test-tools.cmake b/test/cmake/test-tools.cmake similarity index 52% rename from cmake/test-tools.cmake rename to test/cmake/test-tools.cmake index 4afe07c2c..ce9a3ff2c 100644 --- a/cmake/test-tools.cmake +++ b/test/cmake/test-tools.cmake @@ -32,3 +32,30 @@ add_test(NAME switchlevels-help COMMAND ${CMAKE_COMMAND} "-DCOMMAND=${TEST_COMMAND}" -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-redirect.cmake) + +# Test generated crc32 tables match tables in source directory +add_test(NAME makecrct + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKECRCT_COMMAND}" + -DOUTPUT=${CMAKE_BINARY_DIR}/Testing/Temporary/crc32_braid_tbl._h + -DCOMPARE=${CMAKE_SOURCE_DIR}/crc32_braid_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) + +# Test generated inflate tables match tables in source directory +add_test(NAME makefixed + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKEFIXED_COMMAND}" + -DOUTPUT=${CMAKE_BINARY_DIR}/Testing/Temporary/inffixed_tbl._h + -DCOMPARE=${CMAKE_SOURCE_DIR}/inffixed_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) + +# Test generated tree tables match tables in source directory +add_test(NAME maketrees + COMMAND ${CMAKE_COMMAND} + "-DCOMMAND=${MAKETREES_COMMAND}" + -DOUTPUT=${CMAKE_BINARY_DIR}/Testing/Temporary/trees_tbl._h + -DCOMPARE=${CMAKE_SOURCE_DIR}/trees_tbl.h + -DIGNORE_LINE_ENDINGS=ON + -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/run-and-compare.cmake) diff --git a/test/pigz/CMakeLists.txt b/test/pigz/CMakeLists.txt index 0d5bc8643..d1f5b22d2 100644 --- a/test/pigz/CMakeLists.txt +++ b/test/pigz/CMakeLists.txt @@ -167,7 +167,7 @@ if(PIGZ_ENABLE_TESTS) "-DDECOMPRESS_ARGS=-d;-c" -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${path} -DTEST_NAME=${test_id} - -P ${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/test-compress.cmake) + -P ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/compress-and-verify.cmake) endif() endmacro()