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
|
https://bitbucket.org/nikratio/python-dugong/commits/0e9d67700bc8
diff --git a/test/test_dugong.py b/test/test_dugong.py
--- a/test/test_dugong.py
+++ b/test/test_dugong.py
@@ -99,6 +99,12 @@
request.addfinalizer(conn.disconnect)
return conn
+@pytest.fixture()
+def random_fh(request):
+ fh = open('/dev/urandom', 'rb')
+ request.addfinalizer(fh.close)
+ return fh
+
def check_http_connection():
'''Skip test if we can't connect to ssl test server'''
@@ -170,12 +176,12 @@
conn.get_ssl_cipher()
conn.get_ssl_peercert()
-def test_blocking_send(conn):
+def test_blocking_send(conn, random_fh):
# Send requests until we block because all TCP buffers are full
- path = '/send_100_1200-byte_chunks'
+ path = '/send_102400_random_bytes'
for count in itertools.count():
- crt = conn.co_send_request('GET', path, body=DUMMY_DATA[:8192])
+ crt = conn.co_send_request('GET', path, body=random_fh.read(8192))
flag = False
for io_req in crt:
if not io_req.poll(1):
@@ -539,7 +545,7 @@
conn.read_response()
conn.readall()
-def test_aborted_write1(conn, monkeypatch):
+def test_aborted_write1(conn, monkeypatch, random_fh):
BUFSIZE = 64*1024
# Monkeypatch request handler
@@ -562,14 +568,14 @@
# Try to write data
with pytest.raises(ConnectionClosed):
for _ in range(50):
- conn.write(b'f' * BUFSIZE)
+ conn.write(random_fh.read(BUFSIZE))
# Nevertheless, try to read response
resp = conn.read_response()
assert resp.status == 401
assert resp.reason == 'Please stop!'
-def test_aborted_write2(conn, monkeypatch):
+def test_aborted_write2(conn, monkeypatch, random_fh):
BUFSIZE = 64*1024
# Monkeypatch request handler
@@ -590,7 +596,7 @@
# Try to write data
with pytest.raises(ConnectionClosed):
for _ in range(50):
- conn.write(b'f' * BUFSIZE)
+ conn.write(random_fh.read(BUFSIZE))
# Nevertheless, try to read response
assert_raises(ConnectionClosed, conn.read_response)
@@ -716,12 +722,13 @@
assert conn.read(50) == b'x' * 25
assert_raises(dugong.ConnectionTimedOut, conn.read, 50)
-def test_send_timeout(conn, monkeypatch):
+def test_send_timeout(conn, monkeypatch, random_fh):
conn.timeout = 1
def do_PUT(self):
# Read just a tiny bit
self.rfile.read(256)
+ time.sleep(2*conn.timeout)
monkeypatch.setattr(MockRequestHandler, 'do_PUT', do_PUT)
# We don't know how much data can be buffered, so we
@@ -730,7 +737,7 @@
conn.send_request('PUT', '/recv_something', body=BodyFollowing(len_))
with pytest.raises(dugong.ConnectionTimedOut):
while len_ > 0:
- conn.write(b'x' * min(len_, 16*1024))
+ conn.write(random_fh.read(min(len_, 16*1024)))
DUMMY_DATA = ','.join(str(x) for x in range(10000)).encode()
@@ -743,6 +750,14 @@
def log_message(self, format, *args):
pass
+ def setup(self):
+ super().setup()
+ self.random_fh = open('/dev/urandom', 'rb')
+
+ def finish(self):
+ super().finish()
+ self.random_fh.close()
+
def handle_expect_100(self):
if self.handle_errors():
return
@@ -782,14 +797,17 @@
self.wfile.close()
return
- hit = re.match(r'^/send_([0-9]+)_bytes', self.path)
+ hit = re.match(r'^/send_([0-9]+)_(random_)?bytes', self.path)
if hit:
len_ = int(hit.group(1))
self.send_response(200)
self.send_header("Content-Type", 'application/octet-stream')
self.send_header("Content-Length", str(len_))
self.end_headers()
- self.wfile.write(DUMMY_DATA[:len_])
+ if hit.group(2):
+ self.wfile.write(self.random_fh.read(len_))
+ else:
+ self.wfile.write(DUMMY_DATA[:len_])
return
hit = re.match(r'^/send_([0-9]+)_([0-9]+)-byte_chunks(?:_delay_([0-9]+)_ms)?',
|