diff --git a/scripts/orchestra_e2e_healthcheck.sh b/scripts/orchestra_e2e_healthcheck.sh index 284fb27..f6fa7ee 100755 --- a/scripts/orchestra_e2e_healthcheck.sh +++ b/scripts/orchestra_e2e_healthcheck.sh @@ -2,7 +2,67 @@ readonly VERSION=1.0.0 readonly SUCCESS_MESSAGE='OK - all healthchecks passed' -readonly CHECKS=(script-runs) +readonly ROOT=$(cd "$(dirname "$0")/.." && pwd) + +# Space-separated check names; each has a check_ function. +CHECKS="repo_root_readable scripts_dir_present healthcheck_executable_bit +selftest_present test_healthcheck_present readme_present +no_crlf_line_endings no_tabs_in_scripts +shebang_is_bash usage_text_mentions_every_flag" + +# name=ok / name=fail pairs, in run order. +RESULTS= +FAILED=0 +TOTAL=0 + +# record : append one outcome to the results state. +record() { + RESULTS="$RESULTS $1=$2" + TOTAL=$((TOTAL + 1)) + [ "$2" = ok ] || FAILED=$((FAILED + 1)) +} + +check_repo_root_readable() { [ -d "$ROOT" ] && [ -r "$ROOT" ]; } +check_scripts_dir_present() { [ -d "$ROOT/scripts" ]; } +check_healthcheck_executable_bit() { [ -x "$ROOT/scripts/orchestra_e2e_healthcheck.sh" ]; } +check_selftest_present() { [ -f "$ROOT/scripts/orchestra_e2e_selftest.sh" ]; } +check_test_healthcheck_present() { [ -f "$ROOT/scripts/test_healthcheck.sh" ]; } +check_readme_present() { [ -f "$ROOT/README.md" ]; } + +check_no_crlf_line_endings() { + [ -d "$ROOT/scripts" ] || return 1 + ! grep -qU $'\r' "$ROOT"/scripts/*.sh "$ROOT/README.md" 2>/dev/null +} + +check_no_tabs_in_scripts() { + [ -d "$ROOT/scripts" ] || return 1 + ! grep -q "$(printf '\t')" "$ROOT"/scripts/*.sh 2>/dev/null +} + +check_shebang_is_bash() { + [ -d "$ROOT/scripts" ] || return 1 + local f + for f in "$ROOT"/scripts/*.sh; do + [ "$(head -n 1 "$f")" = '#!/usr/bin/env bash' ] || return 1 + done +} + +check_usage_text_mentions_every_flag() { + local text flag + text=$(usage text) + for flag in --quiet --json --help; do + case "$text" in + *"$flag"*) ;; + *) return 1 ;; + esac + done +} + +# now_us: current time in microseconds. Strips any locale decimal separator. +now_us() { printf '%s' "${EPOCHREALTIME//[!0-9]/}"; } + +# elapsed_ms : whole milliseconds since . +elapsed_ms() { printf '%s' "$(( ($(now_us) - $1) / 1000 ))"; } # emit