]> granicus.if.org Git - pdns/commitdiff
dnsdist: Add regression tests for local port detection
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 23 Mar 2017 09:38:16 +0000 (10:38 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 23 Mar 2017 09:38:16 +0000 (10:38 +0100)
regression-tests.dnsdist/dnsdisttests.py
regression-tests.dnsdist/test_Advanced.py

index 048479d68f5f3eebe480ca6770572d903aa9a587..ecaf2de39902cb90916e993136f540e44d69be9b 100644 (file)
@@ -25,6 +25,7 @@ class DNSDistTest(unittest.TestCase):
     that the queries sent from dnsdist were as expected.
     """
     _dnsDistPort = 5340
+    _dnsDistListeningAddr = "127.0.0.1"
     _testServerPort = 5350
     _toResponderQueue = Queue.Queue()
     _fromResponderQueue = Queue.Queue()
@@ -62,7 +63,7 @@ class DNSDistTest(unittest.TestCase):
             conf.write(cls._config_template % params)
 
         dnsdistcmd = [os.environ['DNSDISTBIN'], '-C', conffile,
-                      '-l', '127.0.0.1:%d' % cls._dnsDistPort]
+                      '-l', '%s:%d' % (cls._dnsDistListeningAddr, cls._dnsDistPort) ]
         for acl in cls._acl:
             dnsdistcmd.extend(['--acl', acl])
         print(' '.join(dnsdistcmd))
index 952301ec6287720dd88878eaed8d040be775b7f6..00ec12b36e039ae804882385b7e4142823dad81e 100644 (file)
@@ -1370,3 +1370,72 @@ class TestAdvancedRD(DNSDistTest):
         receivedQuery.id = query.id
         self.assertEquals(receivedQuery, query)
         self.assertEquals(receivedResponse, response)
+
+class TestAdvancedGetLocalPort(DNSDistTest):
+
+    _config_template = """
+    function answerBasedOnLocalPort(dq)
+      local port = dq.localaddr:getPort()
+      return DNSAction.Spoof, "port-was-"..port..".local-port.advanced.tests.powerdns.com."
+    end
+    addLuaAction("local-port.advanced.tests.powerdns.com.", answerBasedOnLocalPort)
+    newServer{address="127.0.0.1:%s"}
+    """
+
+    def testAdvancedGetLocalPort(self):
+        """
+        Advanced: Return CNAME containing the local port
+        """
+        name = 'local-port.advanced.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN')
+        # dnsdist set RA = RD for spoofed responses
+        query.flags &= ~dns.flags.RD
+
+        response = dns.message.make_response(query)
+        rrset = dns.rrset.from_text(name,
+                                    60,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.CNAME,
+                                    'port-was-{}.local-port.advanced.tests.powerdns.com.'.format(self._dnsDistPort))
+        response.answer.append(rrset)
+
+        (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+        self.assertEquals(receivedResponse, response)
+
+        (_, receivedResponse) = self.sendTCPQuery(query, response=None, useQueue=False)
+        self.assertEquals(receivedResponse, response)
+
+class TestAdvancedGetLocalPortOnAnyBind(DNSDistTest):
+
+    _config_template = """
+    function answerBasedOnLocalPort(dq)
+      local port = dq.localaddr:getPort()
+      return DNSAction.Spoof, "port-was-"..port..".local-port-any.advanced.tests.powerdns.com."
+    end
+    addLuaAction("local-port-any.advanced.tests.powerdns.com.", answerBasedOnLocalPort)
+    newServer{address="127.0.0.1:%s"}
+    """
+    _dnsDistListeningAddr = "0.0.0.0"
+
+    def testAdvancedGetLocalPortOnAnyBind(self):
+        """
+        Advanced: Return CNAME containing the local port for an ANY bind
+        """
+        name = 'local-port-any.advanced.tests.powerdns.com.'
+        query = dns.message.make_query(name, 'A', 'IN')
+        # dnsdist set RA = RD for spoofed responses
+        query.flags &= ~dns.flags.RD
+
+        response = dns.message.make_response(query)
+        rrset = dns.rrset.from_text(name,
+                                    60,
+                                    dns.rdataclass.IN,
+                                    dns.rdatatype.CNAME,
+                                    'port-was-{}.local-port-any.advanced.tests.powerdns.com.'.format(self._dnsDistPort))
+        response.answer.append(rrset)
+
+        (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+        self.assertEquals(receivedResponse, response)
+
+        (_, receivedResponse) = self.sendTCPQuery(query, response=None, useQueue=False)
+        self.assertEquals(receivedResponse, response)