Skip to content

Commit 49319ca

Browse files
committed
tools(coverage): make default report project-wide and strict
1 parent 5953763 commit 49319ca

1 file changed

Lines changed: 50 additions & 26 deletions

File tree

tools/coverage.sh

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,59 @@
11
#!/usr/bin/env bash
22
set -euo pipefail
33

4-
# Simple coverage runner for protocol code paths.
5-
# Defaults to P25 + DMR. Requires lcov/genhtml or llvm-cov depending on compiler.
4+
# Coverage runner for repository sources.
5+
# Defaults to a clean project-wide src/ report. For the old protocol-only slice,
6+
# run with COVERAGE_SCOPE=protocol and optionally set PROTO_COVERAGE="p25 dmr nxdn".
67

78
ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd)
89
BUILD_DIR="$ROOT_DIR/build/coverage-debug"
10+
BUILD_PRESET=${BUILD_PRESET:-coverage-debug-clean}
11+
TEST_PRESET=${TEST_PRESET:-coverage-debug}
12+
COVERAGE_SCOPE=${COVERAGE_SCOPE:-src}
913

1014
cmake --preset coverage-debug >/dev/null
11-
cmake --build --preset coverage-debug -j >/dev/null
12-
ctest --preset coverage-debug -V || true
13-
14-
if command -v lcov >/dev/null 2>&1; then
15-
echo "Generating lcov report..."
16-
pushd "$BUILD_DIR" >/dev/null
17-
lcov --capture --directory . --output-file coverage.info >/dev/null 2>&1 || true
18-
# Filter to protocol sources (default: P25 + DMR). Override with PROTO_COVERAGE="p25 dmr nxdn" etc.
19-
PROTO_COVERAGE=${PROTO_COVERAGE:-"p25 dmr"}
20-
EXTRACT_ARGS=()
21-
for proto in $PROTO_COVERAGE; do
22-
EXTRACT_ARGS+=("${ROOT_DIR}/src/protocol/${proto}/*")
23-
done
24-
# Always include shared DMR/P25 FEC helpers if present
25-
EXTRACT_ARGS+=("${ROOT_DIR}/src/fec/*")
26-
lcov --extract coverage.info "${EXTRACT_ARGS[@]}" -o coverage.filtered.info >/dev/null 2>&1 || true
27-
genhtml coverage.filtered.info --output-directory coverage_html >/dev/null 2>&1 || true
28-
popd >/dev/null
29-
echo "Coverage HTML: $BUILD_DIR/coverage_html/index.html"
30-
else
31-
echo "lcov not found. For clang/llvm, run llvm-cov manually, e.g.:"
32-
echo " PROTO_COVERAGE=\"p25 dmr\" cmake --preset coverage-debug && cmake --build --preset coverage-debug && ctest --preset coverage-debug -V"
33-
echo " llvm-profdata merge -sparse *.profraw -o default.profdata"
34-
echo " llvm-cov show ./tests/dsd-neo_test_dmr_crc_props -format=html -instr-profile=default.profdata > coverage.html"
15+
cmake --build --preset "$BUILD_PRESET" -j >/dev/null
16+
ctest --preset "$TEST_PRESET" --output-on-failure
17+
18+
if ! command -v lcov >/dev/null 2>&1 || ! command -v genhtml >/dev/null 2>&1; then
19+
echo "lcov/genhtml are required for tools/coverage.sh." >&2
20+
echo "Install lcov, or run an explicit llvm-cov flow manually." >&2
21+
exit 1
3522
fi
23+
24+
echo "Generating lcov report..."
25+
pushd "$BUILD_DIR" >/dev/null
26+
lcov --capture --directory . --output-file coverage.info >/dev/null
27+
28+
case "$COVERAGE_SCOPE" in
29+
src|project)
30+
REPORT_NAME="coverage.src.info"
31+
REPORT_DIR="coverage_html"
32+
REPORT_LABEL="project src/"
33+
lcov --extract coverage.info "${ROOT_DIR}/src/*" -o "$REPORT_NAME" >/dev/null
34+
;;
35+
protocol)
36+
REPORT_NAME="coverage.protocol.info"
37+
REPORT_DIR="coverage_protocol_html"
38+
PROTO_COVERAGE=${PROTO_COVERAGE:-"p25 dmr"}
39+
REPORT_LABEL="protocol slice (${PROTO_COVERAGE}) + fec"
40+
EXTRACT_ARGS=()
41+
for proto in $PROTO_COVERAGE; do
42+
EXTRACT_ARGS+=("${ROOT_DIR}/src/protocol/${proto}/*")
43+
done
44+
EXTRACT_ARGS+=("${ROOT_DIR}/src/fec/*")
45+
lcov --extract coverage.info "${EXTRACT_ARGS[@]}" -o "$REPORT_NAME" >/dev/null
46+
;;
47+
*)
48+
echo "Unknown COVERAGE_SCOPE: $COVERAGE_SCOPE" >&2
49+
echo "Expected one of: src, project, protocol" >&2
50+
exit 1
51+
;;
52+
esac
53+
54+
genhtml "$REPORT_NAME" --output-directory "$REPORT_DIR" >/dev/null
55+
printf 'Coverage summary (%s)\n' "$REPORT_LABEL"
56+
lcov --summary "$REPORT_NAME"
57+
popd >/dev/null
58+
59+
echo "Coverage HTML: $BUILD_DIR/$REPORT_DIR/index.html"

0 commit comments

Comments
 (0)