class TestResponseRuleERCode(DNSDistTest):
+ _extraStartupSleep = 1
_config_template = """
newServer{address="127.0.0.1:%s"}
addResponseAction(ERCodeRule(DNSRCode.BADVERS), DelayResponseAction(1000))
self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
self.assertEqual(receivedResponse.answer[0].ttl, self._ttl)
+class TestResponseRuleLimitTTL(DNSDistTest):
+
+ _lowttl = 60
+ _defaulttl = 3600
+ _highttl = 18000
+ _config_params = ['_lowttl', '_highttl', '_testServerPort']
+ _config_template = """
+ local ffi = require("ffi")
+ local lowttl = %d
+ local highttl = %d
+
+ function luaFFISetMinTTL(dr)
+ ffi.C.dnsdist_ffi_dnsresponse_set_min_ttl(dr, highttl)
+ return DNSResponseAction.None, ""
+ end
+ function luaFFISetMaxTTL(dr)
+ ffi.C.dnsdist_ffi_dnsresponse_set_max_ttl(dr, lowttl)
+ return DNSResponseAction.None, ""
+ end
+
+ newServer{address="127.0.0.1:%s"}
+
+ addResponseAction("min.responses.tests.powerdns.com.", SetMinTTLResponseAction(highttl))
+ addResponseAction("max.responses.tests.powerdns.com.", SetMaxTTLResponseAction(lowttl))
+ addResponseAction("ffi.min.limitttl.responses.tests.powerdns.com.", LuaFFIResponseAction(luaFFISetMinTTL))
+ addResponseAction("ffi.max.limitttl.responses.tests.powerdns.com.", LuaFFIResponseAction(luaFFISetMaxTTL))
+ """
+
+ def testLimitTTL(self):
+ """
+ Responses: Alter the TTLs via Limiter
+ """
+ name = 'min.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(response, receivedResponse)
+ self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
+ self.assertEqual(receivedResponse.answer[0].ttl, self._highttl)
+
+ name = 'max.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(response, receivedResponse)
+ self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
+ self.assertEqual(receivedResponse.answer[0].ttl, self._lowttl)
+
+ def testLimitTTLFFI(self):
+ """
+ Responses: Alter the TTLs via Limiter
+ """
+ name = 'ffi.min.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(response, receivedResponse)
+ self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
+ self.assertEqual(receivedResponse.answer[0].ttl, self._highttl)
+
+ name = 'ffi.max.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(response, receivedResponse)
+ self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
+ self.assertEqual(receivedResponse.answer[0].ttl, self._lowttl)
+
+class TestSetReducedTTL(DNSDistTest):
+
+ _percentage = 42
+ _initialTTL = 100
+ _config_params = ['_percentage', '_testServerPort']
+ _config_template = """
+ addResponseAction(AllRule(), SetReducedTTLResponseAction(%d))
+ newServer{address="127.0.0.1:%s"}
+ """
+
+ def testLimitTTL(self):
+ """
+ Responses: Reduce TTL to 42%
+ """
+ name = 'reduced-ttl.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ self._initialTTL,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(response, receivedResponse)
+ self.assertNotEqual(response.answer[0].ttl, receivedResponse.answer[0].ttl)
+ self.assertEqual(receivedResponse.answer[0].ttl, self._percentage)
+
class TestResponseLuaActionReturnSyntax(DNSDistTest):
_config_template = """
receivedQuery.id = query.id
self.assertEqual(query, receivedQuery)
self.assertEqual(receivedResponse, None)
+
+class TestResponseClearRecordsType(DNSDistTest):
+
+ _config_params = ['_testServerPort']
+ _config_template = """
+ local ffi = require("ffi")
+
+ function luafct(dr)
+ ffi.C.dnsdist_ffi_dnsresponse_clear_records_type(dr, DNSQType.AAAA)
+ return DNSResponseAction.HeaderModify, ""
+ end
+
+ newServer{address="127.0.0.1:%s"}
+
+ addResponseAction("ffi.clear-records-type.responses.tests.powerdns.com.", LuaFFIResponseAction(luafct))
+ addResponseAction("clear-records-type.responses.tests.powerdns.com.", ClearRecordTypesResponseAction(DNSQType.AAAA))
+ """
+
+ def testClearedFFI(self):
+ """
+ Responses: Removes records of a given type (FFI API)
+ """
+ name = 'ffi.clear-records-type.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ expectedResponse = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+ expectedResponse.answer.append(rrset)
+ rrset = dns.rrset.from_text(name,
+ 3660,
+ dns.rdataclass.IN,
+ dns.rdatatype.AAAA,
+ '2001:DB8::1', '2001:DB8::2')
+ response.answer.append(rrset)
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(expectedResponse, receivedResponse)
+
+ def testCleared(self):
+ """
+ Responses: Removes records of a given type
+ """
+ name = 'clear-records-type.responses.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ response = dns.message.make_response(query)
+ expectedResponse = dns.message.make_response(query)
+ rrset = dns.rrset.from_text(name,
+ 3600,
+ dns.rdataclass.IN,
+ dns.rdatatype.A,
+ '192.0.2.1')
+ response.answer.append(rrset)
+ expectedResponse.answer.append(rrset)
+ rrset = dns.rrset.from_text(name,
+ 3660,
+ dns.rdataclass.IN,
+ dns.rdatatype.AAAA,
+ '2001:DB8::1', '2001:DB8::2')
+ response.answer.append(rrset)
+ for method in ("sendUDPQuery", "sendTCPQuery"):
+ sender = getattr(self, method)
+ (receivedQuery, receivedResponse) = sender(query, response)
+ receivedQuery.id = query.id
+ self.assertEqual(query, receivedQuery)
+ self.assertEqual(expectedResponse, receivedResponse)