Skip to content

checks

checks #988

Workflow file for this run

name: checks
permissions:
contents: read
on:
push:
branches:
- main
- 'release/**'
pull_request:
branches-ignore:
- 'release/**'
schedule:
- cron: '0 4 * * *'
merge_group:
branches:
- main
jobs:
build:
name: Build and test
runs-on: "${{ matrix.os }}"
env:
RUST_BACKTRACE: 1
# NOTE: tests that configure a custom runner must add that runner to
# the `runner` function in tests/quick.rs and tests/recover.rs.
# i686-unknown-linux-gnu
CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER: i686-linux-gnu-gcc
# s390x-unknown-linux-gnu
CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_LINKER: s390x-linux-gnu-gcc
CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUNNER: qemu-s390x -L /usr/s390x-linux-gnu
CARGO_TARGET_S390X_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C target-feature=+crt-static"
# wasm32-wasip1 (std for wasip2 is unstable)
WASI_SDK_PATH: /tmp/wasi-sdk-24.0-x86_64-linux
CC_wasm32_wasip1: /tmp/wasi-sdk-24.0-x86_64-linux/bin/clang
AR_wasm32_wasip1: /tmp/wasi-sdk-24.0-x86_64-linux/bin/llvm-ar
CARGO_TARGET_WASM32_WASIP1_RUNNER: "wasmtime --dir ../tests"
CARGO_TARGET_WASM32_WASIP1_RUSTFLAGS: "-Ctarget-feature=+simd128"
strategy:
matrix:
include:
- rust: stable
target: "x86_64-unknown-linux-gnu"
os: ubuntu-latest
codecov: true
- rust: msrv
target: "x86_64-unknown-linux-gnu"
os: ubuntu-latest
codecov: false
- rust: beta
target: "x86_64-unknown-linux-gnu"
os: ubuntu-latest
codecov: false
- target: "aarch64-unknown-linux-gnu"
os: ubuntu-24.04-arm
codecov: true
- target: "i686-unknown-linux-gnu"
os: ubuntu-latest
codecov: true
apt-packages: gcc-i686-linux-gnu
- target: "s390x-unknown-linux-gnu"
os: ubuntu-latest
codecov: false
apt-packages: qemu-user qemu-user-static libc6-dev-s390x-cross gcc-s390x-linux-gnu
- target: "wasm32-wasip1"
os: ubuntu-latest
packages: "-p libbz2-rs-sys -p test-libbz2-rs-sys"
codecov: false
- target: "x86_64-apple-darwin"
os: macos-latest
codecov: true
- target: "aarch64-apple-darwin"
os: macos-14
codecov: true
- target: "x86_64-pc-windows-gnu"
os: windows-2022
codecov: false
- target: "aarch64-pc-windows-msvc"
os: windows-11-arm
codecov: false
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
submodules: true
# Install the correct rust toolchain/version
- name: Set target rust version
run: echo "MSRV=$(grep rust-version Cargo.toml | grep MSRV | awk -F '\"' '{print $2}')" >> $GITHUB_ENV
if: ${{ matrix.rust == 'msrv' }}
- name: Install toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: ${{ env.MSRV || matrix.rust || 'stable' }}
targets: "${{ matrix.target }}"
# Install dependencies
- name: Install cargo-llvm-cov & cargo-nextest
uses: taiki-e/install-action@d12e869b89167df346dd0ff65da342d1fb1202fb # v2.53.2
with:
tool: cargo-llvm-cov,cargo-nextest
- name: Cache apt packages
if: matrix.apt-packages != ''
uses: awalsh128/cache-apt-pkgs-action@v1
with:
packages: "${{ matrix.apt-packages }}"
version: 2
- name: Download wasmtime & wasi-sdk
if: ${{ contains(matrix.target, 'wasm') }}
run: |
curl https://wasmtime.dev/install.sh -sSf | bash
echo "$HOME/.wasmtime/bin" >> $GITHUB_PATH
curl -L https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-x86_64-linux.tar.gz | tar xz --directory /tmp
- name: cargo build
run: cargo build --target ${{matrix.target}} ${{ matrix.packages || '--workspace' }}
if: ${{ matrix.target == 's390x-unknown-linux-gnu' }}
- name: cargo build (no_std)
run: cargo rustc --target ${{matrix.target}} -p libbz2-rs-sys --lib --no-default-features --crate-type rlib
env:
RUSTFLAGS: -Aunused_variables -Aunused_assignments
- name: cargo build (no_std + rust_allocator)
run: cargo rustc --target ${{matrix.target}} -p libbz2-rs-sys --lib --no-default-features --features rust-allocator --crate-type rlib
env:
RUSTFLAGS: -Aunused_variables -Aunused_assignments
- name: cargo llvm-cov nextest
if: matrix.codecov
run: cargo llvm-cov nextest --lcov --output-path lcov.info --ignore-filename-regex "test-libz|dynamic-libz" --target ${{matrix.target}} ${{ matrix.packages || '--workspace' }} --no-fail-fast
- name: cargo nextest
if: matrix.codecov == false
run: cargo nextest run --target ${{matrix.target}} ${{ matrix.packages || '--workspace' }} --no-fail-fast
- name: Upload coverage to Codecov
uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0
if: matrix.codecov
with:
files: ./lcov.info
fail_ci_if_error: false
flags: test-${{matrix.target}}
token: ${{ secrets.CODECOV_TOKEN }}
name: test
verbose: true
clippy:
name: Clippy
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
features:
- ""
- '--no-default-features --features="c-allocator"'
- '--no-default-features --features="std,rust-allocator"'
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
submodules: true
- name: Install rust toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: stable
components: clippy
targets: ${{matrix.target}}
- name: Rust cache
uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8
with:
shared-key: "stable-${{matrix.target}}"
- name: Run clippy
run: cargo clippy --target ${{matrix.target}} ${{matrix.features}} --workspace --all-targets -- -D warnings
fuzz:
name: Smoke-test fuzzing targets
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- os: ubuntu-latest
features: default
- os: ubuntu-latest
features: c-allocator
- os: ubuntu-latest
features: rust-allocator
- os: macos-14
features: ""
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
submodules: true
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: nightly
- name: Install cargo fuzz
run: cargo install cargo-fuzz
- name: Smoke-test fuzz targets
run: |
cargo fuzz build --no-default-features --features="${{ matrix.features }}"
for target in $(cargo fuzz list); do
if [ "$target" = "decompress_chunked" ]; then
features="${{ matrix.features }} disable-checksum"
else
features="${{ matrix.features }}"
fi
RUST_BACKTRACE=1 cargo fuzz run --jobs 4 --no-default-features --features="$features" $target -- -max_total_time=10
done
fuzz-code-coverage:
name: Fuzz with code coverage
runs-on: ubuntu-latest
strategy:
matrix:
include:
- fuzz_target: decompress_chunked
corpus: "bzip2-files/compressed"
features: '--no-default-features --features="disable-checksum"'
- fuzz_target: compress_then_decompress
corpus: ""
features: ''
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
- name: Install nightly toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: nightly
components: llvm-tools-preview
- name: Install rustfilt
uses: taiki-e/install-action@a27ef18d36cfa66b0af3a360104621793b41c036 # v2.54.3
with:
tool: rustfilt
- name: Install cargo fuzz
run: cargo install cargo-fuzz
- name: Download custom decompression corpus
if: ${{ contains(matrix.corpus, 'bzip2-files') }}
run: |
wget https://github.com/trifectatechfoundation/compression-corpus/releases/download/2025-04-24-180855/bzip2-files.zip
unzip bzip2-files.zip -d bzip2-files
- name: Run `cargo fuzz`
env:
RUST_BACKTRACE: "1"
# prevents `cargo fuzz coverage` from rebuilding everything
RUSTFLAGS: "-C instrument-coverage"
run: |
cargo fuzz run --jobs 4 ${{matrix.features}} ${{matrix.fuzz_target}} ${{matrix.corpus}} -- -max_total_time=20
- name: Fuzz codecov
run: |
cargo fuzz coverage ${{matrix.features}} ${{matrix.fuzz_target}} ${{matrix.corpus}}
$(rustc --print sysroot)/lib/rustlib/$(rustc --print host-tuple)/bin/llvm-cov export -Xdemangler=rustfilt \
target/$(rustc --print host-tuple)/coverage/$(rustc --print host-tuple)/release/${{matrix.fuzz_target}} \
-instr-profile=fuzz/coverage/${{matrix.fuzz_target}}/coverage.profdata \
--format=lcov \
-ignore-filename-regex="\.cargo|\.rustup|fuzz_targets|test-libbz2" > lcov.info
- name: List the corpus
if: ${{ contains(matrix.corpus, 'bzip2-files') }}
run: |
ls ${{matrix.corpus}}
- name: Upload coverage to Codecov
uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
with:
files: ./lcov.info
fail_ci_if_error: false
flags: fuzz-${{ matrix.fuzz_target }}
token: ${{ secrets.CODECOV_TOKEN }}
name: fuzz
miri:
name: "Miri"
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
submodules: true
- name: Install Miri
run: |
rustup toolchain install nightly --component miri
cargo +nightly miri setup
- name: Install cargo-nextest
uses: taiki-e/install-action@d12e869b89167df346dd0ff65da342d1fb1202fb # v2.53.2
with:
tool: cargo-nextest
- name: Test public C api with miri
run: |
cargo +nightly miri nextest run -j4 -p test-libbz2-rs-sys miri_
- name: Run unit tests with miri
run: "cargo +nightly miri nextest run -j4 -p libbz2-rs-sys"
link-c-dynamic-library:
name: vanilla dynamic library
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
features:
- ''
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
- name: Install rust toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: stable
targets: ${{matrix.target}}
- name: "cdylib: default settings"
working-directory: libbz2-rs-sys-cdylib
env:
LD_LIBRARY_PATH: "target/${{matrix.target}}/release/deps"
run: |
cargo build --release --target ${{matrix.target}}
cc -o bzpipe bzpipe.c target/${{matrix.target}}/release/deps/libbz2_rs.so -I ../
./bzpipe < Cargo.toml | ./bzpipe -d > out.txt
cmp -s Cargo.toml out.txt
- name: "cdylib: no stdio"
env:
LD_LIBRARY_PATH: "target/${{matrix.target}}/release/deps"
working-directory: libbz2-rs-sys-cdylib
run: |
cargo build --release --target ${{matrix.target}} --no-default-features
cc -DNO_STD -o bzpipe bzpipe.c target/${{matrix.target}}/release/deps/libbz2_rs.so -I ../
./bzpipe < Cargo.toml | ./bzpipe -d > out.txt
cmp -s Cargo.toml out.txt
- name: "staticlib: no stdio"
env:
LD_LIBRARY_PATH: "target/${{matrix.target}}/release/deps"
working-directory: libbz2-rs-sys-cdylib
run: |
cargo build --release --target ${{matrix.target}} --no-default-features
cc -o bzpipe bzpipe.c target/${{matrix.target}}/release/deps/libbz2_rs.so -I ../
./bzpipe < Cargo.toml | ./bzpipe -d > out.txt
cmp -s Cargo.toml out.txt
- name: "cdylib: custom-prefix"
working-directory: libbz2-rs-sys-cdylib
env:
LIBBZ2_RS_SYS_PREFIX: "MY_CUSTOM_PREFIX_"
run: |
cargo build --release --target ${{matrix.target}} --features=custom-prefix
objdump -tT target/${{matrix.target}}/release/deps/libbz2_rs.so | grep -q "MY_CUSTOM_PREFIX_BZ2_bzCompressInit" || (echo "symbol not found!" && exit 1)
- name: "cdylib: semver-prefix"
working-directory: libbz2-rs-sys-cdylib
run: |
cargo build --release --target ${{matrix.target}} --features=semver-prefix
objdump -tT target/${{matrix.target}}/release/deps/libbz2_rs.so | grep -q -E "LIBBZ2_RS_SYS_v0.[0-9]+.x_BZ2_bzCompressInit" || (echo "symbol not found!" && exit 1)
cargo-c-dynamic-library:
name: cargo-c dynamic library
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
features:
- ''
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
- name: Install rust toolchain
uses: dtolnay/rust-toolchain@be73d7920c329f220ce78e0234b8f96b7ae60248
with:
toolchain: stable
targets: ${{matrix.target}}
- name: Install cargo-c
env:
LINK: https://github.com/lu-zero/cargo-c/releases/download/v0.10.5
run: |
curl -L "$LINK/cargo-c-x86_64-unknown-linux-musl.tar.gz" |
tar xz -C $HOME/.cargo/bin
- name: build with and test the result of cargo-c
working-directory: libbz2-rs-sys-cdylib
run: |
# build using cargo-c this time
cargo cinstall --release --destdir=/tmp/cargo-cbuild-libbzip2-rs # somehow --offline does not work here
tree /tmp/cargo-cbuild-libbzip2-rs
# verify that the SONAME is set and includes a version
objdump -p target/x86_64-unknown-linux-gnu/release/libbz2_rs.so | awk '/SONAME/{print $2}' | grep -E 'libbz2_rs\.so\.1'
# build bzpipe with our library
cc -o bzpipe bzpipe.c -L/tmp/cargo-cbuild-libbzip2-rs/usr/local/lib/x86_64-linux-gnu -lbz2_rs -I ../
export LD_LIBRARY_PATH=/tmp/cargo-cbuild-libbzip2-rs/usr/local/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
./bzpipe < Cargo.toml | ./bzpipe -d > out.txt
cmp -s Cargo.toml out.txt
- name: verify api surface with abigail
run: |
sudo apt install libbz2-dev abigail-tools
LIBBZ2_PATH=$(ldconfig -p | grep "x86_64-linux-gnu/libbz2.so" | head -n 1 | awk '{print $4}')
LIBBZ2_FILENAME=$(basename "$LIBBZ2_PATH")
abidw $LIBBZ2_PATH > /tmp/$LIBBZ2_FILENAME.abi
abidw /tmp/cargo-cbuild-libbzip2-rs/usr/local/lib/x86_64-linux-gnu/libbz2_rs.so > /tmp/liblibz_rs_sys.so.abi
abidiff --no-unreferenced-symbols --ignore-soname /tmp/$LIBBZ2_FILENAME.abi /tmp/liblibz_rs_sys.so.abi
run-bzip2-rs-test-suite:
name: run bzip2-rs test suite
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
persist-credentials: false
- name: run
run: |
cd ..
git clone https://github.com/trifectatechfoundation/bzip2-rs.git
cd bzip2-rs
sed -i '/^\[dependencies\.libbz2-rs-sys\]/,/^$/ s/^version = .*/path = "..\/libbzip2-rs\/libbz2-rs-sys"/' Cargo.toml
cargo test # libbz2-rs-sys is the default now