#!/usr/bin/env bash set -euo pipefail repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" scratch_root=/var/tmp/pufferpanel-fork/valheim-ingress-klops install -d -m 0700 "$scratch_root" work="$(mktemp -d "$scratch_root/test.XXXXXX")" trap 'rm -rf -- "$work"' EXIT mkdir -p "$work/bin" chmod 0700 "$work" cat >"$work/owner.env" <<'ENV' PUFFER_OWNER_EMAIL=owner@example.test PUFFER_OWNER_PASSWORD=test-password PUFFER_OWNER_URL=https://games.bugabinga.net ENV chmod 0600 "$work/owner.env" cat >"$work/bin/firewall-cmd" <<'MOCK' #!/usr/bin/env bash printf 'firewall-cmd %s\n' "$*" >>"$VALHEIM_TEST_LOG" case " $* " in *' --get-zone-of-interface=wg0 '*) printf 'public\n' ;; *' --query-rich-rule='*) exit 1 ;; esac MOCK cat >"$work/bin/ssh" <<'MOCK' #!/usr/bin/env bash printf 'ssh %s\n' "$*" >>"$VALHEIM_TEST_LOG" if [[ "$*" == *'bash -s -- 10.100.0.2 fd00:100::2'* ]]; then bash -s -- 10.100.0.2 fd00:100::2 else cat >/dev/null fi MOCK cat >"$work/bin/curl" <<'MOCK' #!/usr/bin/env bash printf 'curl %s\n' "$*" >>"$VALHEIM_TEST_LOG" url="${!#}" case "$url" in */auth/login|*/auth/logout) ;; */definition) if [[ " $* " == *' -X PUT '* ]]; then for arg in "$@"; do if [[ "$arg" = @* ]]; then cp -- "${arg#@}" "$VALHEIM_TEST_PUT" fi done elif [[ "$VALHEIM_FIXTURE" = desired ]]; then printf '%s\n' '{"name":"Valheim","environment":{"portBindings":["10.100.0.2:2456:2456/udp","[fd00:100::2]:2456:2456/udp","10.100.0.2:2457:2457/udp","[fd00:100::2]:2457:2457/udp"]},"limits":{"memory":1}}' else printf '%s\n' '{"name":"Valheim","environment":{"portBindings":["0.0.0.0:2456:2456/udp"]},"limits":{"memory":1},"variables":{"world":"preserve-me"}}' fi ;; */status) count_file="$VALHEIM_TEST_LOG.status" count=0 [[ -f "$count_file" ]] && count="$(<"$count_file")" count=$((count + 1)) printf '%s' "$count" >"$count_file" case "$VALHEIM_FIXTURE:$count" in poll_failure:1) printf '%s\n' '{"running":true,"installing":false}' ;; poll_failure:*) exit 22 ;; installing:*) printf '%s\n' '{"running":true,"installing":true}' ;; stopped:*) printf '%s\n' '{"running":false,"installing":false}' ;; normal:1) printf '%s\n' '{"running":true,"installing":false}' ;; normal:2) printf '%s\n' '{"running":false,"installing":false}' ;; normal:*) printf '%s\n' '{"running":true,"installing":false}' ;; desired:*) printf '%s\n' '{"running":false,"installing":false}' ;; esac ;; esac MOCK chmod +x "$work/bin"/* export PATH="$work/bin:$PATH" export VALHEIM_TEST_LOG="$work/log" export PUFFER_OWNER_ENV="$work/owner.env" export VALHEIM_TEST_PUT="$work/put.json" run() { "$repo_root/scripts/local/deploy-valheim-klops.sh" klops.example.test 22 10.100.0.2 fd00:100::2 } reset() { : >"$work/log" rm -f -- "$work/log.status" "$work/put.json" } reset export VALHEIM_FIXTURE=normal run jq -e '.limits.memory == 1 and .variables.world == "preserve-me" and .environment.portBindings == ["10.100.0.2:2456:2456/udp", "[fd00:100::2]:2456:2456/udp", "10.100.0.2:2457:2457/udp", "[fd00:100::2]:2457:2457/udp"]' "$work/put.json" >/dev/null grep -F -- '/stop' "$work/log" >/dev/null if grep -F -- '/stop?wait=' "$work/log" >/dev/null; then exit 1; fi grep -F -- '/start' "$work/log" >/dev/null reset export VALHEIM_FIXTURE=stopped run if grep -E -- '/stop|/start' "$work/log" >/dev/null; then exit 1; fi [[ -f "$work/put.json" ]] reset export VALHEIM_FIXTURE=desired run if grep -E -- '/stop|/start|-X PUT' "$work/log" >/dev/null; then exit 1; fi [[ "$(grep -Fc -- '--add-rich-rule=rule family=ipv4 destination address=10.100.0.2 port port=2456-2457 protocol=udp accept' "$work/log")" -eq 2 ]] [[ "$(grep -Fc -- '--add-rich-rule=rule family=ipv6 destination address=fd00:100::2 port port=2456-2457 protocol=udp accept' "$work/log")" -eq 2 ]] reset export VALHEIM_FIXTURE=installing if run; then echo 'expected installing server to refuse reconciliation' >&2 exit 1 fi if grep -E -- '/stop|/start|-X PUT' "$work/log" >/dev/null; then exit 1; fi reset export VALHEIM_FIXTURE=poll_failure if run; then echo 'expected status request failure while polling to fail closed' >&2 exit 1 fi if grep -E -- '-X PUT|/start' "$work/log" >/dev/null; then exit 1; fi printf '%s\n' 'Valheim klops mocks verify firewall reconciliation, fail-closed status polling, installing refusal, stopped preservation, binding no-op, and running stop-backup-update-restart'