def test_conn_close_2(conn, monkeypatch): # Readinto data_size = 500 conn._rbuf = dugong._Buffer(int(4 / 5 * data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size]) self.rfile.close() self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 buf = memoryview(bytearray(2 * data_size)) got = conn.readinto(buf) got += conn.readinto(buf[got:]) assert got == data_size assert buf[:data_size] == DUMMY_DATA[:data_size] assert conn.readinto(buf[got:]) == 0 with pytest.raises(ConnectionClosed): conn.send_request('GET', '/whatever') conn.read_response()
def test_conn_close_2(conn, monkeypatch): # Readinto data_size = 500 conn._rbuf = dugong._Buffer(int(4/5*data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size]) self.rfile.close() self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 buf = memoryview(bytearray(2*data_size)) got = conn.readinto(buf) got += conn.readinto(buf[got:]) assert got == data_size assert buf[:data_size] == DUMMY_DATA[:data_size] assert conn.readinto(buf[got:]) == 0 with pytest.raises(ConnectionClosed): conn.send_request('GET', '/whatever') conn.read_response()
def test_mutable_read(conn): # Read data and modify it, to make sure that this doesn't # affect the buffer conn._rbuf = dugong._Buffer(129) conn.send_request('GET', '/send_512_bytes') conn.read_response() # Assert that buffer is full, but does not start at beginning assert conn._rbuf.b > 0 # Need to avoid conn.read(), because it converts to bytes buf = dugong.eval_coroutine(conn.co_read(150)) pos = len(buf) assert buf == DUMMY_DATA[:pos] memoryview(buf)[:10] = b'\0' * 10 # Assert that buffer is empty assert conn._rbuf.b == 0 assert conn._rbuf.e == 0 buf = dugong.eval_coroutine(conn.co_read(150)) assert buf == DUMMY_DATA[pos:pos+len(buf)] memoryview(buf)[:10] = b'\0' * 10 pos += len(buf) assert conn.readall() == DUMMY_DATA[pos:512] assert not conn.response_pending()
def test_mutable_read(conn): # Read data and modify it, to make sure that this doesn't # affect the buffer conn._rbuf = dugong._Buffer(129) conn.send_request('GET', '/send_512_bytes') conn.read_response() # Assert that buffer is full, but does not start at beginning assert conn._rbuf.b > 0 # Need to avoid conn.read(), because it converts to bytes buf = dugong.eval_coroutine(conn.co_read(150)) pos = len(buf) assert buf == DUMMY_DATA[:pos] memoryview(buf)[:10] = b'\0' * 10 # Assert that buffer is empty assert conn._rbuf.b == 0 assert conn._rbuf.e == 0 buf = dugong.eval_coroutine(conn.co_read(150)) assert buf == DUMMY_DATA[pos:pos + len(buf)] memoryview(buf)[:10] = b'\0' * 10 pos += len(buf) assert conn.readall() == DUMMY_DATA[pos:512] assert not conn.response_pending()
def test_smallbuffer(conn, buffer_size): conn._rbuf = dugong._Buffer(buffer_size) conn.send_request('GET', '/send_512_bytes') resp = conn.read_response() assert resp.status == 200 assert resp.path == '/send_512_bytes' assert resp.length == 512 assert conn.readall() == DUMMY_DATA[:512] assert not conn.response_pending()
def test_full_buffer(conn): conn._rbuf = dugong._Buffer(100) conn.send_request('GET', '/send_512_bytes') conn.read_response() buf = conn.read(101) pos = len(buf) assert buf == DUMMY_DATA[:pos] # Make buffer empty, but without capacity for more assert conn._rbuf.e == 0 conn._rbuf.e = len(conn._rbuf.d) conn._rbuf.b = conn._rbuf.e assert conn.readall() == DUMMY_DATA[pos:512]
def test_exhaust_buffer(conn): conn._rbuf = dugong._Buffer(600) conn.send_request('GET', '/send_512_bytes') conn.read_response() # Test the case where the readbuffer is truncated and # returned, instead of copied conn._rbuf.compact() for io_req in conn._co_fill_buffer(1): io_req.poll() assert conn._rbuf.b == 0 assert conn._rbuf.e > 0 buf = conn.read(600) assert len(conn._rbuf.d) == 600 assert buf == DUMMY_DATA[:len(buf)] assert conn.readall() == DUMMY_DATA[len(buf):512]
def test_conn_close_4(conn, monkeypatch): # Content-Length should take precedence data_size = 500 conn._rbuf = dugong._Buffer(int(4/5*data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Content-Length", str(data_size)) self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size+10]) self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 assert conn.readall() == DUMMY_DATA[:data_size]
def test_conn_close_4(conn, monkeypatch): # Content-Length should take precedence data_size = 500 conn._rbuf = dugong._Buffer(int(4 / 5 * data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Content-Length", str(data_size)) self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size + 10]) self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 assert conn.readall() == DUMMY_DATA[:data_size]
def test_conn_close_5(conn, monkeypatch): # Pipelining data_size = 500 conn._rbuf = dugong._Buffer(int(4/5*data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Content-Length", str(data_size)) self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size]) self.wfile.close() self.rfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever_one') conn.send_request('GET', '/whatever_two') resp = conn.read_response() assert resp.status == 200 assert conn.readall() == DUMMY_DATA[:data_size] assert_raises(dugong.ConnectionClosed, conn.read_response)
def test_conn_close_3(conn, monkeypatch): # Server keeps reading data_size = 500 conn._rbuf = dugong._Buffer(int(4 / 5 * data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size]) self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 assert conn.readall() == DUMMY_DATA[:data_size] conn.send_request('GET', '/whatever') assert_raises(ConnectionClosed, conn.read_response)
def test_conn_close_1(conn, monkeypatch): # Regular read data_size = 500 conn._rbuf = dugong._Buffer(int(4/5*data_size)) def do_GET(self): self.send_response(200) self.send_header("Content-Type", 'application/octet-stream') self.send_header("Connection", 'close') self.end_headers() self.wfile.write(DUMMY_DATA[:data_size]) self.rfile.close() self.wfile.close() monkeypatch.setattr(MockRequestHandler, 'do_GET', do_GET) conn.send_request('GET', '/whatever') resp = conn.read_response() assert resp.status == 200 assert conn.readall() == DUMMY_DATA[:data_size] with pytest.raises(ConnectionClosed): conn.send_request('GET', '/whatever') conn.read_response()