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)?',