From: Remi Gacogne Date: Fri, 11 Oct 2019 12:57:45 +0000 (+0200) Subject: dnsdist: Add regression tests for the caching of large answers X-Git-Tag: dnsdist-1.4.0-rc4~22^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d27309a9e915ad28cc2659f41a644e7edeb8efe9;p=thirdparty%2Fpdns.git dnsdist: Add regression tests for the caching of large answers --- diff --git a/regression-tests.dnsdist/test_Caching.py b/regression-tests.dnsdist/test_Caching.py index aba9d554bd..4ecb637cb8 100644 --- a/regression-tests.dnsdist/test_Caching.py +++ b/regression-tests.dnsdist/test_Caching.py @@ -402,6 +402,71 @@ class TestCaching(DNSDistTest): (_, receivedResponse) = self.sendUDPQuery(differentCaseQuery, response=None, useQueue=False) self.assertEquals(receivedResponse, differentCaseResponse) + def testLargeAnswer(self): + """ + Cache: Check that we can cache (and retrieve) large answers + + We should be able to get answers as large as 4096 bytes + """ + numberOfQueries = 10 + name = 'large-answer.cache.tests.powerdns.com.' + query = dns.message.make_query(name, 'TXT', 'IN') + response = dns.message.make_response(query) + # we prepare a large answer + content = "" + for i in range(44): + if len(content) > 0: + content = content + ', ' + content = content + (str(i)*50) + # pad up to 4096 + content = content + 'A'*42 + + rrset = dns.rrset.from_text(name, + 3600, + dns.rdataclass.IN, + dns.rdatatype.TXT, + content) + response.answer.append(rrset) + self.assertEquals(len(response.to_wire()), 4096) + + # first query to fill the cache + (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response) + self.assertTrue(receivedQuery) + self.assertTrue(receivedResponse) + receivedQuery.id = query.id + self.assertEquals(query, receivedQuery) + self.assertEquals(receivedResponse, response) + + for _ in range(numberOfQueries): + (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False) + self.assertEquals(receivedResponse, response) + + total = 0 + for key in self._responsesCounter: + total += self._responsesCounter[key] + TestCaching._responsesCounter[key] = 0 + + self.assertEquals(total, 1) + + # TCP should not be cached + # first query to fill the cache + (receivedQuery, receivedResponse) = self.sendTCPQuery(query, response) + self.assertTrue(receivedQuery) + self.assertTrue(receivedResponse) + receivedQuery.id = query.id + self.assertEquals(query, receivedQuery) + self.assertEquals(receivedResponse, response) + + for _ in range(numberOfQueries): + (_, receivedResponse) = self.sendTCPQuery(query, response=None, useQueue=False) + self.assertEquals(receivedResponse, response) + + total = 0 + for key in self._responsesCounter: + total += self._responsesCounter[key] + TestCaching._responsesCounter[key] = 0 + + self.assertEquals(total, 1) class TestTempFailureCacheTTLAction(DNSDistTest): diff --git a/regression-tests.dnsdist/test_DOH.py b/regression-tests.dnsdist/test_DOH.py index bee0c29fc2..f23a25a37e 100644 --- a/regression-tests.dnsdist/test_DOH.py +++ b/regression-tests.dnsdist/test_DOH.py @@ -767,3 +767,62 @@ class TestDOHOverHTTP(DNSDistDOHTest): self.checkQueryEDNSWithoutECS(expectedQuery, receivedQuery) self.assertEquals(response, receivedResponse) self.checkResponseNoEDNS(response, receivedResponse) + +class TestDOHWithCache(DNSDistDOHTest): + + _serverKey = 'server.key' + _serverCert = 'server.chain' + _serverName = 'tls.tests.dnsdist.org' + _caCert = 'ca.pem' + _dohServerPort = 8443 + _dohBaseURL = ("https://%s:%d/" % (_serverName, _dohServerPort)) + _config_template = """ + newServer{address="127.0.0.1:%s"} + + addDOHLocal("127.0.0.1:%s", "%s", "%s") + + pc = newPacketCache(100, {maxTTL=86400, minTTL=1}) + getPool(""):setCache(pc) + """ + _config_params = ['_testServerPort', '_dohServerPort', '_serverCert', '_serverKey'] + + def testDOHCacheLargeAnswer(self): + """ + DOH with cache: Check that we can cache (and retrieve) large answers + """ + numberOfQueries = 10 + name = 'large.doh-with-cache.tests.powerdns.com.' + query = dns.message.make_query(name, 'A', 'IN', use_edns=False) + query.id = 0 + expectedQuery = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096) + expectedQuery.id = 0 + response = dns.message.make_response(query) + # we prepare a large answer + content = "" + for i in range(44): + if len(content) > 0: + content = content + ', ' + content = content + (str(i)*50) + # pad up to 4096 + content = content + 'A'*40 + + rrset = dns.rrset.from_text(name, + 3600, + dns.rdataclass.IN, + dns.rdatatype.TXT, + content) + response.answer.append(rrset) + self.assertEquals(len(response.to_wire()), 4096) + + # first query to fill the cache + (receivedQuery, receivedResponse) = self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, response=response, caFile=self._caCert) + self.assertTrue(receivedQuery) + self.assertTrue(receivedResponse) + receivedQuery.id = expectedQuery.id + self.assertEquals(expectedQuery, receivedQuery) + self.checkQueryEDNSWithoutECS(expectedQuery, receivedQuery) + self.assertEquals(response, receivedResponse) + + for _ in range(numberOfQueries): + (_, receivedResponse) = self.sendDOHQuery(self._dohServerPort, self._serverName, self._dohBaseURL, query, caFile=self._caCert, useQueue=False) + self.assertEquals(receivedResponse, response) diff --git a/regression-tests.dnsdist/test_TLS.py b/regression-tests.dnsdist/test_TLS.py index 6973613b45..48de31e67f 100644 --- a/regression-tests.dnsdist/test_TLS.py +++ b/regression-tests.dnsdist/test_TLS.py @@ -132,3 +132,66 @@ class TestTLS(DNSDistTest): receivedQuery.id = query.id self.assertEquals(query, receivedQuery) self.assertEquals(response, receivedResponse) + +class TestDOTWithCache(DNSDistTest): + + _serverKey = 'server.key' + _serverCert = 'server.chain' + _serverName = 'tls.tests.dnsdist.org' + _caCert = 'ca.pem' + _tlsServerPort = 8453 + _config_template = """ + newServer{address="127.0.0.1:%s"} + + addTLSLocal("127.0.0.1:%s", "%s", "%s") + + pc = newPacketCache(100, {maxTTL=86400, minTTL=1}) + getPool(""):setCache(pc) + """ + _config_params = ['_testServerPort', '_tlsServerPort', '_serverCert', '_serverKey'] + + def testDOTCacheLargeAnswer(self): + """ + DOT with cache: Check that we can cache (and retrieve) large answers + """ + numberOfQueries = 10 + name = 'large.dot-with-cache.tests.powerdns.com.' + query = dns.message.make_query(name, 'A', 'IN', use_edns=False) + query.id = 0 + expectedQuery = dns.message.make_query(name, 'A', 'IN', use_edns=True, payload=4096) + expectedQuery.id = 0 + response = dns.message.make_response(query) + # we prepare a large answer + content = "" + for i in range(44): + if len(content) > 0: + content = content + ', ' + content = content + (str(i)*50) + # pad up to 4096 + content = content + 'A'*40 + + rrset = dns.rrset.from_text(name, + 3600, + dns.rdataclass.IN, + dns.rdatatype.TXT, + content) + response.answer.append(rrset) + self.assertEquals(len(response.to_wire()), 4096) + + # first query to fill the cache + conn = self.openTLSConnection(self._tlsServerPort, self._serverName, self._caCert) + self.sendTCPQueryOverConnection(conn, query, response=response) + (receivedQuery, receivedResponse) = self.recvTCPResponseOverConnection(conn, useQueue=True) + + self.assertTrue(receivedQuery) + self.assertTrue(receivedResponse) + receivedQuery.id = expectedQuery.id + self.assertEquals(expectedQuery, receivedQuery) + self.checkQueryNoEDNS(expectedQuery, receivedQuery) + self.assertEquals(response, receivedResponse) + + for _ in range(numberOfQueries): + conn = self.openTLSConnection(self._tlsServerPort, self._serverName, self._caCert) + self.sendTCPQueryOverConnection(conn, query, response=None) + receivedResponse = self.recvTCPResponseOverConnection(conn, useQueue=False) + self.assertEquals(receivedResponse, response)