@@ -105,3 +105,67 @@ async def run_websocket_benchmark() -> None:
105105 @benchmark
106106 def _run () -> None :
107107 loop .run_until_complete (run_websocket_benchmark ())
108+
109+
110+ def test_client_send_large_websocket_compressed_messages (
111+ loop : asyncio .AbstractEventLoop ,
112+ aiohttp_client : AiohttpClient ,
113+ benchmark : BenchmarkFixture ,
114+ ) -> None :
115+ """Benchmark send of compressed WebSocket binary messages."""
116+ message_count = 10
117+ raw_message = b"x" * 2 ** 19 # 512 KiB
118+
119+ async def handler (request : web .Request ) -> web .WebSocketResponse :
120+ ws = web .WebSocketResponse ()
121+ await ws .prepare (request )
122+ for _ in range (message_count ):
123+ await ws .receive ()
124+ await ws .close ()
125+ return ws
126+
127+ app = web .Application ()
128+ app .router .add_route ("GET" , "/" , handler )
129+
130+ async def run_websocket_benchmark () -> None :
131+ client = await aiohttp_client (app )
132+ resp = await client .ws_connect ("/" , compress = 15 )
133+ for _ in range (message_count ):
134+ await resp .send_bytes (raw_message )
135+ await resp .close ()
136+
137+ @benchmark
138+ def _run () -> None :
139+ loop .run_until_complete (run_websocket_benchmark ())
140+
141+
142+ def test_client_receive_large_websocket_compressed_messages (
143+ loop : asyncio .AbstractEventLoop ,
144+ aiohttp_client : AiohttpClient ,
145+ benchmark : BenchmarkFixture ,
146+ ) -> None :
147+ """Benchmark receive of compressed WebSocket binary messages."""
148+ message_count = 10
149+ raw_message = b"x" * 2 ** 19 # 512 KiB
150+
151+ async def handler (request : web .Request ) -> web .WebSocketResponse :
152+ ws = web .WebSocketResponse ()
153+ await ws .prepare (request )
154+ for _ in range (message_count ):
155+ await ws .send_bytes (raw_message )
156+ await ws .close ()
157+ return ws
158+
159+ app = web .Application ()
160+ app .router .add_route ("GET" , "/" , handler )
161+
162+ async def run_websocket_benchmark () -> None :
163+ client = await aiohttp_client (app )
164+ resp = await client .ws_connect ("/" , compress = 15 )
165+ for _ in range (message_count ):
166+ await resp .receive ()
167+ await resp .close ()
168+
169+ @benchmark
170+ def _run () -> None :
171+ loop .run_until_complete (run_websocket_benchmark ())
0 commit comments