diff --git a/tests/test_benchmarks_client_request.py b/tests/test_benchmarks_client_request.py index de019149076..17d4a6cb8c4 100644 --- a/tests/test_benchmarks_client_request.py +++ b/tests/test_benchmarks_client_request.py @@ -2,6 +2,7 @@ import asyncio from http.cookies import Morsel +from typing import Union from pytest_codspeed import BenchmarkFixture from yarl import URL @@ -65,3 +66,46 @@ def _run() -> None: chunked=None, expect100=False, ) + + +def test_send_client_request_one_hundred( + loop: asyncio.AbstractEventLoop, benchmark: BenchmarkFixture +) -> None: + url = URL("http://python.org") + req = ClientRequest("get", url, loop=loop) + + class MockTransport(asyncio.Transport): + """Mock transport for testing that do no real I/O.""" + + def is_closing(self) -> bool: + """Swallow is_closing.""" + return False + + def write(self, data: Union[bytes, bytearray, memoryview]) -> None: + """Swallow writes.""" + + class MockProtocol(asyncio.BaseProtocol): + + def __init__(self) -> None: + self.transport = MockTransport() + + async def _drain_helper(self) -> None: + """Swallow drain.""" + + def start_timeout(self) -> None: + """Swallow start_timeout.""" + + class MockConnection: + def __init__(self) -> None: + self.transport = None + self.protocol = MockProtocol() + + conn = MockConnection() + + async def send_requests() -> None: + for _ in range(100): + await req.send(conn) # type: ignore[arg-type] + + @benchmark + def _run() -> None: + loop.run_until_complete(send_requests())