def test_boundedQueries(self):
        """
        L{Resolver.lookupAddress} won't issue more queries following
        delegations than the limit passed to its initializer.
        """
        servers = {
            ("1.1.2.3", 53): {
                # First query - force it to start over with a name lookup of
                # ns1.example.com
                (b"example.com", A): {
                    "authority":
                    [(b"example.com", Record_NS(b"ns1.example.com"))],
                },
                # Second query - let it resume the original lookup with the
                # address of the nameserver handling the delegation.
                (b"ns1.example.com", A): {
                    "answers": [(b"ns1.example.com", Record_A("10.0.0.2"))],
                },
            },
            ("10.0.0.2", 53): {
                # Third query - let it jump straight to asking the
                # delegation server by including its address here (different
                # case from the first query).
                (b"example.com", A): {
                    "authority":
                    [(b"example.com", Record_NS(b"ns2.example.com"))],
                    "additional": [(b"ns2.example.com", Record_A("10.0.0.3"))],
                },
            },
            ("10.0.0.3", 53): {
                # Fourth query - give it the answer, we're done.
                (b"example.com", A): {
                    "answers": [(b"example.com", Record_A("10.0.0.4"))],
                },
            },
        }

        # Make two resolvers.  One which is allowed to make 3 queries
        # maximum, and so will fail, and on which may make 4, and so should
        # succeed.
        failer = self._getResolver(servers, 3)
        failD = self.assertFailure(failer.lookupAddress(b"example.com"),
                                   ResolverError)

        succeeder = self._getResolver(servers, 4)
        succeedD = succeeder.lookupAddress(b"example.com")
        succeedD.addCallback(getOnePayload)
        succeedD.addCallback(self.assertEqual, Record_A("10.0.0.4"))

        return gatherResults([failD, succeedD])
    def test_lookupNameservers(self):
        """
        L{Resolver.lookupNameservers} is like L{Resolver.lookupAddress}, except
        it queries for I{NS} records instead of I{A} records.
        """
        servers = {
            ("1.1.2.3", 53): {
                (b"example.com", A): {
                    "rCode": ENAME,
                },
                (b"example.com", NS): {
                    "answers":
                    [(b"example.com", Record_NS(b"ns1.example.com"))],
                },
            },
        }
        resolver = self._getResolver(servers)
        d = resolver.lookupNameservers(b"example.com")

        def getOneName(results):
            ans, auth, add = results
            return ans[0].payload.name

        d.addCallback(getOneName)
        d.addCallback(self.assertEqual, Name(b"ns1.example.com"))
        return d
 def test_lookupChecksClass(self):
     """
     If a response includes a record with a class different from the one
     in the query, it is ignored and lookup continues until a record with
     the right class is found.
     """
     badClass = Record_A("10.0.0.1")
     badClass.CLASS = HS
     servers = {
         ("1.1.2.3", 53): {
             (b"foo.example.com", A): {
                 "answers": [(b"foo.example.com", badClass)],
                 "authority":
                 [(b"foo.example.com", Record_NS(b"ns1.example.com"))],
                 "additional": [(b"ns1.example.com", Record_A("10.0.0.2"))],
             },
         },
         ("10.0.0.2", 53): {
             (b"foo.example.com", A): {
                 "answers": [(b"foo.example.com", Record_A("10.0.0.3"))],
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b"foo.example.com")
     d.addCallback(getOnePayload)
     d.addCallback(self.assertEqual, Record_A("10.0.0.3"))
     return d
 def test_missingGlue(self):
     """
     If an intermediate response includes no glue records for the
     authorities, separate queries are made to find those addresses.
     """
     servers = {
         ("1.1.2.3", 53): {
             (b"foo.example.com", A): {
                 "authority":
                 [(b"foo.example.com", Record_NS(b"ns1.example.org"))],
                 # Conspicuous lack of an additional section naming ns1.example.com
             },
             (b"ns1.example.org", A): {
                 "answers": [(b"ns1.example.org", Record_A("10.0.0.1"))],
             },
         },
         ("10.0.0.1", 53): {
             (b"foo.example.com", A): {
                 "answers": [(b"foo.example.com", Record_A("10.0.0.2"))],
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b"foo.example.com")
     d.addCallback(getOneAddress)
     d.addCallback(self.assertEqual, "10.0.0.2")
     return d
Пример #5
0
 def test_missingGlue(self):
     """
     If an intermediate response includes no glue records for the
     authorities, separate queries are made to find those addresses.
     """
     servers = {
         ('1.1.2.3', 53): {
             (b'foo.example.com', A): {
                 'authority':
                 [(b'foo.example.com', Record_NS(b'ns1.example.org'))],
                 # Conspicuous lack of an additional section naming ns1.example.com
             },
             (b'ns1.example.org', A): {
                 'answers': [(b'ns1.example.org', Record_A('10.0.0.1'))],
             },
         },
         ('10.0.0.1', 53): {
             (b'foo.example.com', A): {
                 'answers': [(b'foo.example.com', Record_A('10.0.0.2'))],
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b'foo.example.com')
     d.addCallback(getOneAddress)
     d.addCallback(self.assertEqual, '10.0.0.2')
     return d
 def test_lookupAddress(self):
     """
     L{root.Resolver.lookupAddress} looks up the I{A} records for the
     specified hostname by first querying one of the root servers the
     resolver was created with and then following the authority delegations
     until a result is received.
     """
     servers = {
         ("1.1.2.3", 53): {
             (b"foo.example.com", A): {
                 "authority":
                 [(b"foo.example.com", Record_NS(b"ns1.example.com"))],
                 "additional":
                 [(b"ns1.example.com", Record_A("34.55.89.144"))],
             },
         },
         ("34.55.89.144", 53): {
             (b"foo.example.com", A): {
                 "answers": [(b"foo.example.com", Record_A("10.0.0.1"))],
             }
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b"foo.example.com")
     d.addCallback(getOneAddress)
     d.addCallback(self.assertEqual, "10.0.0.1")
     return d
Пример #7
0
 def test_lookupAddress(self):
     """
     L{root.Resolver.lookupAddress} looks up the I{A} records for the
     specified hostname by first querying one of the root servers the
     resolver was created with and then following the authority delegations
     until a result is received.
     """
     servers = {
         ('1.1.2.3', 53): {
             (b'foo.example.com', A): {
                 'authority':
                 [(b'foo.example.com', Record_NS(b'ns1.example.com'))],
                 'additional':
                 [(b'ns1.example.com', Record_A('34.55.89.144'))],
             },
         },
         ('34.55.89.144', 53): {
             (b'foo.example.com', A): {
                 'answers': [(b'foo.example.com', Record_A('10.0.0.1'))],
             }
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b'foo.example.com')
     d.addCallback(getOneAddress)
     d.addCallback(self.assertEqual, '10.0.0.1')
     return d
Пример #8
0
 def test_lookupChecksClass(self):
     """
     If a response includes a record with a class different from the one
     in the query, it is ignored and lookup continues until a record with
     the right class is found.
     """
     badClass = Record_A('10.0.0.1')
     badClass.CLASS = HS
     servers = {
         ('1.1.2.3', 53): {
             ('foo.example.com', A): {
                 'answers': [('foo.example.com', badClass)],
                 'authority':
                 [('foo.example.com', Record_NS('ns1.example.com'))],
                 'additional': [('ns1.example.com', Record_A('10.0.0.2'))],
             },
         },
         ('10.0.0.2', 53): {
             ('foo.example.com', A): {
                 'answers': [('foo.example.com', Record_A('10.0.0.3'))],
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress('foo.example.com')
     d.addCallback(getOnePayload)
     d.addCallback(self.assertEqual, Record_A('10.0.0.3'))
     return d
Пример #9
0
def nameservers(host, *addresses):
    """
    Return NS records and A record glue for the given host.
    """
    if not addresses:
        addresses = [dornkirk, ns2]
    records = []
    for i, addr in enumerate(addresses):
        records.extend([
            (host, Record_NS('ns%d.twistedmatrix.com' % (i + 1, ), ttl='1H')),
            ('ns%d.twistedmatrix.com' % (i + 1, ), Record_A(addr, ttl='1H'))
        ])
    return records
Пример #10
0
 def test_delegationLookupEmpty(self):
     """
     If there are no records in the response to a lookup of a delegation
     nameserver, the L{Deferred} returned by L{Resolver.lookupAddress} fires
     with L{ResolverError}.
     """
     servers = {
         ("1.1.2.3", 53): {
             (b"example.com", A): {
                 "authority": [(b"example.com", Record_NS(b"ns1.example.com"))],
             },
             (b"ns1.example.com", A): {},
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b"example.com")
     return self.assertFailure(d, ResolverError)
Пример #11
0
 def test_delegationLookupError(self):
     """
     If there is an error resolving the nameserver in a delegation response,
     the L{Deferred} returned by L{Resolver.lookupAddress} fires with that
     error.
     """
     servers = {
         ('1.1.2.3', 53): {
             ('example.com', A): {
                 'authority': [('example.com', Record_NS('ns1.example.com'))],
                 },
             ('ns1.example.com', A): {
                 'rCode': ENAME,
                 },
             },
         }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress('example.com')
     return self.assertFailure(d, DNSNameError)
Пример #12
0
 def test_delegationLookupError(self):
     """
     If there is an error resolving the nameserver in a delegation response,
     the L{Deferred} returned by L{Resolver.lookupAddress} fires with that
     error.
     """
     servers = {
         ("1.1.2.3", 53): {
             (b"example.com", A): {
                 "authority": [(b"example.com", Record_NS(b"ns1.example.com"))],
             },
             (b"ns1.example.com", A): {
                 "rCode": ENAME,
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupAddress(b"example.com")
     return self.assertFailure(d, DNSNameError)
 def test_lookupNameservers(self):
     """
     L{Resolver.lookupNameservers} is like L{Resolver.lookupAddress}, except
     it queries for I{NS} records instead of I{A} records.
     """
     servers = {
         ('1.1.2.3', 53): {
             ('example.com', A): {
                 'rCode': ENAME,
             },
             ('example.com', NS): {
                 'answers': [('example.com', Record_NS('ns1.example.com'))],
             },
         },
     }
     resolver = self._getResolver(servers)
     d = resolver.lookupNameservers('example.com')
     d.addCallback(lambda (ans, auth, add): str(ans[0].payload.name))
     d.addCallback(self.assertEquals, 'ns1.example.com')
     return d