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