test: add end-to-end integration script
This commit is contained in:
Executable
+96
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# prx integration test.
|
||||
#
|
||||
# Exercises the real nftables and policy-routing layer on the local host:
|
||||
# on -> assert rules exist -> on again (idempotent) -> off -> assert clean.
|
||||
#
|
||||
# The proxy engine is skipped (--skip-engine) so this does not require sing-box.
|
||||
# Run it with root, e.g.:
|
||||
#
|
||||
# sudo -E PRX_BIN="$PWD/bin/prx" ./scripts/integration-test.sh
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
BIN="${PRX_BIN:-$(pwd)/bin/prx}"
|
||||
|
||||
if [[ ! -x "$BIN" ]]; then
|
||||
echo "prx binary not found at $BIN (build it first: make build)" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ "${EUID}" -ne 0 ]]; then
|
||||
echo "this test needs root; re-run with sudo -E $0" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TMP="$(mktemp -d)"
|
||||
CONFIG="$TMP/config.json"
|
||||
STATE="$TMP/state.json"
|
||||
|
||||
cat >"$CONFIG" <<EOF
|
||||
{
|
||||
"state": { "path": "$STATE" }
|
||||
}
|
||||
EOF
|
||||
|
||||
PRX=("$BIN" --config "$CONFIG")
|
||||
|
||||
cleanup() {
|
||||
echo "--- cleanup ---"
|
||||
"${PRX[@]}" off >/dev/null 2>&1 || true
|
||||
rm -rf "$TMP"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
pass() { echo " ok: $1"; }
|
||||
fail() { echo " FAIL: $1" >&2; exit 1; }
|
||||
|
||||
rule_count() {
|
||||
ip rule show | grep -c "fwmark 0x100" || true
|
||||
}
|
||||
|
||||
echo "--- enabling (skip engine) ---"
|
||||
"${PRX[@]}" on --skip-engine
|
||||
|
||||
echo "--- assertions after on ---"
|
||||
nft list table inet prx >/dev/null 2>&1 || fail "nftables table inet prx missing"
|
||||
pass "nftables table inet prx present"
|
||||
|
||||
ip rule show | grep -q "fwmark 0x100 lookup 100" || fail "policy rule missing"
|
||||
pass "policy rule present"
|
||||
|
||||
ip route show table 100 | grep -q "^default via" || fail "table 100 has no default route"
|
||||
pass "table 100 default route present"
|
||||
|
||||
[[ "$(rule_count)" -eq 1 ]] || fail "expected exactly one mark rule, got $(rule_count)"
|
||||
pass "exactly one mark rule"
|
||||
|
||||
echo "--- enabling again (idempotency) ---"
|
||||
"${PRX[@]}" on --skip-engine
|
||||
[[ "$(rule_count)" -eq 1 ]] || fail "duplicate rule after second on ($(rule_count))"
|
||||
pass "no duplicate rule after second on"
|
||||
|
||||
nft list table inet prx | grep -c "meta mark set" >/dev/null || fail "nft rules missing"
|
||||
pass "nft rules intact after re-apply"
|
||||
|
||||
echo "--- status ---"
|
||||
"${PRX[@]}" status
|
||||
|
||||
echo "--- disabling ---"
|
||||
"${PRX[@]}" off
|
||||
|
||||
echo "--- assertions after off ---"
|
||||
if nft list table inet prx >/dev/null 2>&1; then
|
||||
fail "nftables table inet prx still present after off"
|
||||
fi
|
||||
pass "nftables table removed"
|
||||
|
||||
[[ "$(rule_count)" -eq 0 ]] || fail "policy rule still present after off"
|
||||
pass "policy rule removed"
|
||||
|
||||
echo "--- disabling again (idempotency) ---"
|
||||
"${PRX[@]}" off
|
||||
pass "second off succeeded"
|
||||
|
||||
echo
|
||||
echo "ALL INTEGRATION CHECKS PASSED"
|
||||
Reference in New Issue
Block a user