Skip to content

Fix tests to work with out of source builds. #7283

Fix tests to work with out of source builds.

Fix tests to work with out of source builds. #7283

Workflow file for this run

name: Build and test
on:
push:
branches: ["master", "dev"]
pull_request:
branches: ["dev"]
schedule:
- cron: '0 0 * * 0' # Run every Sunday at midnight
env:
BUILD_DIR: Dist
GCOVR_FLAGS: --gcov-ignore-parse-errors --exclude-throw-branches --filter Common --filter Pcap --filter Packet --xml
CCACHE_DIR: ${{ github.workspace }}/.ccache
CPPCHECK_VERSION: 2.9
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ !(github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev') }}
jobs:
pre-commit:
runs-on: ubuntu-latest
container: seladb/alpine317
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# Checkout is performed out of the container and doesn't match our user
- name: Fix checkout ownership
run: chown -R "$(id -u):$(id -g)" "$GITHUB_WORKSPACE"
- name: Install dependencies
run: |
apk update && apk add python3-dev
git clone --branch $CPPCHECK_VERSION --single-branch https://github.com/danmar/cppcheck.git
cd cppcheck && mkdir build && cd build && cmake .. && cmake --build . && cmake --install . && cd ../../ && rm -rf cppcheck
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install pre-commit setuptools clang-format==19.1.6 clang-tidy==18.1.8
- name: Run pre-commit
run: |
. .venv/bin/activate
pre-commit run --all-files
- name: Configure PcapPlusPlus for Static analysis
run: cmake -S . -B "$BUILD_DIR"
- name: Run clang-tidy on changed files
run: |
./ci/clang-tidy-all.sh changed "$BUILD_DIR"
linux:
runs-on: ${{ matrix.runner }}
container: seladb/${{ matrix.image }}
strategy:
matrix:
include: # Check the images at https://github.com/seladb/PcapPlusPlus-DockerImages
- runner: ubuntu-latest
image: ubuntu2404
config-zstd: OFF
- runner: ubuntu-latest
image: ubuntu2204
config-zstd: OFF
- runner: ubuntu-latest
image: ubuntu2204-icpx
config-zstd: OFF
additional-flags: -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
additional-gcov-flags: --gcov-executable "llvm-cov gcov"
- runner: ubuntu-latest
image: ubuntu2004
config-zstd: OFF
- runner: ubuntu-latest
image: rhel94
config-zstd: OFF
- runner: ubuntu-latest
image: ubuntu2004-zstd
config-zstd: ON
- runner: ubuntu-latest
image: fedora42
config-zstd: OFF
- runner: ubuntu-latest
image: alpine320
config-zstd: OFF
- runner: ubuntu-24.04-arm
image: ubuntu2404-arm64
config-zstd: OFF
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# Checkout is performed out of the container and doesn't match our user
- name: Fix checkout ownership
run: chown -R "$(id -u):$(id -g)" "$GITHUB_WORKSPACE"
- name: Setup Intel Compiler variables
if: contains(matrix.image, 'icpx')
run: |
. /opt/intel/oneapi/setvars.sh
printenv >> $GITHUB_ENV
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
${{ env.CCACHE_DIR }}
!*.gcda
!*.gcno
key: ${{ matrix.image }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.image }}-ccache
- name: Configure PcapPlusPlus
run: cmake -DLIGHT_PCAPNG_ZSTD=${{ matrix.config-zstd }} -DPCAPPP_BUILD_COVERAGE=ON ${{ matrix.additional-flags }} -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Prepare environment for tests
run: |
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -r ci/run_tests/requirements.txt
- name: Test PcapPlusPlus
run: |
. .venv/bin/activate
python3 ci/run_tests/run_tests.py --interface eth0 ${{ matrix.additional-test-flags }} --build-dir "$BUILD_DIR"
- name: Test Examples
run: |
. .venv/bin/activate
cd Tests/ExamplesTest
python3 -m pip install -r requirements.txt
python3 -m pytest --interface eth0 --root-path=../../Dist/examples_bin
- name: Check installation
run: |
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR"
- name: Build Tutorials
run: |
cmake -DPCAPPP_BUILD_TUTORIALS=ON ${{ matrix.additional-flags }} -S Examples -B build_examples
cmake --build build_examples -j
- name: Test Tutorials
run: cd build_examples/tutorials_bin && ./Tutorial-HelloWorld
- name: Create Cobertura Report
run: |
. .venv/bin/activate
python3 -m pip install gcovr
gcovr -v -r . ${{ matrix.additional-gcov-flags }} $GCOVR_FLAGS -o coverage.xml
- name: Upload Coverage Results
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
with:
files: ./coverage.xml
flags: ${{ matrix.image }},unittest
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
packet-only:
runs-on: ubuntu-latest
container: seladb/ubuntu2404
env:
image: ubuntu2404
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# Checkout is performed out of the container and doesn't match our user
- name: Fix checkout ownership
run: chown -R "$(id -u):$(id -g)" "$GITHUB_WORKSPACE"
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: |
${{ env.CCACHE_DIR }}
!*.gcda
!*.gcno
key: ${{ env.image }}-ccache-${{ github.run_id }}
restore-keys: |
${{ env.image }}-ccache
- name: Configure PcapPlusPlus
run: cmake -DPCAPPP_BUILD_COVERAGE=ON -DPCAPPP_BUILD_PCAPPP=OFF -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Prepare environment for tests
run: |
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -r ci/run_tests/requirements.txt
- name: Test PcapPlusPlus
run: |
. .venv/bin/activate
python3 ci/run_tests/run_tests.py --interface eth0 --test-suites "packet" --build-dir "$BUILD_DIR"
- name: Check installation
run: |
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR"
- name: Create Cobertura Report
run: |
. .venv/bin/activate
python3 -m pip install gcovr
gcovr -v -r . $GCOVR_FLAGS -o coverage.xml
- name: Upload Coverage Results
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
with:
files: ./coverage.xml
flags: ${{ env.image }},unittest
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
dpdk:
runs-on: ubuntu-latest
container: seladb/${{ matrix.image }}
strategy:
matrix:
include:
- image: ubuntu2404-dpdk2411
- image: ubuntu2404-dpdk2311
- image: ubuntu2204-dpdk2211
steps:
- name: Check AVX-512 support
run: |
echo "::debug::$(grep flags /proc/cpuinfo)"
if grep -q avx512 /proc/cpuinfo; then
echo "avx512=true" >> $GITHUB_ENV
else
echo "avx512=false" >> $GITHUB_ENV
fi
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ matrix.image }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.image }}-ccache
- name: Configure PcapPlusPlus
run: cmake -DPCAPPP_USE_DPDK=ON ${{ matrix.additional-flags }} -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Test Packet++
if: env.avx512 == 'true'
run: |
cd Tests/Packet++Test
Bin/Packet++Test
- name: Test Pcap++
if: env.avx512 == 'true'
run: |
cd Tests/Pcap++Test
Bin/Pcap++Test
- name: Tests skipped (no AVX-512 hardware support)
if: env.avx512 == 'false'
run: echo "Skipping tests since AVX-512 is not supported on the current runner"
- name: Check installation
run: |
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR"
- name: Build Tutorials
run: |
cmake -DPCAPPP_BUILD_TUTORIALS=ON -S Examples -B build_examples
cmake --build build_examples -j
- name: Test Tutorials
run: cd build_examples/tutorials_bin && ./Tutorial-HelloWorld
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
pfring:
runs-on: ubuntu-latest
container: seladb/ubuntu2004-pfring
strategy:
matrix:
include:
- configure: cmake -DPCAPPP_USE_PF_RING=ON -DPF_RING_ROOT="/PF_RING" -S . -B "$BUILD_DIR"
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ matrix.image }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.image }}-ccache
- name: Configure PcapPlusPlus
run: ${{ matrix.configure }}
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Test Packet++
run: |
cd Tests/Packet++Test
Bin/Packet++Test
- name: Test Pcap++
run: |
cd Tests/Pcap++Test
Bin/Pcap++Test -n
- name: Check installation
run: |
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR"
- name: Build Tutorials
run: |
cmake -DPCAPPP_BUILD_TUTORIALS=ON -DPF_RING_ROOT="/PF_RING" -S Examples -B build_examples
cmake --build build_examples -j
- name: Test Tutorials
run: cd build_examples/tutorials_bin && ./Tutorial-HelloWorld
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
macos:
runs-on: ${{ matrix.os-version }}
strategy:
matrix:
include:
- os-version: macos-14
host-arch: x86_64
arch: x86_64
config-zstd: OFF
# TODO: see https://github.com/seladb/PcapPlusPlus/issues/1989
# - os-version: macos-14
# host-arch: x86_64
# arch: x86_64
# config-zstd: ON
- os-version: macos-14
host-arch: arm64
arch: arm64
config-zstd: ON
- os-version: macos-15
host-arch: x86_64
arch: x86_64
config-zstd: OFF
- os-version: macos-15
host-arch: arm64
arch: arm64
config-zstd: ON
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
# support version: https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json
python-version: "3.12"
- name: Install Requirements Ccache & Tcpreplay
run: brew install ccache tcpreplay
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ matrix.os-version }}-${{ matrix.arch }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.os-version }}-${{ matrix.arch }}-ccache
- name: Configure PcapPlusPlus
# Ensure user have access to network devices instead of giving super-user right
run: |
sudo chmod a+rw /dev/bpf*
sudo chmod a+rw /usr/local
cmake -DLIGHT_PCAPNG_ZSTD=${{ matrix.config-zstd }} -DCMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} -DPCAPPP_BUILD_COVERAGE=ON -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Check architecture
run: lipo $BUILD_DIR/Pcap++/libPcap++.a -verify_arch ${{ matrix.arch }}
- name: Prepare environment for tests
run: |
python -m venv .venv
. .venv/bin/activate
python -m pip install -r ci/run_tests/requirements.txt
- name: Test PcapPlusPlus
# We can't run cross compiled binaries
if: ${{ matrix.host-arch == matrix.arch }}
run: |
. .venv/bin/activate
python ci/run_tests/run_tests.py --interface en0 --build-dir "$BUILD_DIR"
- name: Test Examples
if: ${{ matrix.host-arch == matrix.arch }}
run: |
cd Tests/ExamplesTest
python -m pip install -r requirements.txt
python -m pytest --interface en0 --use-sudo --root-path=../../Dist/examples_bin
- name: Check installation
run: |
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR"
- name: Build Tutorials
run: |
mkdir -p build_examples
cmake -DPCAPPP_BUILD_TUTORIALS=ON -DCMAKE_OSX_ARCHITECTURES=${{ matrix.arch }} -S Examples -B build_examples
cmake --build build_examples -j
- name: Test Tutorials
if: ${{ matrix.host-arch == matrix.arch }}
run: cd build_examples/tutorials_bin && ./Tutorial-HelloWorld
- name: Create Cobertura Report
if: ${{ matrix.host-arch == matrix.arch }}
run: |
python3 -m pip install gcovr
gcovr -v -r . $GCOVR_FLAGS -o coverage.xml
- name: Upload Coverage Results
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
if: ${{ matrix.host-arch == matrix.arch }}
with:
files: ./coverage.xml
flags: ${{ matrix.os-version }},unittest
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
define-windows-pcap-backend-matrix:
name: Determine Windows Pcap Backend Matrix
runs-on: ubuntu-latest
outputs:
npcap-or-default: ${{ steps.generate-backends.outputs.npcap_or_default}}
steps:
- name: Initialize NPcap backend variable
run: echo "npcap_available=false" >> $GITHUB_ENV
- name: Enable NPcap backend if OEM credentials are available
env: # Secrets can't be accessed directly in 'if' conditionals.
npcap_username: ${{ secrets.NPCAP_USERNAME }}
npcap_password: ${{ secrets.NPCAP_PASSWORD }}
if: ${{ env.npcap_username != '' && env.npcap_password != '' }}
run: echo "npcap_available=true" >> $GITHUB_ENV
- name: NPcap backend is unavailable
if: ${{ env.npcap_available != 'true' }}
run: echo "NPcap backend will be skipped since OEM credentials are missing. NPCAP_USERNAME and NPCAP_PASSWORD are required."
- name: Generate pcap backends matrix
id: generate-backends
run: |
if [[ "${{ env.npcap_available }}" == "true" ]]; then
echo 'npcap_or_default=npcap' >> "$GITHUB_OUTPUT"
else
echo 'npcap_or_default=winpcap' >> "$GITHUB_OUTPUT"
fi
mingw-w64:
needs: define-windows-pcap-backend-matrix
strategy:
matrix:
include:
- sys: mingw32
env: i686
pcap_lib: "winpcap"
- sys: mingw64
env: x86_64
pcap_lib: ${{ needs.define-windows-pcap-backend-matrix.outputs.npcap-or-default }}
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup MSYS2
uses: msys2/setup-msys2@fb197b72ce45fb24f17bf3f807a388985654d1f2 # v2.29.0
with:
msystem: ${{matrix.sys}}
install: >-
git
mingw-w64-${{matrix.env}}-cmake
mingw-w64-${{matrix.env}}-gcc
mingw-w64-${{matrix.env}}-make
- name: Setup Python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: "3.12"
- name: Install NPcap
env:
NPCAP_USERNAME: ${{ secrets.NPCAP_USERNAME }}
NPCAP_PASSWORD: ${{ secrets.NPCAP_PASSWORD }}
run: |
ci\install_npcap.bat
echo "PCAP_SDK_DIR=/C/Npcap-sdk" >> $env:GITHUB_ENV
if: matrix.pcap_lib == 'npcap'
- name: Install WinPcap
run: |
ci\install_winpcap.bat
echo "PCAP_SDK_DIR=/C/WpdPack" >> $env:GITHUB_ENV
if: matrix.pcap_lib == 'winpcap'
- name: Configure PcapPlusPlus
shell: msys2 {0}
run: |
cmake -G "MinGW Makefiles" -DPCAP_ROOT=${{ env.PCAP_SDK_DIR }} -DLIGHT_PCAPNG_ZSTD=OFF -DPCAPPP_BUILD_COVERAGE=ON -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
shell: msys2 {0}
# More than 2 jobs would make the build crash with OOM
# cc1plus.exe: out of memory allocating 65536 bytes
run: cmake --build "$BUILD_DIR" -j 2
- name: Install tcpreplay
run: ci\install_tcpreplay.bat
- name: Test PcapPlusPlus
run: |
python -m pip install -r ci\run_tests\requirements.txt
python ci\run_tests\run_tests_windows.py
- name: Test Examples
run: |
cd Tests\ExamplesTest
python -m pip install -r requirements.txt
python -m pytest --root-path=../../Dist/examples_bin
- name: Install Coverage Requirements
run: python3 -m pip install gcovr
- name: Process Coverage Files
shell: msys2 {0}
run: find . -name "*.gcno" -exec gcov -b -l -p -c {} +
- name: Create Coberture Report
run: gcovr -v -g -k -r . $env:GCOVR_FLAGS.split() -o coverage.xml
- name: Upload Coverage Results
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
with:
files: ./coverage.xml
flags: ${{ matrix.sys }},unittest
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
visual-studio:
needs: define-windows-pcap-backend-matrix
strategy:
matrix:
include:
- os: windows-2025
platform: "Visual Studio 17 2022"
arch: Win32
pcap_lib: "winpcap"
- os: windows-2025
platform: "Visual Studio 17 2022"
arch: "x64"
pcap_lib: ${{ needs.define-windows-pcap-backend-matrix.outputs.npcap-or-default }}
- os: windows-2022
platform: "Visual Studio 17 2022"
arch: "x64"
pcap_lib: ${{ needs.define-windows-pcap-backend-matrix.outputs.npcap-or-default }}
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Setup Python
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: "3.12"
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2.0.0
- name: Setup OpenCppCoverage and add to PATH
run: |
choco install OpenCppCoverage -y
echo "C:\Program Files\OpenCppCoverage" >> $env:GITHUB_PATH
- name: Install WinPcap
run: |
ci\install_winpcap.bat
echo "PCAP_SDK_DIR=C:\WpdPack" >> $env:GITHUB_ENV
if: matrix.pcap_lib == 'winpcap'
- name: Install NPcap
env:
NPCAP_USERNAME: ${{ secrets.NPCAP_USERNAME }}
NPCAP_PASSWORD: ${{ secrets.NPCAP_PASSWORD }}
run: |
ci\install_npcap.bat
echo "PCAP_SDK_DIR=C:\Npcap-sdk" >> $env:GITHUB_ENV
if: matrix.pcap_lib == 'npcap'
- name: Set Zstd
run: |
ci\install_zstd.bat
echo "ZSTD_HOME_PARAM=-z C:\zstd" >> $env:GITHUB_ENV
if: matrix.use_zstd == true
- name: Configure PcapPlusPlus
run: cmake -A ${{ matrix.arch }} -G "${{ matrix.platform }}" -DPCAP_ROOT=${{ env.PCAP_SDK_DIR }} -S . -B "$env:BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build $env:BUILD_DIR -j
- name: Install tcpreplay
run: ci\install_tcpreplay.bat
- name: Test PcapPlusPlus
run: |
python -m pip install -r ci\run_tests\requirements.txt
python ci\run_tests\run_tests_windows.py --coverage
- name: Test Examples
run: |
move ".\Dist\examples_bin\Debug\*" ".\Dist\examples_bin\"
cd Tests\ExamplesTest
python -m pip install -r requirements.txt
python -m pytest --root-path=../../Dist/examples_bin
- name: Upload Coverage Results
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
with:
files: ./Tests/Pcap++Test/Pcap++Coverage.xml,./Tests/Packet++Test/Packet++Coverage.xml
flags: ${{ matrix.os }},unittest,${{ matrix.pcap_lib }}
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
freebsd:
runs-on: ubuntu-latest
strategy:
matrix:
version: ["14.1", "13.4"]
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Test in FreeBSD
id: test
uses: vmactions/freebsd-vm@8873d98fd1413b5977cb2f7348fe329775159892 # v1.1.9
with:
release: ${{ matrix.version }}
usesh: true
prepare: |
pkg install -y python bash cmake git gmake gsed libpcap tcpreplay libffi openssl py311-cryptography
run: |
echo "Building PcapPlusPlus"
chmod a+rw /dev/bpf*
cmake -S . -B Dist
cmake --build Dist -j$(sysctl -n hw.ncpu)
echo "Setting up the network interface for the tests"
# Get the first interface name that is not 'lo'
interface_name=$(ifconfig -l | tr ' ' '\n' | grep -v '^lo' | head -n 1)
ifconfig "$interface_name" promisc
echo "Testing PcapPlusPlus"
python -m ensurepip
python -m pip install -r ci/run_tests/requirements.txt
python ci/run_tests/run_tests.py --interface "$interface_name" --build-dir "$BUILD_DIR"
echo "Testing PcapPlusPlus examples"
cd Tests/ExamplesTest
python -m pip install -r requirements.txt
python -m pytest --interface "$interface_name" --root-path=../../Dist/examples_bin
android:
strategy:
matrix:
include:
- run-on-os: ubuntu-latest
target: x86_64
api-version: 35
- run-on-os: ubuntu-latest
target: x86
api-version: 35
- run-on-os: macos-15
target: armeabi-v7a
api-version: 35
- run-on-os: macos-15
target: arm64-v8a
api-version: 35
runs-on: ${{ matrix.run-on-os }}
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Checkout lipbcap for Android
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: seladb/libpcap-android
path: ./libpcap-android
- name: Configure PcapPlusPlus
run: |
LIBPCAP_PATH=$(pwd)/libpcap-android
cmake -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" -DANDROID_PLATFORM="${{ matrix.api-version}}" -DANDROID_ABI="${{ matrix.target }}" -DPCAP_INCLUDE_DIR="${LIBPCAP_PATH}/include/" -DPCAP_LIBRARY="${LIBPCAP_PATH}/${{ matrix.target }}/${{ matrix.api-version}}/libpcap.a" -S . -B "$BUILD_DIR"
- name: Build PcapPlusPlus
run: cmake --build "$BUILD_DIR" -j
- name: Checkout ToyVpn-PcapPlusPlus
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: seladb/ToyVpn-PcapPlusPlus
path: ./ToyVpn-PcapPlusPlus
ref: "v2.0.0"
submodules: true
- name: Build and install PcapPlusPlus
run: |
TOYVPN_PCAPPLUSPLUS="./ToyVpn-PcapPlusPlus/app/libs/pcapplusplus"
PCAPPLUSPLUS_LIBS_PATH="$TOYVPN_PCAPPLUSPLUS/${{ matrix.target }}/${{ matrix.api-version }}"
PCAPPLUSPLUS_INCLUDE_PATH="$TOYVPN_PCAPPLUSPLUS/include"
cmake -DPCAPPP_BUILD_COVERAGE=OFF -S . -B "$BUILD_DIR"
cmake --build "$BUILD_DIR" -j
cmake --install "$BUILD_DIR" --prefix ${TOYVPN_PCAPPLUSPLUS}
mkdir -p ${PCAPPLUSPLUS_LIBS_PATH} ${PCAPPLUSPLUS_INCLUDE_PATH}
mv ${TOYVPN_PCAPPLUSPLUS}/lib/*.a ${PCAPPLUSPLUS_LIBS_PATH}/
mv ${TOYVPN_PCAPPLUSPLUS}/include/pcapplusplus/*.h ${PCAPPLUSPLUS_INCLUDE_PATH}/
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: "17"
distribution: "zulu"
cache: "gradle"
- name: Build gradle project and run tests
working-directory: ./ToyVpn-PcapPlusPlus
run: |
chmod +x ./gradlew
./gradlew build -PabiFilter=${{ matrix.target}}
- name: Enable KVM
if: matrix.target == 'x86_64'
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumentation tests
if: matrix.target == 'x86_64'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-version }}
arch: ${{ matrix.target }}
working-directory: ./ToyVpn-PcapPlusPlus
script: ./gradlew -is connectedCheck -PabiFilter=${{ matrix.target}}
# Uncomment to enable logs
# script: |
# adb logcat -c
# adb logcat &
# gradle -is connectedCheck
xdp:
runs-on: ubuntu-22.04
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Install dependencies
run: |
sudo apt update && sudo apt -y install ccache libpcap-dev libbpf-dev tcpreplay
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ matrix.image }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.image }}-ccache
- name: Configure PcapPlusPlus
run: cmake -DPCAPPP_USE_XDP=ON -DPCAPPP_BUILD_COVERAGE=ON -S . -B $BUILD_DIR
- name: Build PcapPlusPlus
run: cmake --build $BUILD_DIR -j
- name: Prepare environment for tests
run: |
python -m venv .venv
. .venv/bin/activate
python -m pip install -r ci/run_tests/requirements.txt
- name: Test PcapPlusPlus
run: |
. .venv/bin/activate
python ci/run_tests/run_tests.py --interface eth0 --use-sudo --pcap-test-args="-t xdp" --build-dir "$BUILD_DIR"
- name: Create Cobertura Report
run: |
python -m pip install gcovr
gcovr -v -r . $GCOVR_FLAGS -o coverage.xml
- name: Upload Coverage Results
uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
with:
files: ./coverage.xml
flags: xdp,unittest
fail_ci_if_error: false
verbose: true
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
test_regressions:
name: Run ${{ matrix.engine }}-${{ matrix.sanitizer }} fuzzer for regressions
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
sanitizer: [address, undefined, memory]
engine: [libfuzzer]
container:
image: gcr.io/oss-fuzz-base/base-builder
steps:
- name: Checkout code
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Install prerequisites
run: |
apt-get update && apt-get install -y autoconf bison ccache cmake flex
cd ..
cp -r PcapPlusPlus/ $SRC/PcapPlusPlus
git clone --depth=1 https://github.com/the-tcpdump-group/libpcap.git $SRC/libpcap
cd $SRC/PcapPlusPlus/
- name: Restore Ccache
id: ccache-restore
uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ matrix.engine }}-${{ matrix.sanitizer }}-ccache-${{ github.run_id }}
restore-keys: |
${{ matrix.engine }}-${{ matrix.sanitizer }}-ccache
- name: Compile PcapPlusPlus Fuzzer application
run: |
export FUZZING_LANGUAGE=c
export ARCHITECTURE=x86_64
export FUZZING_ENGINE=${{ matrix.engine }}
export SANITIZER=${{ matrix.sanitizer }}
$SRC/PcapPlusPlus/Tests/Fuzzers/ossfuzz.sh
- name: Check for regressions
run: |
export BINARY="$OUT/FuzzTarget"
export SAMPLES="Tests/Fuzzers/RegressionTests/regression_samples"
Tests/Fuzzers/RegressionTests/run_tests.sh
- name: Save Ccache
uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}