testsAndMisc/meta/scripts/lib/tests/coverage_tool_harness.sh
Krzysztof kuhy Rudnicki 46c8f065e8 Wire the shell ratchet into pre-commit, and test the coverage tooling
check_shell_coverage.sh has existed for a while and was never in
.pre-commit-config.yaml, so nothing ran it: a new shell library with no
suite beside it could land freely. Wiring it was unaffordable while the
gate measured a jail-run 100% bar (--all took over 600s). After 578c4a6c
dropped that, --all is 0.31s and the per-file mode this hook uses is
milliseconds, so it goes in.

Also fixes a bug 578c4a6c introduced: the failure path still interpolated
${COVERAGE_BAR}, which that commit deleted, so every rejection printed
"COVERAGE_BAR: unbound variable" and advised a 100% line-coverage bar
that no longer exists. The message now describes what is enforced.

Three libs blocked the wiring -- meta/scripts/lib/shell_coverage_{bar,
case_runner,jail_setup}.sh, the code that BUILDS the jail, and so the one
corner of the repo the jail cannot measure itself. They are pure
file-writers, so they get a suite that calls them against a temp $JAIL
and asserts on what was written: 48 assertions, nothing mounted, no
unshare, no kcov.

Several assertions check that an emitted file contains an UNEXPANDED
${BASH_SOURCE} or $1 -- the whole point of the quoted heredocs the jail
relies on. Written as single-quoted literals that is SC2016 on every
line, so the needles compose the dollar from an exported constant
instead. No suppressions were added.

  check_shell_coverage.sh --all:  3 BLOCK  ->  0 BLOCK
  hook, repo-wide:                0.16s
  new suite:                      48 assertions, green

Proved the ratchet still bites: an untested lib dropped into
mtk_root/lib is refused with "needs: .../tests/run_all.sh". Probe removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJrqKERAo5QUeEHWS5Asgp
2026-08-23 15:51:29 +02:00

74 lines
1.7 KiB
Bash

# shellcheck shell=bash
# lib/tests/coverage_tool_harness.sh — fixture for the shell-coverage tooling.
#
# Sourced, not executed. These three libs are pure file-writers and one
# predicate: given $JAIL (a temp dir) they emit run_cases.sh, cases and
# mounts.sh, and is_covered answers from the filesystem alone. Nothing here
# mounts anything, runs kcov, or needs a namespace -- the jail itself is
# exercised end-to-end by the suites that already run under it.
set -uo pipefail
PASS=0
FAIL=0
_t_pass() {
PASS=$((PASS + 1))
printf ' OK: %s\n' "$1"
}
_t_fail() {
FAIL=$((FAIL + 1))
printf ' FAIL: %s\n' "$1"
}
_t_eq() {
if [[ "$2" == "$1" ]]; then
_t_pass "$3"
else
_t_fail "$3 (want '$1', got '$2')"
fi
}
_t_has() {
if [[ "$1" == *"$2"* ]]; then
_t_pass "$3"
else
_t_fail "$3 (want a substring '$2')"
fi
}
_t_lacks() {
if [[ "$1" != *"$2"* ]]; then
_t_pass "$3"
else
_t_fail "$3 (did not want substring '$2')"
fi
}
# A throwaway $JAIL for one test file, removed on exit. The libs write into it
# unconditionally, so every case needs its own clean directory.
_t_new_jail() {
JAIL="$(mktemp -d -t covtool-XXXXXX)"
export JAIL
mkdir -p "$JAIL/trace"
}
_t_drop_jail() {
if [[ -n "${JAIL:-}" && "$JAIL" == /tmp/covtool-* ]]; then
rm -rf "$JAIL"
fi
}
# The literal dollar sign, built rather than written. Several assertions here
# check that a file contains an UNEXPANDED ${BASH_SOURCE} or $1, and writing
# that as a single-quoted literal trips SC2016 on every line. Composing the
# needle keeps the intent obvious and the file suppression-free.
DOLLAR='$'
export DOLLAR
readonly DOLLAR
_t_summary() {
printf '\n%s: %d passed, %d failed\n' "$(basename "$0")" "$PASS" "$FAIL"
[[ $FAIL -eq 0 ]]
}