import errno
import os
+import platform
import socket
import stat
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:
from __future__ import absolute_import, division, print_function, with_statement
-import platform
import signal
import socket
from subprocess import Popen
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()