penguin/tinyproxy

An L4 proxy designed to act as a tiny transparent shim

tests/test_tcp_stress.py

raw ยท 1045 bytes

import asyncio
import os

from .support import proxy_roundtrip


async def run_one_concurrent(
	i: int,
	payload_size: int,
	sem: asyncio.Semaphore,
) -> None:
	async with sem:
		prefix = f"worker-{i}-".encode()
		payload = (prefix * ((payload_size // len(prefix)) + 1))[:payload_size]

		got = await proxy_roundtrip(payload, timeout=30.0)

		if got != payload:
			raise AssertionError(
				f"worker {i} mismatch: expected {len(payload)} bytes, got {len(got)}"
			)


async def test_concurrent_connections() -> None:
	total = int(os.environ.get("TOTAL", "10000"))
	concurrency = int(os.environ.get("CONCURRENCY", "10000"))
	payload_size = int(os.environ.get("PAYLOAD_SIZE", "1024"))

	sem = asyncio.Semaphore(concurrency)

	tasks = [
		asyncio.create_task(run_one_concurrent(i, payload_size, sem))
		for i in range(total)
	]

	done = 0

	for task in asyncio.as_completed(tasks):
		await task
		done += 1

		if done % 1000 == 0:
			print(f"  completed {done}/{total}")


TESTS = [
	("test_concurrent_connections", test_concurrent_connections),
]