diff options
-rw-r--r-- | manual_tests/tcp_client.py | 34 | ||||
-rw-r--r-- | tests/test_network.py | 75 |
2 files changed, 75 insertions, 34 deletions
diff --git a/manual_tests/tcp_client.py b/manual_tests/tcp_client.py deleted file mode 100644 index 214c6d9..0000000 --- a/manual_tests/tcp_client.py +++ /dev/null @@ -1,34 +0,0 @@ -#import logging; logging.basicConfig(level=logging.DEBUG) -import aiogreen -try: - import asyncio -except ImportError: - import trollius as asyncio - -class EchoClientProtocol(asyncio.Protocol): - def __init__(self, message, loop): - self.message = message - self.loop = loop - - def connection_made(self, transport): - transport.write(self.message.encode()) - print('Data sent: {!r}'.format(self.message)) - - def data_received(self, data): - print('Data received: {!r}'.format(data.decode())) - - def connection_lost(self, exc): - print('The server closed the connection') - print('Stop the event loop') - self.loop.stop() - -loop = aiogreen.EventLoop() -message = 'Hello World!' -coro = loop.create_connection(lambda: EchoClientProtocol(message, loop), - '127.0.0.1', 8888) -loop.run_until_complete(coro) - -loop.run_forever() -loop.close() - - diff --git a/tests/test_network.py b/tests/test_network.py new file mode 100644 index 0000000..b1e9731 --- /dev/null +++ b/tests/test_network.py @@ -0,0 +1,75 @@ +import eventlet +import tests +socket = eventlet.patcher.original('socket') +threading = eventlet.patcher.original('threading') + +class TcpEchoClientProtocol(tests.asyncio.Protocol): + def __init__(self, message, loop): + self.message = message + self.loop = loop + self.state = 'new' + self.received = None + + def connection_made(self, transport): + self.state = 'ping' + transport.write(self.message) + + def data_received(self, data): + self.state = 'pong' + self.received = data + + def connection_lost(self, exc): + self.state = 'closed' + self.loop.stop() + + +class TcpServer(threading.Thread): + def __init__(self, host, port): + super(TcpServer, self).__init__() + self.host = host + self.port = port + self.sock = None + self.client = None + + def run(self): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock = sock + try: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind((self.host, self.port)) + sock.listen(1) + + client, addr = sock.accept() + self.client = client + try: + message = client.recv(100) + client.sendall(message) + finally: + client.close() + self.client = None + finally: + sock.close() + self.sock = None + + def stop(self): + self.join() + + +class NetworkTests(tests.TestCase): + def test_tcp_hello(self): + port = 8888 + host = '127.0.0.1' + message = b'Hello World!' + + server = TcpServer(host, port) + server.start() + self.addCleanup(server.stop) + + proto = TcpEchoClientProtocol(message, self.loop) + coro = self.loop.create_connection(lambda: proto, host, port) + self.loop.run_until_complete(coro) + self.assertNotEqual(proto.state, 'new') + + self.loop.run_forever() + self.assertEqual(proto.state, 'closed') + self.assertEqual(proto.received, message) |