| #! /bin/sh | |
| # Script to run tests with coverage and filter the results. | |
| # | |
| # We assume that the source has been configured and built with LLVM's source-based | |
| # coverage instrumentation. | |
| # | |
| # Must be run in the build directory. | |
| set -e | |
| clang_report=0 | |
| nomalloc=0 | |
| while [ $# -gt 0 ] ; do | |
| case $1 in | |
| nomalloc|-nomalloc) nomalloc=1;; | |
| clang|-clang|clang-report|-clang-report) clang_report=1;; | |
| *) echo "Unknown option or test selector '$1'"; exit 1;; | |
| esac | |
| shift | |
| done | |
| LLVM_VER=`clang --version | head -n1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+' | cut -d. -f1` | |
| echo "(Using LLVM version $LLVM_VER)" | |
| echo "" | |
| rm -f coverage-*.profraw coverage.profdata coverage-lcov.info coverage-lcov.filtered.info | |
| [ -d testdata ] || rm -f ../coverage-*.profraw | |
| rm -rf coverage-html | |
| echo "== Running all tests with CTest ==" | |
| LLVM_PROFILE_FILE="coverage-%m.profraw" ctest -j1 --output-on-failure | |
| echo "" | |
| if [ "$nomalloc" -eq 0 ]; then | |
| echo "== Re-running pcre2test with -malloc ==" | |
| LLVM_PROFILE_FILE="coverage-%m.profraw" srcdir=.. pcre2test=./pcre2test ../RunTest -malloc | |
| echo "" | |
| fi | |
| # Merge the profiles gathered | |
| echo "== Merging coverage data ==" | |
| PROF_FILES="coverage-*.profraw" | |
| [ -d testdata ] || PROF_FILES="$PROF_FILES ../coverage-*.profraw" | |
| llvm-profdata-$LLVM_VER merge -sparse $PROF_FILES -o coverage.profdata | |
| echo "" | |
| if [ "$clang_report" -eq 1 ]; then | |
| echo "== Generating Clang coverage report ==" | |
| llvm-cov-$LLVM_VER show \ | |
| -format=html \ | |
| -show-line-counts-or-regions -show-branches=percent \ | |
| -instr-profile=coverage.profdata \ | |
| ./pcre2test -object ./pcre2grep -object ./pcre2posix_test -object ./pcre2_jit_test \ | |
| -sources ../src/ ./ \ | |
| -output-dir=coverage-html | |
| echo "" | |
| else | |
| # Output LCOV-compatible output, for downstream tools | |
| echo "== Generating LCOV report ==" | |
| llvm-cov-$LLVM_VER export \ | |
| -format=lcov \ | |
| -instr-profile=coverage.profdata \ | |
| ./pcre2test -object ./pcre2grep -object ./pcre2posix_test -object ./pcre2_jit_test \ | |
| -sources ../src/ ./ \ | |
| > ./coverage-lcov.info | |
| echo "" | |
| # Filter out lines marked with "LCOV_EXCL_LINE" or "LCOV_EXCL_START"/"LCOV_EXCL_STOP" | |
| echo "== Filtering LCOV report ==" | |
| python3 ../maint/FilterCoverage.py ./coverage-lcov.info > ./coverage-lcov.filtered.info | |
| mv ./coverage-lcov.filtered.info ./coverage-lcov.info | |
| echo "" | |
| # Use genhtml to generate an HTML report from the LCOV data | |
| echo "== Generating HTML report ==" | |
| mkdir -p coverage-html | |
| genhtml \ | |
| --highlight --branch-coverage --legend --title "PCRE2 code coverage report" --num-spaces 2 \ | |
| -o coverage-html ./coverage-lcov.info | |
| echo "" | |
| fi |