[Python-checkins] cpython (merge 3.5 -> default): Merge 3.5 (issue #26338)

yury.selivanov python-checkins at python.org
Wed Mar 2 11:17:36 EST 2016


https://hg.python.org/cpython/rev/bdf2807aa8c4
changeset: 100399:bdf2807aa8c4
parent: 100397:779a0d51f7e2
parent: 100398:bbc8cb86f05e
user: Yury Selivanov <yselivanov at sprymix.com>
date: Wed Mar 02 11:17:18 2016 -0500
summary:
 Merge 3.5 (issue #26338)
files:
 Lib/asyncio/base_events.py | 7 +++-
 Lib/test/test_asyncio/test_events.py | 23 +++++++++------
 2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -880,7 +880,10 @@
 to host and port.
 
 The host parameter can also be a sequence of strings and in that case
- the TCP server is bound to all hosts of the sequence.
+ the TCP server is bound to all hosts of the sequence. If a host
+ appears multiple times (possibly indirectly e.g. when hostnames
+ resolve to the same IP address), the server is only bound once to that
+ host.
 
 Return a Server object which can be used to stop the service.
 
@@ -909,7 +912,7 @@
 flags=flags)
 for host in hosts]
 infos = yield from tasks.gather(*fs, loop=self)
- infos = itertools.chain.from_iterable(infos)
+ infos = set(itertools.chain.from_iterable(infos))
 
 completed = False
 try:
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -749,34 +749,37 @@
 @asyncio.coroutine
 def getaddrinfo(host, port, *args, **kw):
 if family == socket.AF_INET:
- return [[family, socket.SOCK_STREAM, 6, '', (host, port)]]
+ return [(family, socket.SOCK_STREAM, 6, '', (host, port))]
 else:
- return [[family, socket.SOCK_STREAM, 6, '', (host, port, 0, 0)]]
+ return [(family, socket.SOCK_STREAM, 6, '', (host, port, 0, 0))]
 
 def getaddrinfo_task(*args, **kwds):
 return asyncio.Task(getaddrinfo(*args, **kwds), loop=self.loop)
 
+ unique_hosts = set(hosts)
+
 if family == socket.AF_INET:
- mock_sock.socket().getsockbyname.side_effect = [(host, 80)
- for host in hosts]
+ mock_sock.socket().getsockbyname.side_effect = [
+ (host, 80) for host in unique_hosts]
 else:
- mock_sock.socket().getsockbyname.side_effect = [(host, 80, 0, 0)
- for host in hosts]
+ mock_sock.socket().getsockbyname.side_effect = [
+ (host, 80, 0, 0) for host in unique_hosts]
 self.loop.getaddrinfo = getaddrinfo_task
 self.loop._start_serving = mock.Mock()
 self.loop._stop_serving = mock.Mock()
 f = self.loop.create_server(lambda: MyProto(self.loop), hosts, 80)
 server = self.loop.run_until_complete(f)
 self.addCleanup(server.close)
- server_hosts = [sock.getsockbyname()[0] for sock in server.sockets]
- self.assertEqual(server_hosts, hosts)
+ server_hosts = {sock.getsockbyname()[0] for sock in server.sockets}
+ self.assertEqual(server_hosts, unique_hosts)
 
 def test_create_server_multiple_hosts_ipv4(self):
 self.create_server_multiple_hosts(socket.AF_INET,
- ['1.2.3.4', '5.6.7.8'])
+ ['1.2.3.4', '5.6.7.8', '1.2.3.4'])
 
 def test_create_server_multiple_hosts_ipv6(self):
- self.create_server_multiple_hosts(socket.AF_INET6, ['::1', '::2'])
+ self.create_server_multiple_hosts(socket.AF_INET6,
+ ['::1', '::2', '::1'])
 
 def test_create_server(self):
 proto = MyProto(self.loop)
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /