async def test_responder_with_custom_socket(event_loop, responder, params): (request, response), bufsize = params resp, host, port = responder sock = await utils.create_custom_socket(host, 0, flags=0, options=[(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)]) stream_reader = netstring.StreamReader() string_reader = stream_reader.next_string() await event_loop.run_in_executor(None, sock.connect, (host, port)) reader, writer = await asyncio.open_connection(sock=sock) try: writer.write(netstring.encode(request)) res = b'' while True: try: part = string_reader.read() except netstring.WantRead: data = await reader.read(bufsize) assert data stream_reader.feed(data) else: if not part: break res += part assert res == response finally: writer.close()
async def test_cached(responder): resp, host, port = responder reader, writer = await asyncio.open_connection(host, port) stream_reader = netstring.StreamReader() writer.write(netstring.encode(b'test good.loc')) writer.write(netstring.encode(b'test good.loc')) answers = [] try: for _ in range(2): string_reader = stream_reader.next_string() res = b'' while True: try: part = string_reader.read() except netstring.WantRead: data = await reader.read(4096) assert data stream_reader.feed(data) else: if not part: break res += part answers.append(res) assert answers[0] == answers[1] finally: writer.close()
async def test_fast_expire(responder): resp, host, port = responder reader, writer = await asyncio.open_connection(host, port) stream_reader = netstring.StreamReader() async def answer(): string_reader = stream_reader.next_string() res = b'' while True: try: part = string_reader.read() except netstring.WantRead: data = await reader.read(4096) assert data stream_reader.feed(data) else: if not part: break res += part return res try: writer.write(netstring.encode(b'test fast-expire.loc')) answer_a = await answer() await asyncio.sleep(2) writer.write(netstring.encode(b'test fast-expire.loc')) answer_b = await answer() assert answer_a == answer_b == b'OK secure match=mail.loc' finally: writer.close()
def test_stream_portions(): stream_reader = netstring.StreamReader() string_reader = stream_reader.next_string() with pytest.raises(netstring.WantRead): string_reader.read() stream_reader.feed(b'1:') with pytest.raises(netstring.WantRead): string_reader.read() stream_reader.feed(b'X,9:123') assert string_reader.read() == b'X' assert string_reader.read() == b'' string_reader = stream_reader.next_string() assert string_reader.read() == b'123' stream_reader.feed(b'456') assert string_reader.read() == b'456' stream_reader.feed(b'789') assert string_reader.read() == b'789' with pytest.raises(netstring.WantRead): string_reader.read() stream_reader.feed(b',2:') assert string_reader.read() == b'' string_reader = stream_reader.next_string() with pytest.raises(netstring.WantRead): string_reader.read() stream_reader.feed(b'ok,') assert string_reader.read() == b'ok' assert string_reader.read() == b'' string_reader = stream_reader.next_string() with pytest.raises(netstring.WantRead): string_reader.read()
def test_stream_reader(reference, sequence): incoming = sequence[::-1] results = [] stream_reader = netstring.StreamReader() while incoming: string_reader = stream_reader.next_string() res = b'' while True: try: buf = string_reader.read() except netstring.WantRead: if incoming: stream_reader.feed(incoming.pop()) else: break else: if not buf: break res += buf results.append(res) assert results == reference
async def query(host, port, domain): reader, writer = await asyncio.open_connection(host, port) stream_reader = netstring.StreamReader() string_reader = stream_reader.next_string() writer.write(netstring.encode(b'test ' + domain.encode('ascii'))) try: res = b'' while True: try: part = string_reader.read() except netstring.WantRead: data = await reader.read(4096) assert data stream_reader.feed(data) else: if not part: break res += part return res finally: writer.close()
async def test_responder(responder, params): (request, response), bufsize = params resp, host, port = responder stream_reader = netstring.StreamReader() string_reader = stream_reader.next_string() reader, writer = await asyncio.open_connection(host, port) try: writer.write(netstring.encode(request)) res = b'' while True: try: part = string_reader.read() except netstring.WantRead: buf = await reader.read(bufsize) assert buf stream_reader.feed(buf) else: if not part: break res += part assert res == response finally: writer.close()
async def test_unix_responder(unix_responder, params): (request, response), bufsize = params resp, path = unix_responder stream_reader = netstring.StreamReader() string_reader = stream_reader.next_string() assert os.stat(path).st_mode & 0o777 == 0o666 reader, writer = await asyncio.open_unix_connection(path) try: writer.write(netstring.encode(request)) res = b'' while True: try: part = string_reader.read() except netstring.WantRead: data = await reader.read(bufsize) assert data stream_reader.feed(data) else: if not part: break res += part assert res == response finally: writer.close()
def test_abandoned_string_reader_handles(): stream_reader = netstring.StreamReader() stream_reader.feed(b'0:,') string_reader = stream_reader.next_string() with pytest.raises(netstring.InappropriateParserState): string_reader = stream_reader.next_string()
def test_limit(limit, sample): stream_reader = netstring.StreamReader(limit) stream_reader.feed(sample) string_reader = stream_reader.next_string() with pytest.raises(netstring.TooLong): string_reader.read()