-
Notifications
You must be signed in to change notification settings - Fork 160
Expand file tree
/
Copy pathtest_tcp_server.py
More file actions
80 lines (66 loc) · 2.33 KB
/
Copy pathtest_tcp_server.py
File metadata and controls
80 lines (66 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from __future__ import annotations
import asyncio
import errno
import pytest
from hypercorn.app_wrappers import ASGIWrapper
from hypercorn.asyncio.tcp_server import TCPServer
from hypercorn.asyncio.worker_context import WorkerContext
from hypercorn.config import Config
from .helpers import MemoryReader, MemoryWriter
from ..helpers import echo_framework
class UnreachableHostWriter(MemoryWriter):
async def wait_closed(self) -> None:
raise OSError(errno.EHOSTUNREACH, "No route to host")
@pytest.mark.asyncio
async def test_completes_on_closed() -> None:
event_loop: asyncio.AbstractEventLoop = asyncio.get_running_loop()
server = TCPServer(
ASGIWrapper(echo_framework),
event_loop,
Config(),
WorkerContext(None),
{},
MemoryReader(), # type: ignore
MemoryWriter(), # type: ignore
)
server.reader.close() # type: ignore
await server.run()
# Key is that this line is reached, rather than the above line
# hanging.
@pytest.mark.asyncio
async def test_completes_on_unreachable_host_close() -> None:
event_loop: asyncio.AbstractEventLoop = asyncio.get_running_loop()
server = TCPServer(
ASGIWrapper(echo_framework),
event_loop,
Config(),
WorkerContext(None),
{},
MemoryReader(), # type: ignore
UnreachableHostWriter(), # type: ignore
)
server.reader.close() # type: ignore
await server.run()
# Key is that this line is reached, rather than the above line
# raising the OSError from the writer close.
@pytest.mark.asyncio
async def test_complets_on_half_close() -> None:
event_loop: asyncio.AbstractEventLoop = asyncio.get_running_loop()
server = TCPServer(
ASGIWrapper(echo_framework),
event_loop,
Config(),
WorkerContext(None),
{},
MemoryReader(), # type: ignore
MemoryWriter(), # type: ignore
)
task = event_loop.create_task(server.run())
await server.reader.send(b"GET / HTTP/1.1\r\nHost: hypercorn\r\n\r\n") # type: ignore
server.reader.close() # type: ignore
await task
data = await server.writer.receive() # type: ignore
assert (
data
== b"HTTP/1.1 200 \r\ncontent-length: 348\r\ndate: Thu, 01 Jan 1970 01:23:20 GMT\r\nserver: hypercorn-h11\r\n\r\n" # noqa: E501
)