Skip to content
This repository was archived by the owner on Apr 14, 2022. It is now read-only.

Commit 96bebcc

Browse files
committed
Asyncify remaining TestPoolManager tests
1 parent 22fb311 commit 96bebcc

File tree

2 files changed

+148
-146
lines changed

2 files changed

+148
-146
lines changed

test/with_dummyserver/async/test_poolmanager.py

+148
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import io
22
import json
33
import pytest
4+
from ahip.base import DEFAULT_PORTS
45
from ahip import PoolManager, Retry
56
from ahip.exceptions import MaxRetryError, UnrewindableBodyError
67

@@ -224,6 +225,153 @@ async def test_raise_on_redirect(self, backend, anyio_backend):
224225

225226
assert r.status == 303
226227

228+
@conftest.test_all_backends
229+
async def test_raise_on_status(self, backend, anyio_backend):
230+
with PoolManager(backend=backend) as http:
231+
with pytest.raises(MaxRetryError):
232+
# the default is to raise
233+
r = await http.request(
234+
"GET",
235+
"%s/status" % self.base_url,
236+
fields={"status": "500 Internal Server Error"},
237+
retries=Retry(total=1, status_forcelist=range(500, 600)),
238+
)
239+
240+
with pytest.raises(MaxRetryError):
241+
# raise explicitly
242+
r = await http.request(
243+
"GET",
244+
"%s/status" % self.base_url,
245+
fields={"status": "500 Internal Server Error"},
246+
retries=Retry(
247+
total=1, status_forcelist=range(500, 600), raise_on_status=True
248+
),
249+
)
250+
251+
# don't raise
252+
r = await http.request(
253+
"GET",
254+
"%s/status" % self.base_url,
255+
fields={"status": "500 Internal Server Error"},
256+
retries=Retry(
257+
total=1, status_forcelist=range(500, 600), raise_on_status=False
258+
),
259+
)
260+
261+
assert r.status == 500
262+
263+
@pytest.mark.parametrize(
264+
["target", "expected_target"],
265+
[
266+
("/echo_uri?q=1#fragment", b"/echo_uri?q=1"),
267+
("/echo_uri?#", b"/echo_uri?"),
268+
("/echo_uri#?", b"/echo_uri"),
269+
("/echo_uri#?#", b"/echo_uri"),
270+
("/echo_uri??#", b"/echo_uri??"),
271+
("/echo_uri?%3f#", b"/echo_uri?%3F"),
272+
("/echo_uri?%3F#", b"/echo_uri?%3F"),
273+
("/echo_uri?[]", b"/echo_uri?%5B%5D"),
274+
],
275+
)
276+
@conftest.test_all_backends
277+
async def test_encode_http_target(
278+
self, target, expected_target, backend, anyio_backend
279+
):
280+
with PoolManager() as http:
281+
url = "http://%s:%d%s" % (self.host, self.port, target)
282+
r = await http.request("GET", url)
283+
assert r.data == expected_target
284+
285+
@conftest.test_all_backends
286+
async def test_missing_port(self, backend, anyio_backend):
287+
# Can a URL that lacks an explicit port like ':80' succeed, or
288+
# will all such URLs fail with an error?
289+
290+
with PoolManager(backend=backend) as http:
291+
# By globally adjusting `DEFAULT_PORTS` we pretend for a moment
292+
# that HTTP's default port is not 80, but is the port at which
293+
# our test server happens to be listening.
294+
DEFAULT_PORTS["http"] = self.port
295+
try:
296+
r = await http.request("GET", "http://%s/" % self.host, retries=0)
297+
finally:
298+
DEFAULT_PORTS["http"] = 80
299+
300+
assert r.status == 200
301+
assert r.data == b"Dummy server!"
302+
303+
@conftest.test_all_backends
304+
async def test_headers(self, backend, anyio_backend):
305+
with PoolManager(backend=backend, headers={"Foo": "bar"}) as http:
306+
r = await http.request("GET", "%s/headers" % self.base_url)
307+
returned_headers = json.loads(r.data.decode())
308+
assert returned_headers.get("Foo") == "bar"
309+
310+
r = await http.request("POST", "%s/headers" % self.base_url)
311+
returned_headers = json.loads(r.data.decode())
312+
assert returned_headers.get("Foo") == "bar"
313+
314+
r = await http.request_encode_url("GET", "%s/headers" % self.base_url)
315+
returned_headers = json.loads(r.data.decode())
316+
assert returned_headers.get("Foo") == "bar"
317+
318+
r = await http.request_encode_body("POST", "%s/headers" % self.base_url)
319+
returned_headers = json.loads(r.data.decode())
320+
assert returned_headers.get("Foo") == "bar"
321+
322+
r = await http.request_encode_url(
323+
"GET", "%s/headers" % self.base_url, headers={"Baz": "quux"}
324+
)
325+
returned_headers = json.loads(r.data.decode())
326+
assert returned_headers.get("Foo") is None
327+
assert returned_headers.get("Baz") == "quux"
328+
329+
r = await http.request_encode_body(
330+
"GET", "%s/headers" % self.base_url, headers={"Baz": "quux"}
331+
)
332+
returned_headers = json.loads(r.data.decode())
333+
assert returned_headers.get("Foo") is None
334+
assert returned_headers.get("Baz") == "quux"
335+
336+
@conftest.test_all_backends
337+
async def test_http_with_ssl_keywords(self, backend, anyio_backend):
338+
with PoolManager(backend=backend, ca_certs="REQUIRED") as http:
339+
r = await http.request("GET", "http://%s:%s/" % (self.host, self.port))
340+
assert r.status == 200
341+
342+
@conftest.test_all_backends
343+
async def test_http_with_ca_cert_dir(self, backend, anyio_backend):
344+
with PoolManager(
345+
backend=backend, ca_certs="REQUIRED", ca_cert_dir="/nosuchdir"
346+
) as http:
347+
r = await http.request("GET", "http://%s:%s/" % (self.host, self.port))
348+
assert r.status == 200
349+
350+
@conftest.test_all_backends
351+
async def test_cleanup_on_connection_error(self, backend, anyio_backend):
352+
"""
353+
Test that connections are recycled to the pool on
354+
connection errors where no http response is received.
355+
"""
356+
poolsize = 3
357+
358+
with PoolManager(backend=backend, maxsize=poolsize, block=True) as http:
359+
pool = http.connection_from_host(self.host, self.port)
360+
assert pool.pool.qsize() == poolsize
361+
362+
# force a connection error by supplying a non-existent
363+
# url. We won't get a response for this and so the
364+
# conn won't be implicitly returned to the pool.
365+
url = "%s/redirect" % self.base_url
366+
with pytest.raises(MaxRetryError):
367+
await http.request("GET", url, fields={"target": "/"}, retries=0)
368+
369+
r = await http.request("GET", url, fields={"target": "/"}, retries=1)
370+
r.release_conn()
371+
372+
# the pool should still contain poolsize elements
373+
assert pool.pool.qsize() == poolsize
374+
227375

