Skip to content

[feature] Count newlines during decompression to maket it work with n… #566

[feature] Count newlines during decompression to maket it work with n…

[feature] Count newlines during decompression to maket it work with n… #566

Workflow file for this run

name: C++ Code Checks
on:
push:
branches: [ "develop" ]
pull_request:
workflow_dispatch:
jobs:
Code-Coverage:
name: Code Coverage
runs-on: ubuntu-22.04
# Suddenly, the upload to codecov does not work anymore and times out after 6 hours -.-.
# It's not like I used it much anyway, except to have a badge.
if: false
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Dependencies
run: |
sudo apt-get -y install bzip2 cppcheck clang clang-tidy g++ lcov ninja-build wget gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: System Information
run: |
nproc
cmake --version
g++ --version
clang++ --version
cppcheck --version
- name: Code Coverage
run: |
mkdir -p build-codeov && cd -- "$_"
# It should be compiled with the same g++ version as anylzed with gcov!
# If g++ --version and gcov --version print different versions, there might be problems when creating
# the coverage report, e.g., I had: "version 'A85*', prefer 'B12*'".
# It is possible to specify a different gcov version to lcov using, e.g., lcov --gcov-tool gcov-8.
# For me it compiled with g++-8 but used gcov-11 by default!
CXX=g++ CC=gcc cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCODE_COVERAGE=ON -DCMAKE_CXX_FLAGS="-DSHORT_TESTS" ..
cmake --build . -- check
lcov --capture --directory . --base-directory "$( cd .. && pwd )" --no-external --output-file coverage.info
lcov --list coverage.info
bash <( wget -O- -q https://codecov.io/bash ) -f coverage.info
- name: Run cppcheck
# Crashes on templated variable REVERSED_BITS_LUT<T>[value] (internalAstError)
if: false
run: |
set -o pipefail
cppcheck -j $( nproc ) --enable=all --std=c++17 --suppress=unusedFunction --suppress=useStlAlgorithm \
-I src/core \
-I src/indexed_bzip2 \
-I src/rapidgzip \
-I src/rapidgzip/huffman \
src/benchmarks \
src/core \
src/indexed_bzip2 \
src/rapidgzip \
src/tests \
src/tools 2>&1 | tee cppcheck.log
if grep -E -i 'error: .* \[[^]]*\]$' cppcheck.log; then
echo -e '\e[31mThere were errors while running cppcheck!\e[0m'
exit 1
fi
Clang-Tidy:
name: Clang-Tidy
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Dependencies
run: |
sudo apt-get -y install clang clang-tidy ninja-build libarchive-dev zlib1g-dev nasm
- name: Run clang-tidy
run: |
mkdir -p build-compile-commands && cd -- "$_"
CC=clang CXX=clang++ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DUSE_SYSTEM_ZLIB=ON -DRUN_CLANG_TIDY=ON ..
cmake --build .
Check:
name: Check without Sanitizer
# And especially without -DSHORT_TESTS, which makes it non redundant to the sanitizer checks!
runs-on: ubuntu-22.04
strategy:
matrix:
use_system_zlib: [ON, OFF]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Dependencies
run: |
sudo apt-get -y install g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Sanitizers
env:
USE_SYSTEM_ZLIB: ${{ matrix.use_system_zlib }}
run: |
mkdir -p "build" && cd -- "$_"
CXX=g++ CC=gcc cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_ISAL=ON -DUSE_SYSTEM_ZLIB=$USE_SYSTEM_ZLIB ..
cmake --build . -- check
Check-Without-Isal:
name: Check without Sanitizer and without ISA-L
# And especially without -DSHORT_TESTS, which makes it non redundant to the sanitizer checks!
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-12, macos-13, windows-latest]
env:
MACOSX_DEPLOYMENT_TARGET: "10.15"
steps:
- name: System Information
if: "! startsWith(matrix.os, 'windows')"
run: |
uname -a
- name: Print Architecture
if: "startsWith(matrix.os, 'macos')"
run: |
sysctl -n machdep.cpu.brand_string
arch
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: seanmiddleditch/gha-setup-ninja@master
- name: Install System Dependencies
if: "startsWith(matrix.os , 'macos')"
run: |
brew install ninja pigz zlib isa-l wget
wget 'https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2'
tar -xf htslib-1.20.tar.bz2
cd htslib* && ./configure && make install
- name: Install System Dependencies
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sudo apt-get -y install g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal
- name: Fix pip
if: "startsWith(matrix.os , 'macos')"
run: |
mkdir -p "$HOME/Library/Application Support/pip"
cat <<EOF >> "$HOME/Library/Application Support/pip/pip.conf"
[global]
break-system-packages = true
EOF
- name: Install Python Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'ubuntu')"
run: |
mkdir -p "build" && cd -- "$_"
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_ISAL=OFF -DUSE_SYSTEM_ZLIB=OFF ..
cmake --build . -- check
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'macos')"
run: |
# For some reason MacOS ARM is much slower and runs into a timeout without -DSHORT_TESTS :/
mkdir -p "build" && cd -- "$_"
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_ISAL=OFF -DUSE_SYSTEM_ZLIB=OFF -DCMAKE_CXX_FLAGS="-DSHORT_TESTS" ..
cmake --build . -- check
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'windows')"
run: |
mkdir -p "build" && cd -- "build"
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_ISAL=OFF ..
cmake --build . -- check
Asan:
name: ASan
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-13]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install System Dependencies
if: "startsWith(matrix.os , 'macos')"
run: |
brew install ninja pigz zlib isa-l wget nasm
wget 'https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2'
tar -xf htslib-1.20.tar.bz2
cd htslib* && ./configure && make install
- name: Install System Dependencies
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sudo apt-get -y install clang g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
- name: Install Python Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'macos')"
run: |
sanitizer=address
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
cmake -G Ninja -DWITH_ISAL=OFF -DUSE_SYSTEM_ZLIB=OFF -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- check
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sanitizer=address
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
CXX=clang++ CC=clang cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- check
cmake --build .
bash ../src/tests/testRapidgzip.sh
UBSan:
name: UBSan
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-13]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install System Dependencies
if: "startsWith(matrix.os , 'macos')"
run: |
brew install ninja pigz zlib isa-l wget nasm
wget 'https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2'
tar -xf htslib-1.20.tar.bz2
cd htslib* && ./configure && make install
- name: Install System Dependencies
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sudo apt-get -y install clang g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
- name: Install Python Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'macos')"
run: |
sanitizer=undefined
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
cmake -G Ninja -DWITH_ISAL=OFF -DUSE_SYSTEM_ZLIB=OFF -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- testParallelGzipReader
src/tests/rapidgzip/testParallelGzipReader
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sanitizer=undefined
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
CXX=clang++ CC=clang cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- check
Safe-Stack:
name: Safe-Stack
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-13]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install System Dependencies
if: "startsWith(matrix.os , 'macos')"
run: |
brew install ninja pigz zlib isa-l wget nasm gcc
wget 'https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2'
tar -xf htslib-1.20.tar.bz2
cd htslib* && ./configure && make install
- name: Install System Dependencies
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sudo apt-get -y install clang g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
- name: Install Python Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'macos')"
run: |
sanitizer=address
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
CXX=g++ CC=gcc cmake -G Ninja -DWITH_ISAL=OFF -DUSE_SYSTEM_ZLIB=OFF -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- testParallelGzipReader
src/tests/rapidgzip/testParallelGzipReader
- name: Run Tests With Sanitizers
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sanitizer=safe-stack
mkdir -p "build-sanitized-$sanitizer" && cd -- "$_"
CXX=clang++ CC=clang cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=$sanitizer -DSHORT_TESTS" ..
cmake --build . -- check
TSan:
name: TSan
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Dependencies
run: |
sudo apt-get -y install clang g++ ninja-build gzip tabix pigz gztool libarchive-dev zlib1g-dev isal nasm
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade-strategy eager --upgrade indexed_gzip pgzip
- name: Run Tests With Thread Sanitizer
run: |
sanitized=thread
mkdir -p "build-sanitized-$sanitized" && cd -- "$_"
#
# TSAN in clang 10 and 11 shows false positives in condition variables:
# https://github.com/google/sanitizers/issues/1259
# Similar false positives appear with GCC 10.
# NO warnings appear with: GCC 8, 9 and clang 12,
# so I'm pretty sure that these are the referenced false positives.
clangMajorVersion=$( clang++ --version | sed -n -E 's|.* ([0-9]+)[.][0-9]+[.][0-9]+.*|\1|p' | head -1 )
if [[ ( "$sanitized" == thread ) && ( "$clangMajorVersion" -le 11 ) ]]; then
g++ --version
gccMajorVersion=$( g++ --version | sed -n -E 's|.* ([0-9]+)[.][0-9]+[.][0-9]+.*|\1|p' | head -1 )
if [[ "$gccMajorVersion" -ge 10 ]]; then
echo "Could not find a compiler version without known false positives. Skipping TSAN."
continue
fi
CXX=g++
CC=gcc
else
CXX=clang++
CC=clang
fi
export CC CXX
#
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=$sanitized -DSHORT_TESTS" ..
cmake --build . -- check
Code-Checks:
name: Check with Infer
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Dependencies
run: |
sudo apt-get -y install ninja-build wget nasm
# Install infer
VERSION=1.1.0
wget -q -O- "https://github.com/facebook/infer/releases/download/v$VERSION/infer-linux64-v$VERSION.tar.xz" | tar -xJ
echo "$PWD/infer-linux64-v$VERSION/bin" >> $GITHUB_PATH
- name: Run infer
run: |
mkdir -p build-compile-commands && cd -- "$_"
CC=clang CXX=clang++ cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
infer run --report-blacklist-path-regex '.*testParallelBitStringFinder.cpp' --compilation-database compile_commands.json
Ibzip2-Tests:
name: Ibzip2 Tests
# And especially without -DSHORT_TESTS, which makes it non redundant to the sanitizer checks!
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-13, macos-14, windows-latest]
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: seanmiddleditch/gha-setup-ninja@master
- name: Install System Dependencies
if: "startsWith(matrix.os , 'macos')"
run: |
brew install ninja
- name: Install System Dependencies
if: "startsWith(matrix.os , 'ubuntu')"
run: |
sudo apt-get -y install g++ ninja-build
- name: Fix pip
if: "startsWith(matrix.os , 'macos')"
run: |
mkdir -p "$HOME/Library/Application Support/pip"
cat <<EOF >> "$HOME/Library/Application Support/pip/pip.conf"
[global]
break-system-packages = true
EOF
- name: Install Python Dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install build
- name: Install indexed_bzip2
working-directory: python/indexed_bzip2
shell: bash
run: |
python3 -m build
python3 -m pip install dist/*.tar.gz
- name: Run Standard Tests
shell: bash
# At this step, indexed_bzip2 should be installed.
run: |
mkdir -p build-ibzip2 && cd -- "$_"
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_ISAL=OFF ..
cmake --build . -- ibzip2
set -o pipefail
bash ../src/tests/testIbzip2.sh | tee run-standard-tests.log
if grep -i 'failed' run-standard-tests.log; then
echo -e '\e[31mThere were errors while running the tests!\e[0m'
exit 1
fi