[PATCH 1 of 4] runtests: add a function to test if IPv6 is available

Augie Fackler raf at durin42.com
Wed Feb 15 21:23:37 EST 2017


On Wed, Feb 15, 2017 at 04:50:14PM -0800, Jun Wu wrote:
> # HG changeset patch
> # User Jun Wu <quark at fb.com>
> # Date 1487204311 28800
> #      Wed Feb 15 16:18:31 2017 -0800
> # Node ID a70fa1e0fcdb11980338d72dde33dfe047bda7c2
> # Parent  e5363cb96233861fc99f7e9b85d7884d3121558c
> # Available At https://bitbucket.org/quark-zju/hg-draft
> #              hg pull https://bitbucket.org/quark-zju/hg-draft -r a70fa1e0fcdb
> runtests: add a function to test if IPv6 is available
>
> Previously, checkportisavailable returns True if the port is free either on
> IPv4 or IPv6, but the hg server only uses IPv4 by default. That leads to
> issues when IPv4 port is not free but the IPv6 one is.
>
> To address that, run-tests should stick with either IPv4 or IPv6. This patch
> adds a function similar to checkportisavailable to test if IPv6 is
> available, and assigns the result to a variable.
>
> The new function was tested in a Linux system script with the following
> steps:
>
>   1. Run "ip addr del ::1/128 dev lo" to delete lo's IPv6 address,
>      Confirm checkipv6available() returns False.
>   2. Run "ip addr add ::1/128 dev lo" to add back lo's IPv6 address.
>      Confirm checkipv6available() returns True.
>   3. Start a web server taking the 8000 port.
>      Confirm checkipv6available(8000) is still True.
>
> diff --git a/tests/run-tests.py b/tests/run-tests.py
> --- a/tests/run-tests.py
> +++ b/tests/run-tests.py
> @@ -113,4 +113,27 @@ else:
>  wifexited = getattr(os, "WIFEXITED", lambda x: False)
>
> +# Whether to use IPv6
> +def checkipv6available(port=20058):
> +    """return true if we can listen on localhost's IPv6 ports"""
> +    family = getattr(socket, 'AF_INET6', None)
> +    if family is None:
> +        return False
> +    try:
> +        s = socket.socket(family, socket.SOCK_STREAM)
> +        s.bind(('localhost', port))
> +        s.close()
> +        return True
> +    except socket.error as exc:
> +        if exc.errno == errno.EADDRINUSE:
> +            return True
> +        elif exc.errno in (errno.EADDRNOTAVAIL, errno.EPROTONOSUPPORT):
> +            return False
> +        else:
> +            raise
> +    else:
> +        return False
> +
> +useipv6 = checkipv6available()

I'm not overjoyed at the static default. Is there a reason to use the
static default instead of checking HGPORT, so that multiple users on a
single box (such as the big compile farm machine several of us favor)
can run the tests without risk of stomping each other?

> +
>  def checkportisavailable(port):
>      """return true if a port seems free to bind on localhost"""
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list