mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-11-10 21:07:03 +01:00
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). After578c4a6cdropped that, --all is 0.31s and the per-file mode this hook uses is milliseconds, so it goes in. Also fixes a bug578c4a6cintroduced: 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
74 lines
1.7 KiB
Bash
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 ]]
|
|
}
|