diff -r 96071ffd7ca5 tests/test_events.py --- a/tests/test_events.py Tue Mar 10 16:29:12 2015 +0100 +++ b/tests/test_events.py Wed Mar 11 14:01:28 2015 +0100 @@ -53,6 +53,13 @@ return version < (10, 5) +def get_local_ip_address(): + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("42.42.42.42", 80)) + ipaddr = s.getsockname()[0] + s.close() + return ipaddr + ONLYCERT = data_file('ssl_cert.pem') ONLYKEY = data_file('ssl_key.pem') SIGNED_CERTFILE = data_file('keycert3.pem') @@ -67,13 +74,14 @@ self.transport = None self.state = 'INITIAL' self.nbytes = 0 + self.loop = loop if loop is not None: self.connected = asyncio.Future(loop=loop) self.done = asyncio.Future(loop=loop) def connection_made(self, transport): self.transport = transport - assert self.state == 'INITIAL', self.state + assert self.state in ('INITIAL', 'CLOSED'), self.state self.state = 'CONNECTED' if self.connected: self.connected.set_result(None) @@ -91,6 +99,9 @@ self.state = 'CLOSED' if self.done: self.done.set_result(None) + self.done = asyncio.Future(loop=self.loop) + if self.connected: + self.connected = asyncio.Future(loop=self.loop) class MyProto(MyBaseProto): @@ -696,6 +707,48 @@ self.assertEqual(cm.exception.errno, errno.EADDRINUSE) self.assertIn(str(httpd.address), cm.exception.strerror) + @unittest.skipIf(get_local_ip_address().startswith('127'), + 'No non-loopback IP address') + def test_create_server_multiple_hosts(self): + ips = ['127.0.0.1', get_local_ip_address()] + proto = MyProto(self.loop) + f = self.loop.create_server(lambda: proto, ips, 0) + server = self.loop.run_until_complete(f) + self.assertEqual(len(server.sockets), len(ips)) + payload = b'xxx' + nbytes_sent = 0 + for sock in server.sockets: + host, port = sock.getsockname() + self.assertTrue(host in ips) + + client = socket.socket() + client.connect((host, port)) + client.sendall(payload) + + self.loop.run_until_complete(proto.connected) + self.assertEqual('CONNECTED', proto.state) + + test_utils.run_until(self.loop, lambda: proto.nbytes > nbytes_sent) + nbytes_sent += len(payload) + self.assertEqual(nbytes_sent, proto.nbytes) + + # extra info is available + self.assertIsNotNone(proto.transport.get_extra_info('sockname')) + self.assertEqual(host, + proto.transport.get_extra_info('peername')[0]) + + # close connection + proto.transport.close() + self.loop.run_until_complete(proto.done) + + self.assertEqual('CLOSED', proto.state) + + # the client socket must be closed after to avoid ECONNRESET upon + # recv()/send() on the serving socket + client.close() + # close server + server.close() + def test_create_server(self): proto = MyProto(self.loop) f = self.loop.create_server(lambda: proto, '0.0.0.0', 0)