Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added pigz to unit tests #985

Merged
merged 3 commits into from
Jun 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions .github/workflows/pigz.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
name: CI Pigz
on: [push, pull_request]
jobs:
ci-cmake:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu GCC
os: ubuntu-latest
compiler: gcc
codecov: ubuntu_gcc_pigz

- name: Ubuntu Clang
os: ubuntu-latest
compiler: clang
packages: llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz

- name: Ubuntu Clang No Optim
os: ubuntu-latest
compiler: clang
packages: llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz_no_optim
cmake-args: -DWITH_OPTIM=OFF

- name: Ubuntu Clang No Threads
os: ubuntu-latest
compiler: clang
packages: llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz_no_threads
cmake-args: -DWITH_THREADS=OFF

steps:
- name: Checkout repository
uses: actions/checkout@v2

- name: Checkout test corpora
uses: actions/checkout@v2
with:
repository: zlib-ng/corpora
path: test/data/corpora

- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && matrix.packages
run: |
sudo apt-get update
sudo apt-get install -y ${{ matrix.packages }}

- name: Install codecov.io tools
if: matrix.codecov
run: |
python -u -m pip install codecov

- name: Generate project files
run: |
cd test/pigz
cmake ${{ matrix.cmake-args }} -DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} -DBUILD_SHARED_LIBS=OFF -DZLIB_ROOT=../.. -DWITH_CODE_COVERAGE=ON -DWITH_MAINTAINER_WARNINGS=ON
env:
CC: ${{ matrix.compiler }}
CFLAGS: ${{ matrix.cflags }}
LDFLAGS: ${{ matrix.ldflags }}
CI: true

- name: Compile source code
run: |
cd test/pigz
cmake --build . --config ${{ matrix.build-config || 'Release' }}

- name: Run test cases
run: |
cd test/pigz
ctest --verbose -C Release --output-on-failure --max-width 120 -j ${{ matrix.parallels-jobs || '2' }}

- name: Upload coverage report
if: matrix.codecov && ( env.CODECOV_TOKEN_SECRET != '' || github.repository == 'zlib-ng/zlib-ng' )
shell: bash
run: |
bash tools/codecov-upload.sh
env:
# Codecov does not yet support GitHub Actions
CODECOV_TOKEN_SECRET: "${{secrets.CODECOV_TOKEN}}"
CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN || 'e4fdf847-f541-4ab1-9d50-3d27e5913906' }}"
CODECOV_FLAGS: "${{ matrix.codecov }}"
CODECOV_NAME: "${{ matrix.name }}"
CODECOV_EXEC: "${{ matrix.gcov-exec || 'gcov' }}"
CODECOV_DIR: "."

