-
-
Notifications
You must be signed in to change notification settings - Fork 695
/
test_utils.py
147 lines (108 loc) · 4.31 KB
/
test_utils.py
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import socket
import time
import pytest
from uvicorn.protocols.utils import (
RequestResponseTiming,
get_client_addr,
get_local_addr,
get_remote_addr,
)
class MockSocket:
def __init__(self, family, peername=None, sockname=None):
self.peername = peername
self.sockname = sockname
self.family = family
def getpeername(self):
return self.peername
def getsockname(self):
return self.sockname
class MockTransport:
def __init__(self, info):
self.info = info
def get_extra_info(self, info_type):
return self.info.get(info_type)
def test_get_local_addr_with_socket():
transport = MockTransport({"socket": MockSocket(family=socket.AF_IPX)})
assert get_local_addr(transport) is None
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_INET6, sockname=("::1", 123))}
)
assert get_local_addr(transport) == ("::1", 123)
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_INET, sockname=("123.45.6.7", 123))}
)
assert get_local_addr(transport) == ("123.45.6.7", 123)
if hasattr(socket, "AF_UNIX"): # pragma: no cover
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_UNIX, sockname=("127.0.0.1", 8000))}
)
assert get_local_addr(transport) == ("127.0.0.1", 8000)
def test_get_remote_addr_with_socket():
transport = MockTransport({"socket": MockSocket(family=socket.AF_IPX)})
assert get_remote_addr(transport) is None
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_INET6, peername=("::1", 123))}
)
assert get_remote_addr(transport) == ("::1", 123)
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_INET, peername=("123.45.6.7", 123))}
)
assert get_remote_addr(transport) == ("123.45.6.7", 123)
if hasattr(socket, "AF_UNIX"): # pragma: no cover
transport = MockTransport(
{"socket": MockSocket(family=socket.AF_UNIX, peername=("127.0.0.1", 8000))}
)
assert get_remote_addr(transport) == ("127.0.0.1", 8000)
def test_get_local_addr():
transport = MockTransport({"sockname": "path/to/unix-domain-socket"})
assert get_local_addr(transport) is None
transport = MockTransport({"sockname": ("123.45.6.7", 123)})
assert get_local_addr(transport) == ("123.45.6.7", 123)
def test_get_remote_addr():
transport = MockTransport({"peername": None})
assert get_remote_addr(transport) is None
transport = MockTransport({"peername": ("123.45.6.7", 123)})
assert get_remote_addr(transport) == ("123.45.6.7", 123)
@pytest.mark.parametrize(
"scope, expected_client",
[({"client": ("127.0.0.1", 36000)}, "127.0.0.1:36000"), ({"client": None}, "")],
ids=["ip:port client", "None client"],
)
def test_get_client_addr(scope, expected_client):
assert get_client_addr(scope) == expected_client
def test_request_response_timing_request_duration_seconds():
timing = RequestResponseTiming()
with pytest.raises(ValueError):
timing.request_duration_seconds()
timing.request_started()
with pytest.raises(ValueError):
timing.request_duration_seconds()
# Make sure time.monotonic is updated before calls (caused problems in
# windows tests)
time.sleep(0.02)
timing.request_ended()
assert timing.request_duration_seconds() > 0
def test_request_response_timing_response_duration_seconds():
timing = RequestResponseTiming()
with pytest.raises(ValueError):
timing.response_duration_seconds()
timing.response_started()
with pytest.raises(ValueError):
timing.response_duration_seconds()
# Make sure time.monotonic is updated before calls (caused problems in
# windows tests)
time.sleep(0.02)
timing.response_ended()
assert timing.response_duration_seconds() > 0
def test_request_response_timing_total_duration_seconds():
timing = RequestResponseTiming()
with pytest.raises(ValueError):
timing.total_duration_seconds()
timing.request_started()
with pytest.raises(ValueError):
timing.total_duration_seconds()
# Make sure time.monotonic is updated before calls (caused problems in
# windows tests)
time.sleep(0.02)
timing.response_ended()
assert timing.total_duration_seconds() > 0