621e8895c9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
102 lines
3.7 KiB
Bash
102 lines
3.7 KiB
Bash
#!/usr/bin/env bash
|
|
# Tests para wg_status
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/wg_status.sh"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
assert_contains() {
|
|
local test_name="$1" needle="$2" haystack="$3"
|
|
if echo "$haystack" | grep -qF "$needle"; then
|
|
echo "PASS: $test_name"
|
|
PASS=$((PASS+1))
|
|
else
|
|
echo "FAIL: $test_name — expected to contain '$needle'"
|
|
echo " got: $haystack"
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
}
|
|
|
|
assert_not_contains() {
|
|
local test_name="$1" needle="$2" haystack="$3"
|
|
if ! echo "$haystack" | grep -qF "$needle"; then
|
|
echo "PASS: $test_name"
|
|
PASS=$((PASS+1))
|
|
else
|
|
echo "FAIL: $test_name — expected NOT to contain '$needle'"
|
|
echo " got: $haystack"
|
|
FAIL=$((FAIL+1))
|
|
fi
|
|
}
|
|
|
|
# --- fixtures ---
|
|
FAKE_DUMP=$(mktemp)
|
|
FAKE_DUMP_EMPTY=$(mktemp)
|
|
FAKE_CONF=$(mktemp)
|
|
trap 'rm -f "$FAKE_DUMP" "$FAKE_DUMP_EMPTY" "$FAKE_CONF"' EXIT
|
|
|
|
NOW=$(date +%s)
|
|
HS_ONLINE=$(( NOW - 60 )) # 60s ago → online
|
|
HS_STALE=$(( NOW - 500 )) # 500s ago → stale
|
|
|
|
# dump con 2 peers (tabs como separador)
|
|
printf '%s\n' \
|
|
"privKeyBase64== ifacePubKey== 51820 off" \
|
|
"peerKey1== (none) 1.2.3.4:54321 10.42.0.10/32 ${HS_ONLINE} 12345 67890 25" \
|
|
"peerKey2== (none) 5.6.7.8:12345 10.42.0.20/32 ${HS_STALE} 111 222 0" \
|
|
> "$FAKE_DUMP"
|
|
|
|
# dump vacío (solo línea de interface, sin peers)
|
|
printf '%s\n' "privKeyBase64== ifacePubKey== 51820 off" > "$FAKE_DUMP_EMPTY"
|
|
|
|
# conf con DeviceID comments
|
|
cat > "$FAKE_CONF" <<'CONF'
|
|
[Interface]
|
|
PrivateKey = privKeyBase64==
|
|
Address = 10.42.0.1/24
|
|
ListenPort = 51820
|
|
|
|
# DeviceID:pc-aurgi
|
|
[Peer]
|
|
PublicKey = peerKey1==
|
|
AllowedIPs = 10.42.0.10/32
|
|
|
|
# DeviceID:home-wsl
|
|
[Peer]
|
|
PublicKey = peerKey2==
|
|
AllowedIPs = 10.42.0.20/32
|
|
CONF
|
|
|
|
# --- Test: interface con 2 peers online y stale ---
|
|
result=$(WG_FAKE_DUMP="$FAKE_DUMP" WG_FAKE_CONF="$FAKE_CONF" wg_status wg0)
|
|
assert_contains "interface con 2 peers online y stale" '"interface":"wg0"' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"listen_port":51820' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"public_key":"ifacePubKey=="' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"status":"online"' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"status":"stale"' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"device_id":"pc-aurgi"' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"device_id":"home-wsl"' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"rx_bytes":12345' "$result"
|
|
assert_contains "interface con 2 peers online y stale" '"persistent_keepalive":25' "$result"
|
|
|
|
# --- Test: interface sin peers devuelve array vacio ---
|
|
result_empty=$(WG_FAKE_DUMP="$FAKE_DUMP_EMPTY" WG_FAKE_CONF="$FAKE_CONF" wg_status wg0)
|
|
assert_contains "interface sin peers devuelve array vacio" '"peers":[]' "$result_empty"
|
|
assert_not_contains "interface sin peers devuelve array vacio" '"error"' "$result_empty"
|
|
|
|
# --- Test: interface inexistente devuelve error JSON ---
|
|
result_err=$(wg_status nonexistent_iface_xyz 2>/dev/null || true)
|
|
assert_contains "interface inexistente devuelve error JSON" '"error"' "$result_err"
|
|
|
|
# --- Test: WG_FAKE_DUMP carga dump de archivo ---
|
|
result_fake=$(WG_FAKE_DUMP="$FAKE_DUMP" WG_FAKE_CONF="$FAKE_CONF" wg_status wg0)
|
|
assert_contains "WG_FAKE_DUMP carga dump de archivo" '"public_key":"ifacePubKey=="' "$result_fake"
|
|
assert_contains "WG_FAKE_DUMP carga dump de archivo" '"peers":[{' "$result_fake"
|
|
|
|
echo "---"
|
|
echo "Results: $PASS passed, $FAIL failed"
|
|
[[ $FAIL -eq 0 ]] || exit 1
|