- name: Upload build errors
uses: actions/upload-artifact@v2
if: failure()
with:
name: ${{ matrix.name }} (cmake)
path: |
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
**/Testing/Temporary/*
retention-days: 30
Binary file added test/GH-979/pigz-2.6.tar.gz
Binary file not shown.
198 changes: 198 additions & 0 deletions test/pigz/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
# CMakeLists.txt -- Build madler/pigz against zlib variant

# Copyright (C) 2021 Nathan Moinvaziri
# Licensed under the Zlib license, see LICENSE.md for details

# By default pigz will be linked against the system zlib and
# pthread libraries if installed.

# Optional Variables
# WITH_CODE_COVERAGE - Enable code coverage reporting
# WITH_THREADS - Enable threading support
# PIGZ_ENABLE_TESTS - Enable adding unit tests
# ZLIB_ROOT - Path to the zlib source directory
# PTHREADS4W_ROOT - Path to pthreads4w source directory on Windows.
# If not specified then threading will be disabled.

cmake_minimum_required(VERSION 3.11)

include(CheckCCompilerFlag)
include(FeatureSummary)
include(FetchContent)

include(../../cmake/detect-coverage.cmake)

option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF)
option(WITH_THREADS "Enable threading support" ON)
option(PIGZ_ENABLE_TESTS "Build unit tests" ON)

project(pigz LANGUAGES C)

# Set code coverage compiler flags
if(WITH_CODE_COVERAGE)
add_code_coverage()
endif()

# Compiler definitions
if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
add_definitions(-fno-caret-diagnostics)
elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU")
if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5.0)
add_definitions(-Wno-unused-result)
endif()
if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8.0)
add_definitions(-fno-diagnostics-show-caret)
endif()
elseif(WIN32)
add_definitions(-D_TIMESPEC_DEFINED)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
endif()
endif()

# Fetch pigz source code from official repository
FetchContent_Declare(pigz
GIT_REPOSITORY https://github.com/madler/pigz.git)
FetchContent_MakeAvailable(pigz)
FetchContent_GetProperties(pigz)

if(NOT pigz_POPULATED)
FetchContent_Populate(pigz)
endif()

set(PIGZ_SRCS
${pigz_SOURCE_DIR}/pigz.c
${pigz_SOURCE_DIR}/try.c)

set(PIGZ_HDRS
${pigz_SOURCE_DIR}/try.h)

add_executable(${PROJECT_NAME} ${PIGZ_SRCS} ${PIGZ_HDRS})
add_definitions(-DNOZOPFLI)

# Find and link against pthreads or pthreads4w
if(WITH_THREADS)
if(WIN32)
if(DEFINED PTHREADS4W_ROOT)
set(CLEANUP_STYLE VC)
set(PTHREADS4W_VERSION 3)

add_subdirectory(${PTHREADS4W_ROOT} ${PTHREADS4W_ROOT} EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} pthreadVC3)
target_include_directories(${PROJECT_NAME} PRIVATE win ${PTHREADS4W_ROOT})
else()
message(WARNING "Missing pthreads4w root directory")
set(WITH_THREADS OFF)
endif()
else()
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} Threads::Threads)
if(NOT APPLE)
target_link_libraries(${PROJECT_NAME} m)
endif()
endif()
endif()

# Disable threading support
if(NOT WITH_THREADS)
add_definitions(-DNOTHREAD)
else()
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY SOURCES
${pigz_SOURCE_DIR}/yarn.c
${pigz_SOURCE_DIR}/yarn.h)
endif()

# Find and link against zlib
if(NOT DEFINED ZLIB_ROOT)
find_package(Zlib REQUIRED)
endif()

set(ZLIB_COMPAT ON)
set(ZLIB_ENABLE_TESTS OFF)

add_subdirectory(${ZLIB_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/zlib EXCLUDE_FROM_ALL)

if(NOT DEFINED BUILD_SHARED_LIBS OR NOT BUILD_SHARED_LIBS)
set(ZLIB_TARGET zlibstatic)
else()
set(ZLIB_TARGET zlib)
endif()

target_include_directories(${PROJECT_NAME} PRIVATE ${ZLIB_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/zlib)
target_link_libraries(${PROJECT_NAME} ${ZLIB_TARGET})

if(NOT SKIP_INSTALL_BINARIES AND NOT SKIP_INSTALL_ALL)
install(TARGETS ${PROJECT_NAME} DESTINATION "bin")
endif()

# Add unit tests
if(PIGZ_ENABLE_TESTS)
enable_testing()

set(PIGZ_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:pigz>)

macro(test_pigz name path)
# Construct compression arguments for pigz
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 pigz-${name}-${arg_list})

if(NOT TEST ${test_id})
add_test(NAME ${test_id}
COMMAND ${CMAKE_COMMAND}
"-DTARGET=${PIGZ_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
-U # RLE compression
#-H # Z_HUFFMAN_ONLY (broken in 2.6)
-0 # No compression
-1 # Deflate quick
-4 # Deflate medium (lazy matches)
-6 # Deflate medium
-9 # Deflate slow
)

file(GLOB_RECURSE TEST_FILE_PATHS
LIST_DIRECTORIES false
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../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_pigz(${TEST_NAME} ${TEST_FILE_PATH} ${TEST_CONFIG})
endforeach()
endforeach()

set(GH979_COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:pigz>
-d -k -f ${CMAKE_CURRENT_SOURCE_DIR}/../GH-979/pigz-2.6.tar.gz)
add_test(NAME GH-979 COMMAND ${GH979_COMMAND})
endif()

add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting")
add_feature_info(WITH_THREADS WITH_THREADS "Enable threading support")
add_feature_info(PIGZ_ENABLE_TESTS PIGZ_ENABLE_TESTS "Build unit tests")

FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)