diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c29174b8..ddce44aa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,3 +49,15 @@ jobs: - name: Tests run: | pytest + + - name: Test with coverage + if: ${{ startsWith(matrix.os, 'ubuntu') && matrix.python-version == '3.9' }} + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + run: | + pip install -e . + pip install coverage + CFLAGS="--coverage -O0" python setup.py -q build_ext --inplace -f + coverage run -m pytest + ./scripts/coverage.sh + bash <(curl -s https://codecov.io/bash) -X gcov diff --git a/.gitignore b/.gitignore index b7557264..baa466f1 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,9 @@ python/version.h # Docker wheel build pip-cache/ temp-wheels/ + +# gcov coverage files +cov +*.gcov +*.gcda +*.gcno diff --git a/scripts/coverage.sh b/scripts/coverage.sh new file mode 100755 index 00000000..4390ff17 --- /dev/null +++ b/scripts/coverage.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Coverage for ultrajson's C code. +# Usage: +# CFLAGS="--coverage -O0" python setup.py -q build_ext --inplace -f +# pytest +# ./scripts/coverage.sh +# Then inspect the files in the `cov` folder. + +# The exact arguments depend on whether we're using LLVM's gcov or GNU's. +unameOut="$(uname -s)" +case "${unameOut}" in + Linux*) gcov_options=(--relative-only);; + Darwin*) gcov_options=(--color);; + *) echo "Unsupported OS ${unameOut}"; exit 1;; +esac + +# The actual gcov instructions: +gcov "${gcov_options[@]}" python/**.c -o build/temp.*/python +gcov "${gcov_options[@]}" lib/**.c -o build/temp.*/lib + +# gcov dumps everything in the cwd without any option to change this. +# Manually move the .gcov files to a `cov` folder. +mkdir -p cov +rm -rf cov/* +mv ./**.gcov cov || exit 1 + +echo Written gcov files to ./cov