]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Reorganize cmake scripts for tests.
authorNathan Moinvaziri <nathan@nathanm.com>
Mon, 4 Jul 2022 18:53:46 +0000 (11:53 -0700)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Wed, 17 Aug 2022 12:41:53 +0000 (14:41 +0200)
* 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.

CMakeLists.txt
test/CMakeLists.txt
test/cmake/compress-and-verify.cmake [moved from cmake/test-compress.cmake with 97% similarity]
test/cmake/run-and-compare.cmake [moved from cmake/run-and-compare.cmake with 100% similarity]
test/cmake/run-and-redirect.cmake [moved from cmake/run-and-redirect.cmake with 100% similarity]
test/cmake/test-cves.cmake [new file with mode: 0644]
test/cmake/test-data.cmake [new file with mode: 0644]
test/cmake/test-issues.cmake [new file with mode: 0644]
test/cmake/test-tools.cmake [moved from cmake/test-tools.cmake with 52% similarity]
test/pigz/CMakeLists.txt

index fae09c7c70a6ab9c527f0ad0f05bf0f02bd5300f..d8f45b743d308d110817012609af522723d6fe80 100644 (file)
@@ -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
-            "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
-            "$<INSTALL_INTERFACE:include>")
-        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} $<TARGET_FILE:${target}>)
-    endmacro()
-
-    add_simple_test_executable(example)
-
-    set(MINIGZIP_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:minigzip>)
-    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} $<TARGET_FILE:minideflate>)
-    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} $<TARGET_FILE:switchlevels>)
-    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
-        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
-        "$<INSTALL_INTERFACE:include>")
-
-    set(MAKEFIXED_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:makefixed>)
-    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
-        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
-        "$<INSTALL_INTERFACE:include>")
-
-    set(MAKETREES_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:maketrees>)
-    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
-        "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
-        "$<INSTALL_INTERFACE:include>")
-
-    set(MAKECRCT_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:makecrct>)
-    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} $<TARGET_FILE:minigzip> -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")
index f30f9ac3a0511209c34911efeb5b602825f1a894..be508f61d62bb06cbd97086d7924db2232414dba 100644 (file)
-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} $<TARGET_FILE:example>)
+
+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} $<TARGET_FILE:minigzip>)
+
+add_executable(minideflate minideflate.c)
+configure_test_executable(minideflate)
+target_link_libraries(minideflate zlib)
+set(MINIDEFLATE_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:minideflate>)
+
+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} $<TARGET_FILE:switchlevels>)
 
-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} $<TARGET_FILE:infcover>)
 
-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} $<TARGET_FILE:makefixed>)
 
-# 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} $<TARGET_FILE:maketrees>)
 
-# 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} $<TARGET_FILE:makecrct>)
 
-    # 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} $<TARGET_FILE:gtest_zlib>)
 endif()
similarity index 97%
rename from cmake/test-compress.cmake
rename to test/cmake/compress-and-verify.cmake
index cfc7613ab242f263b0d6f4acb38c82bcccb71fc1..856f2cb3533c9c8f6221c69292b43a0f47f2a839 100644 (file)
@@ -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/test/cmake/test-cves.cmake b/test/cmake/test-cves.cmake
new file mode 100644 (file)
index 0000000..4a08604
--- /dev/null
@@ -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} $<TARGET_FILE:minigzip> -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 (file)
index 0000000..0701335
--- /dev/null
@@ -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 (file)
index 0000000..1ffb3ab
--- /dev/null
@@ -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)
similarity index 52%
rename from cmake/test-tools.cmake
rename to test/cmake/test-tools.cmake
index 4afe07c2c1a087f0adc0579ab06fc4f784d3211e..ce9a3ff2c7f533070464b68055fe62dcb28f1155 100644 (file)
@@ -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)
index 0d5bc8643028741697f4e6c440cfd1aac5aa2ee7..d1f5b22d23f8478d184b2d428e75aba58db491c1 100644 (file)
@@ -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()