summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@dnspython.org>2021-05-01 14:20:45 -0700
committerBob Halley <halley@dnspython.org>2021-05-01 14:20:45 -0700
commitf4f8d2aee6b56a1d93a1667887ea555c923ff958 (patch)
treedd6f326e702146fc7ea00dbe7c29ae6b5eb852fd
parent3deb941a5434a35a8ba81b6cee006677d9d566dc (diff)
downloaddnspython-lifetime_timeout.tar.gz
Test LifeTimeout and NoNameservers excetpions.lifetime_timeout
-rw-r--r--tests/test_resolver.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/test_resolver.py b/tests/test_resolver.py
index 4f5643d..dce250b 100644
--- a/tests/test_resolver.py
+++ b/tests/test_resolver.py
@@ -22,6 +22,8 @@ import socket
import time
import unittest
+import pytest
+
import dns.e164
import dns.message
import dns.name
@@ -943,3 +945,62 @@ class ZoneForNameNoParentTest(unittest.TestCase):
res.nameservers = [na.udp_address[0]]
with self.assertRaises(dns.resolver.NoRootSOA):
dns.resolver.zone_for_name('www.foo.bar.', resolver=res)
+
+
+class DroppingNanoNameserver(Server):
+
+ def handle(self, request):
+ return None
+
+
+class FormErrNanoNameserver(Server):
+
+ def handle(self, request):
+ r = dns.message.make_response(request.message)
+ r.set_rcode(dns.rcode.FORMERR)
+ return r
+
+
+# we use pytest for these so we can have a "slow" mark later if we want to
+# (right now it's still fast enough we don't really need it)
+
+@pytest.mark.skipif(not (_network_available and _nanonameserver_available),
+ reason="Internet and NanoAuth required")
+def testResolverTimeout():
+ with DroppingNanoNameserver() as na:
+ res = dns.resolver.Resolver(configure=False)
+ res.port = na.udp_address[1]
+ res.nameservers = [na.udp_address[0]]
+ res.timeout = 0.2
+ try:
+ lifetime = 1.0
+ a = res.resolve('www.dnspython.org', lifetime=lifetime)
+ assert False # should never happen
+ except dns.resolver.LifetimeTimeout as e:
+ assert e.kwargs['timeout'] >= lifetime
+ # The length of errors can vary based on how slow things are,
+ # but it ought to be > 1, so we assert that.
+ errors = e.kwargs['errors']
+ assert len(errors) > 1
+ for error in errors:
+ assert error[0] == na.udp_address[0] # address
+ assert not error[1] # not TCP
+ assert error[2] == na.udp_address[1] # port
+ assert isinstance(error[3], dns.exception.Timeout) # exception
+
+def testResolverNoNameservers():
+ with FormErrNanoNameserver() as na:
+ res = dns.resolver.Resolver(configure=False)
+ res.port = na.udp_address[1]
+ res.nameservers = [na.udp_address[0]]
+ try:
+ a = res.resolve('www.dnspython.org')
+ assert False # should never happen
+ except dns.resolver.NoNameservers as e:
+ errors = e.kwargs['errors']
+ assert len(errors) == 1
+ for error in errors:
+ assert error[0] == na.udp_address[0] # address
+ assert not error[1] # not TCP
+ assert error[2] == na.udp_address[1] # port
+ assert error[3] == 'FORMERR'