@skipIfNoIPv6
def test_ipv6(self):
- try:
- [sock] = bind_sockets(None, '::1', family=socket.AF_INET6)
- port = sock.getsockname()[1]
- self.http_server.add_socket(sock)
- except socket.gaierror as e:
- if e.args[0] == socket.EAI_ADDRFAMILY:
- # python supports ipv6, but it's not configured on the network
- # interface, so skip this test.
- return
- raise
+ [sock] = bind_sockets(None, '::1', family=socket.AF_INET6)
+ port = sock.getsockname()[1]
+ self.http_server.add_socket(sock)
url = '%s://[::1]:%d/hello' % (self.get_protocol(), port)
# ipv6 is currently enabled by default but can be disabled
skipIfNoNetwork = unittest.skipIf('NO_NETWORK' in os.environ,
'network access disabled')
-skipIfNoIPv6 = unittest.skipIf(not socket.has_ipv6, 'ipv6 support not present')
-
-
skipBefore33 = unittest.skipIf(sys.version_info < (3, 3), 'PEP 380 (yield from) not available')
skipBefore35 = unittest.skipIf(sys.version_info < (3, 5), 'PEP 492 (async/await) not available')
skipNotCPython = unittest.skipIf(platform.python_implementation() != 'CPython',
sys.pypy_version_info < (5, 9),
'pypy3 5.8 has buggy ssl module')
+def _detect_ipv6():
+ if not socket.has_ipv6:
+ # socket.has_ipv6 check reports whether ipv6 was present at compile
+ # time. It's usually true even when ipv6 doesn't work for other reasons.
+ return False
+ sock = None
+ try:
+ sock = socket.socket(socket.AF_INET6)
+ sock.bind(('::1', 0))
+ except socket.error:
+ return False
+ finally:
+ if sock is not None:
+ sock.close()
+ return True
+
+skipIfNoIPv6 = unittest.skipIf(not _detect_ipv6(), 'ipv6 support not present')
+
def refusing_port():
"""Returns a local port number that will refuse all connections.