Files
pcre2/maint/RunCoverage
2025-09-26 07:23:58 +01:00

86 lines
2.6 KiB
Bash
Executable File

#! /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