annotate examples/_run_server_child.py @ 12:ba73d8ba81dc default tip

refactor
author drewp@bigasterisk.com
date Mon, 18 Mar 2024 16:51:44 -0700
parents 0bc06da6bf74
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
1 import asyncio
11
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
2 import contextlib
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
3 import logging
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
4 from dataclasses import dataclass
11
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
5 from datetime import timedelta
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
6 from pathlib import Path
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
7
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
8 import aiohttp
11
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
9 from aiohttp_sse_client import client as sse_client
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
10
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
11 log = logging.getLogger('chil')
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
12
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
13
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
14 @dataclass
8
drewp@bigasterisk.com
parents: 6
diff changeset
15 class RunHttpServerChildProcess:
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
16 server_path: Path
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
17
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
18 async def __aenter__(self):
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
19 self.subprocess = await asyncio.create_subprocess_exec(
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
20 'pdm', 'run', 'python', self.server_path)
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
21 self._session = await aiohttp.ClientSession().__aenter__()
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
22 return self
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
23
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
24 async def __aexit__(self, exc_type, exc, tb):
6
d885fce5e4e7 try to reduce warnings about leaked sessions
drewp@bigasterisk.com
parents: 5
diff changeset
25 await self._session.close()
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
26 self.subprocess.terminate()
5
b34cd6619316 new test. server has to be able to exit between tests.
drewp@bigasterisk.com
parents: 3
diff changeset
27 await self.subprocess.wait()
6
d885fce5e4e7 try to reduce warnings about leaked sessions
drewp@bigasterisk.com
parents: 5
diff changeset
28
10
52e1bb1532f2 serve_inline_graph
drewp@bigasterisk.com
parents: 8
diff changeset
29 async def get(self, url: str, headers=None) -> aiohttp.ClientResponse:
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
30 while True:
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
31 try:
10
52e1bb1532f2 serve_inline_graph
drewp@bigasterisk.com
parents: 8
diff changeset
32 return await self._session.get(url, headers=headers)
3
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
33 except aiohttp.ClientConnectorError:
b5afa9363c3b add test helper
drewp@bigasterisk.com
parents:
diff changeset
34 await asyncio.sleep(0.05)
11
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
35
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
36 @contextlib.asynccontextmanager
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
37 async def eventSource(self, url: str):
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
38 async with sse_client.EventSource(
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
39 url, reconnection_time=timedelta(seconds=.05)) as es:
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
40 yield es
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
41
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
42
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
43 async def assert_event_stream_starts_with(http_server, url, expected_events):
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
44 events_left = expected_events[:]
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
45 async with http_server.eventSource(url) as es:
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
46 async for event in es:
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
47 assert (event.message, event.data) == events_left[0]
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
48 events_left.pop(0)
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
49 if not events_left:
0bc06da6bf74 start ferry1 patch protocol
drewp@bigasterisk.com
parents: 10
diff changeset
50 break