clusev/docker/wg/serve-request.test.sh

50 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Smoke test for the WireGuard write-bridge handler (clusev-wg.sh serve-request).
#
# Regression guard for two timeout bugs: under `set -euo pipefail` the handler MUST always reach
# _write_result and write run/wg-result-<id>.json — otherwise the dashboard waits ~30s and shows
# "Keine Antwort vom Host". Two ways it used to die before writing a result:
# 1. a non-matching field-extraction grep (e.g. an empty/absent endpoint) failing the pipeline;
# 2. an action helper calling require_setup -> die (exit) on a not-yet-configured tunnel.
# This test drives every action with minimal/empty-field payloads and asserts a result file appears.
# It does NOT need root or a real WireGuard install — failures are fine, a missing REPLY is not.
#
# Run: bash docker/wg/serve-request.test.sh
set -euo pipefail
here="$(cd "$(dirname "$0")" && pwd)"
work="$(mktemp -d)"
trap 'rm -rf "$work"' EXIT
mkdir -p "$work/run"
# Root-bypassed copy: neutralise need_root so the handler runs unprivileged in a temp CLUSEV_DIR.
sed 's/^need_root()/_test_need_root()/; s/^ need_root serve-request/ :/' "$here/clusev-wg.sh" > "$work/clusev-wg.sh"
reqs=(
'{"id":"SETUPEMPTYENDP0001","action":"setup","at":1,"subnet":"10.99.0.0/24","port":"51820","endpoint":"","name":"client-1"}'
'{"id":"ADDPEERMINIMAL0002","action":"add-peer","at":1,"name":"laptop"}'
'{"id":"REMOVEPEERMINI0003","action":"remove-peer","at":1,"name":"laptop"}'
'{"id":"GATEUPNOFIELDS0004","action":"gate-up","at":1}'
'{"id":"GATEDOWNNOFLDS0005","action":"gate-down","at":1}'
'{"id":"GATESSHONNOFLD0006","action":"gate-ssh-on","at":1}'
'{"id":"GATESSHOFFNOFL0007","action":"gate-ssh-off","at":1}'
'{"id":"SETENDPOINTONL0008","action":"set-endpoint","at":1,"endpoint":"1.2.3.4:51820"}'
'{"id":"SETPORTONLYFLD0009","action":"set-port","at":1,"port":"51821"}'
'{"id":"SETSUBNETONLYF0010","action":"set-subnet","at":1,"subnet":"10.98.0.0/24"}'
)
fail=0
for req in "${reqs[@]}"; do
rm -f "$work/run/"wg-result-*.json "$work/run/wg-request.json"
printf '%s\n' "$req" > "$work/run/wg-request.json"
CLUSEV_DIR="$work" bash "$work/clusev-wg.sh" serve-request >/dev/null 2>&1 || true
act="$(printf '%s' "$req" | grep -oE '"action":"[a-z-]+"' | sed 's/.*://; s/"//g')"
if ls "$work/run/"wg-result-*.json >/dev/null 2>&1; then
printf ' ok %-13s wrote a result\n' "$act"
else
printf ' FAIL %-13s NO result (would time out)\n' "$act"; fail=1
fi
done
if [ "$fail" = 0 ]; then echo "PASS — every action writes a result"; else echo "FAILED"; exit 1; fi