penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

tests/run_tests.py

raw ยท 1826 bytes

#!/usr/bin/env python3

import asyncio
import os
import sys

from .support import (
	SkipTest,
	raise_fd_limit,
	run_default_tcp_tinyproxy,
	run_default_udp_tinyproxy,
)
from . import test_tcp_basic
from . import test_tcp_idle_timeout
from . import test_tcp_stress
from . import test_udp_basic
from . import test_haproxy_proxy_v2
from . import test_udp_proxy_v2


TCP_PROXY_TEST_MODULES = [
	test_tcp_basic,
	test_tcp_stress,
]

UDP_PROXY_TEST_MODULES = [
	test_udp_basic,
]

STANDALONE_TEST_MODULES = [
	test_haproxy_proxy_v2,
	test_udp_proxy_v2,
	test_tcp_idle_timeout,
]


async def run_module_tests(module) -> tuple[int, int]:
	passed = 0
	skipped = 0

	for name, test_func in module.TESTS:
		print(f"running {name}...")

		try:
			await test_func()
		except SkipTest as exc:
			skipped += 1
			print(f"skipped {name}: {exc}")
			continue

		passed += 1
		print(f"ok {name}")

	return passed, skipped


async def main_async(proxy_bin: str) -> int:
	os.environ["TINYPROXY_BIN"] = proxy_bin

	fd_limit = int(os.environ.get("FD_LIMIT", "65535"))
	raise_fd_limit(fd_limit)

	passed = 0
	skipped = 0

	async with run_default_tcp_tinyproxy(proxy_bin):
		for module in TCP_PROXY_TEST_MODULES:
			p, s = await run_module_tests(module)
			passed += p
			skipped += s

	async with run_default_udp_tinyproxy(proxy_bin):
		for module in UDP_PROXY_TEST_MODULES:
			p, s = await run_module_tests(module)
			passed += p
			skipped += s

	for module in STANDALONE_TEST_MODULES:
		p, s = await run_module_tests(module)
		passed += p
		skipped += s

	print(f"all tests passed: passed={passed} skipped={skipped}")
	return 0


def main() -> int:
	if len(sys.argv) != 2:
		print(f"usage: {sys.argv[0]} tinyproxy", file=sys.stderr)
		return 2

	return asyncio.run(main_async(sys.argv[1]))


if __name__ == "__main__":
	raise SystemExit(main())