|
1 | 1 | #!/usr/bin/env bash |
2 | 2 | set -euo pipefail |
3 | 3 |
|
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". |
6 | 7 |
|
7 | 8 | ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd) |
8 | 9 | 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} |
9 | 13 |
|
10 | 14 | 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 |
35 | 22 | 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