#!/bin/sh # script/test: run the test suite. Quiet on success; on failure, rerun # verbosely for full diagnostic output (the exit 1 ensures the rerun # never turns a failure into a pass). set -eu ROOT="$(cd "$(dirname "$0")/.." && pwd -P)" # The flags live in one function so the quiet run and the verbose rerun # below cannot drift apart. A rerun that used different flags would # diagnose a different program than the one that failed. # # -count=1 is the documented way to bypass Go's test result cache, and # it is not optional here. Without it, a package whose inputs are # unchanged prints `ok (cached)`, and that line is # indistinguishable -- to every check this repo performs -- from a # package that actually ran. The whole suite reports its full set of # `ok` lines in under half a second having executed nothing. That # matters beyond the local inner loop: the Dockerfile's `RUN make test` # is forced to re-execute by CHECK_EPOCH, but a GOCACHE baked into an # earlier image layer survives into the re-executed step, so the step # can re-run and still do no work. It is applied unconditionally rather # than only in the containerised path because the pre-commit hook runs # this same script; a gate that is honest only in CI is dishonest # exactly where people lean on it most. # # -timeout is a hang backstop, not a performance budget: its job is to # turn a deadlocked test into a stack dump instead of a wedged CI job, # so it wants to sit far above the slowest legitimate runtime, not just # above it. It is per test binary and covers test execution only -- the # clock starts inside testing.M.Run, after compilation and linking, so # build time is not charged against it. (Measured: a containerised run # with an empty GOCACHE reports per-package durations within noise of a # warm host run. A shell `timeout 30 go test ./...` would include # compilation, but that is a different mechanism from this flag.) The # slowest packages are internal/database and internal/vaultik, measured # between 6.4s and 8.1s under -race, the high end being a cold # containerised run on a contended host. Against that 8.1s worst case # 30s left only 3.7x headroom, thin for a loaded or throttled CI # runner; 120s leaves about 15x while still bounding a hung package -- # including the verbose rerun below -- to a few minutes. run_tests() { go test -race -timeout 120s -count=1 "$@" ./... } main() { cd "$ROOT" run_tests || { echo "--- Rerunning with -v for details ---" run_tests -v exit 1 } } main "$@"