tests/test_udp_proxy_v2.py
raw ยท 2254 bytes
import asyncio
import os
from .support import (
LISTEN_HOST,
PROXY_PORT,
SkipTest,
run_tinyproxy_with_conf,
run_udp_proxy_v2_echo_backend,
udp_proxy_roundtrip,
)
UDP_PROXY_V2_BACKEND_PORT = 41234
async def test_tinyproxy_sends_proxy_v2_for_udp() -> None:
proxy_bin = os.environ.get("TINYPROXY_BIN")
if not proxy_bin:
raise SkipTest("TINYPROXY_BIN is not set")
conf_text = (
f"listen"
f" udp {LISTEN_HOST}:{PROXY_PORT} "
f" udp {LISTEN_HOST}:{UDP_PROXY_V2_BACKEND_PORT} "
f" proxy_v2\n"
)
async with run_udp_proxy_v2_echo_backend(
LISTEN_HOST,
UDP_PROXY_V2_BACKEND_PORT,
) as backend:
async with run_tinyproxy_with_conf(
proxy_bin=proxy_bin,
conf_text=conf_text,
listen_host=LISTEN_HOST,
listen_port=PROXY_PORT,
proto="udp",
):
payload = b"hello udp proxy v2\n"
try:
got = await udp_proxy_roundtrip(payload, timeout=3.0)
except TimeoutError as exc:
raw = backend.last_raw.hex(" ") if backend.last_raw else "<none>"
raise AssertionError(
"timed out waiting for UDP proxy-v2 echo; "
f"backend_error={backend.error!r}; "
f"backend_last_src={backend.last_src!r}; "
f"backend_last_dst={backend.last_dst!r}; "
f"backend_raw={raw}"
) from exc
raw = backend.last_raw.hex(" ") if backend.last_raw else "<none>"
assert backend.error is None, (
f"backend failed to parse PROXY v2: {backend.error!r}; raw={raw}"
)
assert got == payload, (
f"udp proxy-v2 roundtrip mismatch: got={got!r} expected={payload!r}; "
f"backend_raw={raw}"
)
assert backend.last_src is not None, (
f"backend did not record PROXY v2 source; raw={raw}"
)
assert backend.last_dst is not None, (
f"backend did not record PROXY v2 destination; raw={raw}"
)
assert backend.last_src[0] == LISTEN_HOST, (
f"bad proxy-v2 src addr: got={backend.last_src!r}; raw={raw}"
)
assert backend.last_dst[0] == LISTEN_HOST, (
f"bad proxy-v2 dst addr: got={backend.last_dst!r}; raw={raw}"
)
assert backend.last_dst[1] == PROXY_PORT, (
f"bad proxy-v2 dst port: got={backend.last_dst!r}; "
f"expected_port={PROXY_PORT}; raw={raw}"
)
TESTS = [
("test_tinyproxy_sends_proxy_v2_for_udp", test_tinyproxy_sends_proxy_v2_for_udp),
]