Introduce `tests.util.is_internet_reachable` to avoid duplicate code.
Signed-off-by: Benjamin Drung <bdrung@ubuntu.com>
import dns.rdataclass
import dns.rdatatype
import dns.resolver
-
+import tests.util
# Some tests require TLS so skip those if it's not there.
ssl = dns.query.ssl
_ssl_available = False
-# Some tests require the internet to be available to run, so let's
-# skip those if it's not there.
-_network_available = True
-try:
- socket.gethostbyname("dnspython.org")
-except socket.gaierror:
- _network_available = False
-
-
# Look for systemd-resolved, as it does dangling CNAME responses incorrectly.
#
# Currently we simply check if the nameserver is 127.0.0.53.
self.assertEqual(t, ("::", 53))
-@unittest.skipIf(not _network_available, "Internet not reachable")
+@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class AsyncTests(unittest.TestCase):
connect_udp = sys.platform == "win32"
if dns.query._have_httpx:
import httpx
+import tests.util
+
# Probe for IPv4 and IPv6
resolver_v4_addresses = []
resolver_v6_addresses = []
"https://dns.google/dns-query",
]
-# Some tests require the internet to be available to run, so let's
-# skip those if it's not there.
-_network_available = True
-try:
- socket.gethostbyname("dnspython.org")
-except socket.gaierror:
- _network_available = False
-
@unittest.skipUnless(
- dns.query._have_requests and _network_available,
+ dns.query._have_requests and tests.util.is_internet_reachable(),
"Python requests cannot be imported; no DNS over HTTPS (DOH)",
)
class DNSOverHTTPSTestCaseRequests(unittest.TestCase):
@unittest.skipUnless(
- dns.query._have_httpx and _network_available and _have_ssl,
+ dns.query._have_httpx and tests.util.is_internet_reachable() and _have_ssl,
"Python httpx cannot be imported; no DNS over HTTPS (DOH)",
)
class DNSOverHTTPSTestCaseHttpx(unittest.TestCase):
import dns.query
import dns.tsigkeyring
import dns.zone
-
-# Some tests require the internet to be available to run, so let's
-# skip those if it's not there.
-_network_available = True
-try:
- socket.gethostbyname("dnspython.org")
-except socket.gaierror:
- _network_available = False
+import tests.util
# Some tests use a "nano nameserver" for testing. It requires trio
# and threading, so try to import it and if it doesn't work, skip
keyring = dns.tsigkeyring.from_text({"name": "tDz6cfXXGtNivRpQ98hr6A=="})
-@unittest.skipIf(not _network_available, "Internet not reachable")
+@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class QueryTests(unittest.TestCase):
def testQueryUDP(self):
for address in query_addresses:
import dns.resolver
import dns.tsig
import dns.tsigkeyring
-
-# Some tests require the internet to be available to run, so let's
-# skip those if it's not there.
-_network_available = True
-try:
- socket.gethostbyname("dnspython.org")
-except socket.gaierror:
- _network_available = False
+import tests.util
# Some tests use a "nano nameserver" for testing. It requires trio
# and threading, so try to import it and if it doesn't work, skip
keyname = dns.name.from_text("keyname")
-@unittest.skipIf(not _network_available, "Internet not reachable")
+@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class LiveResolverTests(unittest.TestCase):
def testZoneForName1(self):
name = dns.name.from_text("www.dnspython.org.")
@unittest.skipIf(
- not (_network_available and _nanonameserver_available),
+ not (tests.util.is_internet_reachable() and _nanonameserver_available),
"Internet and NanoAuth required",
)
class NanoTests(unittest.TestCase):
@unittest.skipIf(
- not (_network_available and _nanonameserver_available),
+ not (tests.util.is_internet_reachable() and _nanonameserver_available),
"Internet and NanoAuth required",
)
class ZoneForNameTests(unittest.TestCase):
@pytest.mark.skipif(
- not (_network_available and _nanonameserver_available),
+ not (tests.util.is_internet_reachable() and _nanonameserver_available),
reason="Internet and NanoAuth required",
)
def testResolverTimeout():
@pytest.mark.skipif(
- not (_network_available and _nanonameserver_available),
+ not (tests.util.is_internet_reachable() and _nanonameserver_available),
reason="Internet and NanoAuth required",
)
def testResolverNoNameservers():
@pytest.mark.skipif(
- not (_network_available and _nanonameserver_available),
+ not (tests.util.is_internet_reachable() and _nanonameserver_available),
reason="Internet and NanoAuth required",
)
def testZoneForNameLifetimeTimeout():
import dns.rdataclass
import dns.rdatatype
import dns.resolver
+import tests.util
-# Some tests require the internet to be available to run, so let's
-# skip those if it's not there.
-_network_available = True
-try:
- socket.gethostbyname("dnspython.org")
-except socket.gaierror:
- _network_available = False
-
-@unittest.skipIf(not _network_available, "Internet not reachable")
+@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class OverrideSystemResolverTestCase(unittest.TestCase):
def setUp(self):
self.res = dns.resolver.Resolver(configure=False)
socket.gethostbyaddr("bogus")
-@unittest.skipIf(not _network_available, "Internet not reachable")
+@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class OverrideSystemResolverUsingDefaultResolverTestCase(unittest.TestCase):
def setUp(self):
self.res = FakeResolver()
import enum
import inspect
import os.path
+import socket
+
+# Cache for is_internet_reachable()
+_internet_reachable = None
def here(filename):
return os.path.join(os.path.dirname(__file__), filename)
+def is_internet_reachable():
+ """Check if the Internet is reachable.
+
+ The result is cached.
+ """
+ global _internet_reachable
+ if _internet_reachable is None:
+ try:
+ socket.gethostbyname("dnspython.org")
+ _internet_reachable = True
+ except socket.gaierror:
+ _internet_reachable = False
+ return _internet_reachable
+
+
def enumerate_module(module, super_class):
"""Yield module attributes which are subclasses of given class"""
for attr_name in dir(module):