def test_del_stream_before_sock_closing(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) sock = wr.get_extra_info('socket') self.assertNotEqual(sock.fileno(), -1) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() data = self.loop.run_until_complete(f) self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') # drop refs to reader/writer del rd del wr gc.collect() # make a chance to close the socket test_utils.run_briefly(self.loop) self.assertEqual(1, len(messages)) self.assertEqual(sock.fileno(), -1) self.assertEqual(1, len(messages)) self.assertEqual( 'An open stream object is being garbage ' 'collected; call "stream.close()" explicitly.', messages[0]['message'])
def test_open_connection_no_loop_ssl(self): with test_utils.run_test_server(use_ssl=True) as httpd: conn_fut = asyncio.open_connection( *httpd.address, ssl=test_utils.dummy_ssl_context()) self._basetest_open_connection_no_loop_ssl(conn_fut)
def test_create_connection_sock(self): with test_utils.run_test_server() as httpd: sock = None infos = self.loop.run_until_complete( self.loop.getaddrinfo( *httpd.address, type=socket.SOCK_STREAM)) for family, type, proto, cname, address in infos: try: sock = socket.socket(family=family, type=type, proto=proto) sock.setblocking(False) self.loop.run_until_complete( self.loop.sock_connect(sock, address)) except BaseException: pass else: break else: assert False, 'Can not create socket.' f = self.loop.create_connection( lambda: MyProto(loop=self.loop), sock=sock) tr, pr = self.loop.run_until_complete(f) self.assertIsInstance(tr, asyncio.Transport) self.assertIsInstance(pr, asyncio.Protocol) self.loop.run_until_complete(pr.done) self.assertGreater(pr.nbytes, 0) tr.close()
def test_del_stream_before_sock_closing(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) sock = wr.get_extra_info('socket') self.assertNotEqual(sock.fileno(), -1) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() data = self.loop.run_until_complete(f) self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') # drop refs to reader/writer del rd del wr gc.collect() # make a chance to close the socket test_utils.run_briefly(self.loop) self.assertEqual(1, len(messages)) self.assertEqual(sock.fileno(), -1) self.assertEqual(1, len(messages)) self.assertEqual('An open stream object is being garbage ' 'collected; call "stream.close()" explicitly.', messages[0]['message'])
def test_create_connection_sock(self): with test_utils.run_test_server() as httpd: sock = None infos = self.loop.run_until_complete( self.loop.getaddrinfo(*httpd.address, type=socket.SOCK_STREAM)) for family, type, proto, cname, address in infos: try: sock = socket.socket(family=family, type=type, proto=proto) sock.setblocking(False) self.loop.run_until_complete( self.loop.sock_connect(sock, address)) except BaseException: pass else: break else: self.fail('Can not create socket.') f = self.loop.create_connection(lambda: MyProto(loop=self.loop), sock=sock) tr, pr = self.loop.run_until_complete(f) self.assertIsInstance(tr, asyncio.Transport) self.assertIsInstance(pr, asyncio.Protocol) self.loop.run_until_complete(pr.done) self.assertGreater(pr.nbytes, 0) tr.close()
def test_open_connection_no_loop_ssl(self): with test_utils.run_test_server(use_ssl=True) as httpd: conn_fut = asyncio.open_connection( *httpd.address, ssl=test_utils.dummy_ssl_context(), loop=self.loop) self._basetest_open_connection_no_loop_ssl(conn_fut)
def test_wait_closed_on_close_with_unread_data(self): with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() data = self.loop.run_until_complete(f) self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') wr.close() self.loop.run_until_complete(wr.wait_closed())
def test_sock_client_racing(self): with test_utils.run_test_server() as httpd: sock = socket.socket() with sock: self.loop.run_until_complete(asyncio.wait_for( self._basetest_sock_recv_racing(httpd, sock), 10)) sock = socket.socket() with sock: self.loop.run_until_complete(asyncio.wait_for( self._basetest_sock_recv_into_racing(httpd, sock), 10)) listener = socket.socket() sock = socket.socket() with listener, sock: self.loop.run_until_complete(asyncio.wait_for( self._basetest_sock_send_racing(listener, sock), 10))
def test_wait_closed_on_close(self): with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) wr.write(b'GET / HTTP/1.0\r\n\r\n') f = rd.readline() data = self.loop.run_until_complete(f) self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') f = rd.read() data = self.loop.run_until_complete(f) self.assertTrue(data.endswith(b'\r\n\r\nTest message')) self.assertFalse(wr.is_closing()) wr.close() self.assertTrue(wr.is_closing()) self.loop.run_until_complete(wr.wait_closed())
def test_eof_feed_when_closing_writer(self): # See http://bugs.python.org/issue35065 messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) f = wr.aclose() self.loop.run_until_complete(f) assert rd.at_eof() f = rd.read() data = self.loop.run_until_complete(f) assert data == b'' self.assertEqual(messages, [])
def test_async_writer_api(self): async def inner(httpd): rd, wr = await asyncio.open_connection(*httpd.address) await wr.write(b'GET / HTTP/1.0\r\n\r\n') data = await rd.readline() self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') data = await rd.read() self.assertTrue(data.endswith(b'\r\n\r\nTest message')) await wr.close() messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: self.loop.run_until_complete(inner(httpd)) self.assertEqual(messages, [])
def test_del_stream_before_connection_made(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd = asyncio.StreamReader(loop=self.loop) pr = asyncio.StreamReaderProtocol(rd, loop=self.loop) del rd gc.collect() tr, _ = self.loop.run_until_complete( self.loop.create_connection(lambda: pr, *httpd.address)) sock = tr.get_extra_info('socket') self.assertEqual(sock.fileno(), -1) self.assertEqual(1, len(messages)) self.assertEqual( 'An open stream was garbage collected prior to ' 'establishing network connection; ' 'call "stream.close()" explicitly.', messages[0]['message'])
def test_drain_on_closed_writer_ssl(self): async def inner(httpd): reader, writer = await asyncio.open_connection( *httpd.address, ssl=test_utils.dummy_ssl_context()) messages = [] self.loop.set_exception_handler( lambda loop, ctx: messages.append(ctx)) writer.write(b'GET / HTTP/1.0\r\n\r\n') data = await reader.read() self.assertTrue(data.endswith(b'\r\n\r\nTest message')) writer.close() with self.assertRaises(ConnectionResetError): await writer.drain() self.assertEqual(messages, []) with test_utils.run_test_server(use_ssl=True) as httpd: self.loop.run_until_complete(inner(httpd))
def test_async_writer_api(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd, wr = self.loop.run_until_complete( asyncio.open_connection(*httpd.address, loop=self.loop)) f = wr.awrite(b'GET / HTTP/1.0\r\n\r\n') self.loop.run_until_complete(f) f = rd.readline() data = self.loop.run_until_complete(f) self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') f = rd.read() data = self.loop.run_until_complete(f) self.assertTrue(data.endswith(b'\r\n\r\nTest message')) f = wr.aclose() self.loop.run_until_complete(f) self.assertEqual(messages, [])
def test_del_stream_before_connection_made(self): messages = [] self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) with test_utils.run_test_server() as httpd: rd = asyncio.StreamReader(loop=self.loop) pr = asyncio.StreamReaderProtocol(rd, loop=self.loop) del rd gc.collect() tr, _ = self.loop.run_until_complete( self.loop.create_connection( lambda: pr, *httpd.address)) sock = tr.get_extra_info('socket') self.assertEqual(sock.fileno(), -1) self.assertEqual(1, len(messages)) self.assertEqual('An open stream was garbage collected prior to ' 'establishing network connection; ' 'call "stream.close()" explicitly.', messages[0]['message'])
def test_huge_content_recvinto(self): with test_utils.run_test_server() as httpd: self.loop.run_until_complete( self._basetest_huge_content_recvinto(httpd.address))
def test_open_connection(self): with test_utils.run_test_server() as httpd: conn_fut = asyncio.open_connection(*httpd.address, loop=self.loop) self._basetest_open_connection(conn_fut)
def test_sock_client_ops(self): with test_utils.run_test_server() as httpd: sock = socket.socket() self._basetest_sock_client_ops(httpd, sock) sock = socket.socket() self._basetest_sock_recv_into(httpd, sock)