summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@dnspython.org>2020-07-26 13:22:33 -0700
committerBob Halley <halley@dnspython.org>2020-07-26 13:22:33 -0700
commit12ef3c47fa39e3bb0b5a8a2dbcd6c657d0afb16b (patch)
tree887acaeac47aefc6005b9cf8c9dddf6a7625e12d
parente73550dc1cbc3e01f09a87b013c9f3c0518f3ba3 (diff)
downloaddnspython-12ef3c47fa39e3bb0b5a8a2dbcd6c657d0afb16b.tar.gz
more resolver override testing
-rw-r--r--dns/resolver.py3
-rw-r--r--tests/test_resolver.py7
-rw-r--r--tests/test_resolver_override.py74
3 files changed, 81 insertions, 3 deletions
diff --git a/dns/resolver.py b/dns/resolver.py
index ec068fa..46ca30a 100644
--- a/dns/resolver.py
+++ b/dns/resolver.py
@@ -1416,8 +1416,7 @@ def _getaddrinfo(host=None, service=None, family=socket.AF_UNSPEC, socktype=0,
v4addrs.append(rdata.address)
except dns.resolver.NXDOMAIN:
raise socket.gaierror(socket.EAI_NONAME, 'Name or service not known')
- except Exception as e:
- print(e)
+ except Exception:
# We raise EAI_AGAIN here as the failure may be temporary
# (e.g. a timeout) and EAI_SYSTEM isn't defined on Windows.
# [Issue #416]
diff --git a/tests/test_resolver.py b/tests/test_resolver.py
index 6270fd3..d61e8c9 100644
--- a/tests/test_resolver.py
+++ b/tests/test_resolver.py
@@ -633,7 +633,12 @@ class LiveResolverTests(unittest.TestCase):
qtype = dns.rdatatype.from_text('A')
def bad():
answer = dns.resolver.resolve(qname, qtype)
- self.assertRaises(dns.resolver.NXDOMAIN, bad)
+ try:
+ dns.resolver.resolve(qname, qtype)
+ self.assertTrue(False) # should not happen!
+ except dns.resolver.NXDOMAIN as nx:
+ self.assertIn(qname, nx.qnames())
+ self.assertGreaterEqual(len(nx.responses()), 1)
def testResolveCacheHit(self):
res = dns.resolver.Resolver(configure=False)
diff --git a/tests/test_resolver_override.py b/tests/test_resolver_override.py
index acb8f87..c7d5a01 100644
--- a/tests/test_resolver_override.py
+++ b/tests/test_resolver_override.py
@@ -17,6 +17,7 @@ try:
except socket.gaierror:
_network_available = False
+
@unittest.skipIf(not _network_available, "Internet not reachable")
class OverrideSystemResolverTestCase(unittest.TestCase):
@@ -118,6 +119,30 @@ class OverrideSystemResolverTestCase(unittest.TestCase):
except socket.gaierror as e:
self.assertEqual(e.errno, socket.EAI_NONAME)
+ def test_getaddrinfo_only_service(self):
+ infos = socket.getaddrinfo(service=53, family=socket.AF_INET,
+ socktype=socket.SOCK_DGRAM,
+ proto=socket.IPPROTO_UDP)
+ self.assertEqual(len(infos), 1)
+ info = infos[0]
+ self.assertEqual(info[0], socket.AF_INET)
+ self.assertEqual(info[1], socket.SOCK_DGRAM)
+ self.assertEqual(info[2], socket.IPPROTO_UDP)
+ self.assertEqual(info[4], ('127.0.0.1', 53))
+
+ def test_unknown_service_fails(self):
+ with self.assertRaises(socket.gaierror):
+ socket.getaddrinfo('dns.google.', 'bogus-service')
+
+ def test_getnameinfo_tcp(self):
+ info = socket.getnameinfo(('8.8.8.8', 53))
+ self.assertEqual(info, ('dns.google', 'domain'))
+
+ def test_getnameinfo_udp(self):
+ info = socket.getnameinfo(('8.8.8.8', 53), socket.NI_DGRAM)
+ self.assertEqual(info, ('dns.google', 'domain'))
+
+
# Give up on testing this for now as all of the names I've considered
# using for testing are part of CDNs and there is deep magic in
# gethostbyaddr() that python's getfqdn() is using. At any rate,
@@ -145,3 +170,52 @@ class OverrideSystemResolverTestCase(unittest.TestCase):
b = socket.gethostbyaddr('2001:4860:4860::8888')
self.assertEqual(a[0], b[0])
self.assertEqual(a[2], b[2])
+
+
+class FakeResolver:
+ def resolve(self, *args, **kwargs):
+ raise dns.exception.Timeout
+
+
+class OverrideSystemResolverUsingFakeResolverTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.res = FakeResolver()
+ dns.resolver.override_system_resolver(self.res)
+
+ def tearDown(self):
+ dns.resolver.restore_system_resolver()
+ self.res = None
+
+ def test_temporary_failure(self):
+ with self.assertRaises(socket.gaierror):
+ socket.getaddrinfo('dns.google')
+
+ # We don't need the fake resolver for the following tests, but we
+ # don't need the live network either, so we're testing here.
+
+ def test_no_host_or_service_fails(self):
+ with self.assertRaises(socket.gaierror):
+ socket.getaddrinfo()
+
+ def test_AI_ADDRCONFIG_fails(self):
+ with self.assertRaises(socket.gaierror):
+ socket.getaddrinfo('dns.google', flags=socket.AI_ADDRCONFIG)
+
+ def test_gethostbyaddr_of_name_fails(self):
+ with self.assertRaises(socket.gaierror):
+ socket.gethostbyaddr('bogus')
+
+
+class OverrideSystemResolverUsingDefaultResolverTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.res = FakeResolver()
+ dns.resolver.override_system_resolver()
+
+ def tearDown(self):
+ dns.resolver.restore_system_resolver()
+ self.res = None
+
+ def test_override(self):
+ self.assertEqual(dns.resolver._resolver, dns.resolver.default_resolver)