From: Ben Darnell Date: Sat, 3 May 2014 18:41:51 +0000 (-0400) Subject: Hack around mac ipv6 firewall problems in bind_sockets to reenable tests. X-Git-Tag: v4.0.0b1~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a6e83a6c3b5b930c0b9b63395008fa6dac8f0f5c;p=thirdparty%2Ftornado.git Hack around mac ipv6 firewall problems in bind_sockets to reenable tests. Fix a test ResourceWarning. --- diff --git a/tornado/netutil.py b/tornado/netutil.py index 2042b91dd..7e37d0eaa 100644 --- a/tornado/netutil.py +++ b/tornado/netutil.py @@ -20,6 +20,7 @@ from __future__ import absolute_import, division, print_function, with_statement import errno import os +import platform import socket import stat @@ -93,6 +94,15 @@ def bind_sockets(port, address=None, family=socket.AF_UNSPEC, backlog=128, flags for res in set(socket.getaddrinfo(address, port, family, socket.SOCK_STREAM, 0, flags)): af, socktype, proto, canonname, sockaddr = res + if (platform.system() == 'Darwin' and address == 'localhost' and + af == socket.AF_INET6 and sockaddr[3] != 0): + # Mac OS X includes a link-local address fe80::1%lo0 in the + # getaddrinfo results for 'localhost'. However, the firewall + # doesn't understand that this is a local address and will + # prompt for access (often repeatedly, due to an apparent + # bug in its ability to remember granting access to an + # application). Skip these addresses. + continue try: sock = socket.socket(af, socktype, proto) except socket.error as e: diff --git a/tornado/test/netutil_test.py b/tornado/test/netutil_test.py index 0f18b3305..9f7c85cb5 100644 --- a/tornado/test/netutil_test.py +++ b/tornado/test/netutil_test.py @@ -1,6 +1,5 @@ from __future__ import absolute_import, division, print_function, with_statement -import platform import signal import socket from subprocess import Popen @@ -154,15 +153,13 @@ class IsValidIPTest(unittest.TestCase): self.assertTrue(not is_valid_ip('\x00')) -# The mac firewall prompts when listening on "localhost" instead of -# "127.0.0.1" like the other tests use (maybe due to the ipv6 -# link-local address fe80::1%lo0?), and it doesn't remember whether -# you've previously allowed or denied access. It's better to skip this -# test on the mac than to have the prompts come up for every configuration -# in tox.ini. -@unittest.skipIf(platform.system() == 'Darwin', 'avoid firewall prompts on Mac') class TestPortAllocation(unittest.TestCase): def test_same_port_allocation(self): sockets = bind_sockets(None, 'localhost') - port = sockets[0].getsockname()[1] - self.assertTrue(all(s.getsockname()[1] == port for s in sockets[1:])) + try: + port = sockets[0].getsockname()[1] + self.assertTrue(all(s.getsockname()[1] == port + for s in sockets[1:])) + finally: + for sock in sockets: + sock.close()