77 lines
3.0 KiB
Bash
77 lines
3.0 KiB
Bash
#!/usr/bin/env bash
|
|
# Regression harness for ci-wait.sh terminal-state aggregation and exit codes.
|
|
#
|
|
# ci-wait.sh wraps pipeline-status.sh and blocks until every requested pipeline
|
|
# reaches a terminal Woodpecker state, then maps the aggregate to an exit code.
|
|
# That contract is what callers arm a Monitor/timed-fallback around, so it must be
|
|
# exact. This harness drives ci-wait.sh against a stub pipeline-status.sh whose
|
|
# per-pipeline status is fixture-controlled, and asserts the full exit matrix:
|
|
#
|
|
# 0 = every pipeline terminal AND all 'success'
|
|
# 1 = every pipeline terminal, at least one non-success
|
|
# 2 = usage/precondition error (missing -n)
|
|
# 3 = timeout before all pipelines terminal
|
|
#
|
|
# Non-vacuity: each case pins a DISTINCT exit code to a distinct fixture, so a
|
|
# regression in success-aggregation (case 0 vs 1), terminal detection (case 3),
|
|
# or arg validation (case 2) flips exactly one assertion RED.
|
|
|
|
set -euo pipefail
|
|
|
|
CIW_SRC="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/ci-wait.sh"
|
|
WORK_DIR="${MOSAIC_TEST_WORK_DIR:-$PWD/.mosaic-test-work/ci-wait-exit-matrix}"
|
|
TOOL_DIR="$WORK_DIR/tool"
|
|
|
|
rm -rf "$WORK_DIR"
|
|
mkdir -p "$TOOL_DIR"
|
|
|
|
# ci-wait.sh resolves pipeline-status.sh as a sibling ($SCRIPT_DIR/pipeline-status.sh),
|
|
# so we run a COPY of ci-wait.sh next to a stub sibling we control.
|
|
cp "$CIW_SRC" "$TOOL_DIR/ci-wait.sh"
|
|
chmod +x "$TOOL_DIR/ci-wait.sh"
|
|
|
|
# Stub pipeline-status.sh: emits {"status":"<s>"} where <s> comes from env
|
|
# CIW_STATUS_<num> (default "running" = non-terminal, drives the timeout path).
|
|
cat > "$TOOL_DIR/pipeline-status.sh" <<'SH'
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
num=""
|
|
while getopts "r:n:a:f:" opt; do case "$opt" in n) num="$OPTARG" ;; *) : ;; esac; done
|
|
var="CIW_STATUS_${num}"
|
|
printf '{"status":"%s"}\n' "${!var:-running}"
|
|
SH
|
|
chmod +x "$TOOL_DIR/pipeline-status.sh"
|
|
|
|
CIW="$TOOL_DIR/ci-wait.sh"
|
|
|
|
run_expect() { # $1 = expected exit $2 = label ; rest = args
|
|
local want="$1" label="$2"; shift 2
|
|
local rc=0
|
|
"$CIW" "$@" >/dev/null 2>&1 || rc=$?
|
|
if [[ "$rc" -ne "$want" ]]; then
|
|
echo "FAIL [$label]: expected exit $want, got $rc" >&2; exit 1
|
|
fi
|
|
echo "PASS [$label]: exit $rc"
|
|
}
|
|
|
|
# 0 — both pipelines terminal + success
|
|
CIW_STATUS_100=success CIW_STATUS_101=success \
|
|
run_expect 0 "all-success" -r mosaic/stack -n 100 -n 101 -a mosaic -i 1 -t 30
|
|
|
|
# 1 — both terminal, one failure
|
|
CIW_STATUS_100=success CIW_STATUS_101=failure \
|
|
run_expect 1 "terminal-not-success" -r mosaic/stack -n 100 -n 101 -a mosaic -i 1 -t 30
|
|
|
|
# 1 — other terminal non-success states still map to 1 (error/killed)
|
|
CIW_STATUS_100=error CIW_STATUS_101=killed \
|
|
run_expect 1 "terminal-error-killed" -r mosaic/stack -n 100 -n 101 -a mosaic -i 1 -t 30
|
|
|
|
# 3 — a pipeline never reaches terminal state before timeout
|
|
CIW_STATUS_100=success CIW_STATUS_101=running \
|
|
run_expect 3 "timeout-pending" -r mosaic/stack -n 100 -n 101 -a mosaic -i 1 -t 0
|
|
|
|
# 2 — usage error: no -n
|
|
run_expect 2 "usage-missing-n" -r mosaic/stack -a mosaic
|
|
|
|
echo "ALL PASS: test-ci-wait-exit-matrix.sh"
|