summaryrefslogtreecommitdiff
blob: afd3912079761ca91b491d5e6876262e859669af (plain)
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)?',