228376
class TestFileUploads(HTTPDummyServerTestCase):
229377
@classmethod

test/with_dummyserver/test_poolmanager.py

-146
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import json
21
import time
32

43
import pytest
54

65
from dummyserver.server import HAS_IPV6
76
from dummyserver.testcase import HTTPDummyServerTestCase, IPv6HTTPDummyServerTestCase
8-
from hip.base import DEFAULT_PORTS
97
from hip.poolmanager import PoolManager
108
from hip.exceptions import MaxRetryError, NewConnectionError
119
from hip.util.retry import Retry, RequestHistory
@@ -14,150 +12,6 @@
1412
pytestmark = pytest.mark.flaky
1513

1614

17-
class TestPoolManager(HTTPDummyServerTestCase):
18-
@classmethod
19-
def setup_class(cls):
20-
super(TestPoolManager, cls).setup_class()
21-
cls.base_url = "http://%s:%d" % (cls.host, cls.port)
22-
cls.base_url_alt = "http://%s:%d" % (cls.host_alt, cls.port)
23-
24-
def test_raise_on_status(self):
25-
with PoolManager() as http:
26-
with pytest.raises(MaxRetryError):
27-
# the default is to raise
28-
r = http.request(
29-
"GET",
30-
"%s/status" % self.base_url,
31-
fields={"status": "500 Internal Server Error"},
32-
retries=Retry(total=1, status_forcelist=range(500, 600)),
33-
)
34-
35-
with pytest.raises(MaxRetryError):
36-
# raise explicitly
37-
r = http.request(
38-
"GET",
39-
"%s/status" % self.base_url,
40-
fields={"status": "500 Internal Server Error"},
41-
retries=Retry(
42-
total=1, status_forcelist=range(500, 600), raise_on_status=True
43-
),
44-
)
45-
46-
# don't raise
47-
r = http.request(
48-
"GET",
49-
"%s/status" % self.base_url,
50-
fields={"status": "500 Internal Server Error"},
51-
retries=Retry(
52-
total=1, status_forcelist=range(500, 600), raise_on_status=False
53-
),
54-
)
55-
56-
assert r.status == 500
57-
58-
@pytest.mark.parametrize(
59-
["target", "expected_target"],
60-
[
61-
("/echo_uri?q=1#fragment", b"/echo_uri?q=1"),
62-
("/echo_uri?#", b"/echo_uri?"),
63-
("/echo_uri#?", b"/echo_uri"),
64-
("/echo_uri#?#", b"/echo_uri"),
65-
("/echo_uri??#", b"/echo_uri??"),
66-
("/echo_uri?%3f#", b"/echo_uri?%3F"),
67-
("/echo_uri?%3F#", b"/echo_uri?%3F"),
68-
("/echo_uri?[]", b"/echo_uri?%5B%5D"),
69-
],
70-
)
71-
def test_encode_http_target(self, target, expected_target):
72-
with PoolManager() as http:
73-
url = "http://%s:%d%s" % (self.host, self.port, target)
74-
r = http.request("GET", url)
75-
assert r.data == expected_target
76-
77-
def test_missing_port(self):
78-
# Can a URL that lacks an explicit port like ':80' succeed, or
79-
# will all such URLs fail with an error?
80-
81-
with PoolManager() as http:
82-
# By globally adjusting `DEFAULT_PORTS` we pretend for a moment
83-
# that HTTP's default port is not 80, but is the port at which
84-
# our test server happens to be listening.
85-
DEFAULT_PORTS["http"] = self.port
86-
try:
87-
r = http.request("GET", "http://%s/" % self.host, retries=0)
88-
finally:
89-
DEFAULT_PORTS["http"] = 80
90-
91-
assert r.status == 200
92-
assert r.data == b"Dummy server!"
93-
94-
def test_headers(self):
95-
with PoolManager(headers={"Foo": "bar"}) as http:
96-
r = http.request("GET", "%s/headers" % self.base_url)
97-
returned_headers = json.loads(r.data.decode())
98-
assert returned_headers.get("Foo") == "bar"
99-
100-
r = http.request("POST", "%s/headers" % self.base_url)
101-
returned_headers = json.loads(r.data.decode())
102-
assert returned_headers.get("Foo") == "bar"
103-
104-
r = http.request_encode_url("GET", "%s/headers" % self.base_url)
105-
returned_headers = json.loads(r.data.decode())
106-
assert returned_headers.get("Foo") == "bar"
107-
108-
r = http.request_encode_body("POST", "%s/headers" % self.base_url)
109-
returned_headers = json.loads(r.data.decode())
110-
assert returned_headers.get("Foo") == "bar"
111-
112-
r = http.request_encode_url(
113-
"GET", "%s/headers" % self.base_url, headers={"Baz": "quux"}
114-
)
115-
returned_headers = json.loads(r.data.decode())
116-
assert returned_headers.get("Foo") is None
117-
assert returned_headers.get("Baz") == "quux"
118-
119-
r = http.request_encode_body(
120-
"GET", "%s/headers" % self.base_url, headers={"Baz": "quux"}
121-
)
122-
returned_headers = json.loads(r.data.decode())
123-
assert returned_headers.get("Foo") is None
124-
assert returned_headers.get("Baz") == "quux"
125-
126-
def test_http_with_ssl_keywords(self):
127-
with PoolManager(ca_certs="REQUIRED") as http:
128-
r = http.request("GET", "http://%s:%s/" % (self.host, self.port))
129-
assert r.status == 200
130-
131-
def test_http_with_ca_cert_dir(self):
132-
with PoolManager(ca_certs="REQUIRED", ca_cert_dir="/nosuchdir") as http:
133-
r = http.request("GET", "http://%s:%s/" % (self.host, self.port))
134-
assert r.status == 200
135-
136-
def test_cleanup_on_connection_error(self):
137-
"""
138-
Test that connections are recycled to the pool on
139-
connection errors where no http response is received.
140-
"""
141-
poolsize = 3
142-
143-
with PoolManager(maxsize=poolsize, block=True) as http:
144-
pool = http.connection_from_host(self.host, self.port)
145-
assert pool.pool.qsize() == poolsize
146-
147-
# force a connection error by supplying a non-existent
148-
# url. We won't get a response for this and so the
149-
# conn won't be implicitly returned to the pool.
150-
url = "%s/redirect" % self.base_url
151-
with pytest.raises(MaxRetryError):
152-
http.request("GET", url, fields={"target": "/"}, retries=0)
153-
154-
r = http.request("GET", url, fields={"target": "/"}, retries=1)
155-
r.release_conn()
156-
157-
# the pool should still contain poolsize elements
158-
assert pool.pool.qsize() == poolsize
159-
160-
16115
class TestRetry(HTTPDummyServerTestCase):
16216
@classmethod
16317
def setup_class(self):

0 commit comments

Comments
 (0)