Skip to content

Add fuzz testing

Add fuzz testing #125

Workflow file for this run

name: CI
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
libpcre2-dev \
gnulib \
lcov
- name: Bootstrap
run: ./bootstrap
- name: Configure
run: |
./configure \
--with-pcre2 \
CFLAGS="--coverage -g -O0" \
LDFLAGS="--coverage"
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Generate coverage report
run: |
# Create coverage directory
mkdir -p coverage
# Capture coverage data with geninfo options to handle warnings
lcov --capture --directory . --output-file coverage/coverage.info --rc geninfo_unexecuted_blocks=1
# Remove coverage data for system headers, lib files, and test files
lcov --remove coverage/coverage.info '/usr/*' '*/lib/*' '*/tests/*' --output-file coverage/coverage_filtered.info --ignore-errors unused
# Generate HTML report
genhtml coverage/coverage_filtered.info --output-directory coverage/html
# Generate summary for CI and extract coverage percentage
lcov --summary coverage/coverage_filtered.info > coverage/summary.txt
# Extract coverage percentage for badge (using awk for more reliable parsing)
COVERAGE=$(awk '/lines\.+:/ {gsub(/[()%]/, "", $2); print $2}' coverage/summary.txt)
echo "COVERAGE_PERCENT=$COVERAGE" >> $GITHUB_ENV
echo "Coverage: $COVERAGE%"
# Extract detailed coverage info for PR comments
LINES_COVERED=$(awk '/lines\.+:/ {print $3 " " $4 " " $5}' coverage/summary.txt | tr -d '()')
FUNCTIONS_COVERED=$(awk '/functions\.+:/ {print $3 " " $4 " " $5}' coverage/summary.txt | tr -d '()')
echo "LINES_COVERED=$LINES_COVERED" >> $GITHUB_ENV
echo "FUNCTIONS_COVERED=$FUNCTIONS_COVERED" >> $GITHUB_ENV
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
file: ./coverage/coverage_filtered.info
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done
test-without-pcre2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies (without PCRE2)
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
gnulib
- name: Bootstrap
run: ./bootstrap
- name: Configure without PCRE2
run: ./configure --without-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
test-distcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
libpcre2-dev \
gnulib
- name: Bootstrap
run: ./bootstrap
- name: Configure
run: ./configure --with-pcre2
- name: Build and test distribution
run: make distcheck
test-musl:
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
pcre2-dev \
bash \
git \
coreutils \
python3
- name: Clone gnulib for bootstrap
run: |
./gnulib-update.sh
- name: Bootstrap
run: |
export PATH="/tmp/gnulib:$PATH"
./bootstrap
- name: Configure
run: ./configure --with-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done
test-musl-without-pcre2:
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies (without PCRE2)
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
bash \
git \
coreutils \
python3
- name: Clone gnulib for bootstrap
run: |
./gnulib-update.sh
- name: Bootstrap
run: |
export PATH="/tmp/gnulib:$PATH"
./bootstrap
- name: Configure without PCRE2
run: ./configure --without-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done