runtests: check ports on IPv6 address
Previously, checkportisavailable only checks ports on the IPv4 address. This
patch makes it check IPv6 as well. It'll be useful if "localhost" does not
have an IPv4 address, or its IPv4 address does not exist somehow.
--- a/tests/run-tests.py Wed Feb 08 08:08:41 2017 -0800
+++ b/tests/run-tests.py Thu Feb 09 05:57:54 2017 -0800
@@ -114,15 +114,19 @@
def checkportisavailable(port):
"""return true if a port seems free to bind on localhost"""
- try:
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind(('localhost', port))
- s.close()
- return True
- except socket.error as exc:
- if not exc.errno == errno.EADDRINUSE:
- raise
- return False
+ families = [getattr(socket, i, None)
+ for i in ('AF_INET', 'AF_INET6')
+ if getattr(socket, i, None) is not None]
+ for family in families:
+ try:
+ s = socket.socket(family, socket.SOCK_STREAM)
+ s.bind(('localhost', port))
+ s.close()
+ return True
+ except socket.error as exc:
+ if exc.errno not in (errno.EADDRINUSE, errno.EADDRNOTAVAIL):
+ raise
+ return False
closefds = os.name == 'posix'
def Popen4(cmd, wd, timeout, env=None):