81 lines
2.3 KiB
Bash
Executable File
81 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Requires:
|
|
# rustup component add llvm-tools-preview
|
|
# cargo install cargo-llvm-cov --locked
|
|
|
|
run_out="$(mktemp)"
|
|
text_out="$(mktemp)"
|
|
html_out="$(mktemp)"
|
|
|
|
cleanup() {
|
|
rm -f "$run_out" "$text_out" "$html_out"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
# Preserve colored output even though we post-process output by running under a pseudo-TTY.
|
|
# We run tests only once, then generate both CLI text + HTML reports without rerunning tests.
|
|
set +e
|
|
|
|
cargo llvm-cov clean --workspace >/dev/null 2>&1
|
|
|
|
# 1) Run tests once to collect coverage data (no report).
|
|
script -q -e -c "CARGO_TERM_COLOR=always cargo llvm-cov --no-report" "$run_out" >/dev/null 2>&1
|
|
run_status="$?"
|
|
|
|
# 2) CLI summary report + fail-under gate (no test rerun).
|
|
script -q -e -c "CARGO_TERM_COLOR=always cargo llvm-cov report --fail-under-lines 90" "$text_out" >/dev/null 2>&1
|
|
text_status="$?"
|
|
|
|
# 3) HTML report (no test rerun).
|
|
script -q -e -c "CARGO_TERM_COLOR=always cargo llvm-cov report --html" "$html_out" >/dev/null 2>&1
|
|
html_status="$?"
|
|
|
|
set -e
|
|
|
|
strip_script_noise() {
|
|
tr -d '\r' | sed '/^Script \(started\|done\) on /d'
|
|
}
|
|
|
|
strip_ansi_for_parse() {
|
|
awk '
|
|
{
|
|
line = $0
|
|
gsub(/\033\[[0-9;]*[A-Za-z]/, "", line) # CSI escapes
|
|
gsub(/\033\([A-Za-z]/, "", line) # charset escapes (e.g., ESC(B)
|
|
gsub(/\r/, "", line)
|
|
print line
|
|
}
|
|
'
|
|
}
|
|
|
|
cat "$run_out" | strip_script_noise
|
|
cat "$text_out" | strip_script_noise
|
|
cat "$html_out" | strip_script_noise
|
|
|
|
cat "$run_out" | strip_ansi_for_parse | awk '
|
|
BEGIN {
|
|
passed=0; failed=0; ignored=0; measured=0; filtered=0;
|
|
}
|
|
/^test result: / {
|
|
if (match($0, /([0-9]+) passed; ([0-9]+) failed; ([0-9]+) ignored; ([0-9]+) measured; ([0-9]+) filtered out;/, m)) {
|
|
passed += m[1]; failed += m[2]; ignored += m[3]; measured += m[4]; filtered += m[5];
|
|
}
|
|
}
|
|
END {
|
|
executed = passed + failed;
|
|
total = passed + failed + ignored + measured;
|
|
printf("\nTEST SUMMARY (all suites): passed=%d failed=%d ignored=%d measured=%d filtered_out=%d executed=%d total=%d\n",
|
|
passed, failed, ignored, measured, filtered, executed, total);
|
|
}
|
|
'
|
|
|
|
echo
|
|
echo "HTML report: target/llvm-cov/html/index.html"
|
|
|
|
status="$text_status"
|
|
if [ "$run_status" -ne 0 ]; then status="$run_status"; fi
|
|
if [ "$html_status" -ne 0 ]; then status="$html_status"; fi
|
|
exit "$status"
|