hugin/scripts/csp-test.sh
2026-10-27 08:33:21 +01:00

27 lines
1.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# Prüft das CSS-Framework unter der strengen CSP von Hugin (→ KONZEPT.md 16.4):
# zählt CSP-Verstöße der Demo und klickt alle data-action-Aktionen durch.
# Braucht Google Chrome (headless).
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
CH="${CHROME:-/Applications/Google Chrome.app/Contents/MacOS/Google Chrome}"
PORT="${PORT:-8813}"
PROFILE="$(mktemp -d)"
python3 -I "$ROOT/scripts/csp/server.py" "$ROOT/static/css-framework/${FOLDER:-.}" "$PORT" 1 "$ROOT/scripts/csp/actions.js" &
SERVER=$!
# Rückgabewert des Tests bewahren; wait auf den beendeten Server würde ihn überschreiben
trap 'rc=$?; kill $SERVER 2>/dev/null; wait $SERVER 2>/dev/null || true; rm -rf "$PROFILE"; exit $rc' EXIT
sleep 1
# Chrome endet nach dem Zeitbudget mit 143; bewertet wird nur die ausgegebene Seite
"$CH" --headless=new --disable-gpu --user-data-dir="$PROFILE" --virtual-time-budget=6000 \
--dump-dom "http://127.0.0.1:$PORT/index.html" >"$PROFILE/page.html" 2>/dev/null || true
python3 -I -c '
import html, re, sys
t = sys.stdin.read()
failed = 0
for part in ("actions", "csp-result"):
m = re.search(r"<pre id=\"" + part + r"\">(.*?)</pre>", t, re.S)
text = html.unescape(m.group(1)) if m else part + ": kein Ergebnis"
print(text)
failed += (not m) or ("FEHL" in text) or (part == "csp-result" and not text.startswith("VIOLATIONS 0"))
sys.exit(1 if failed else 0)' <"$PROFILE/page.html"