From b052847cdd2b5d233b189f440bcc45dabcea06f5 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 23 Mar 2017 10:38:16 +0100 Subject: [PATCH] dnsdist: Add regression tests for local port detection --- regression-tests.dnsdist/dnsdisttests.py | 3 +- regression-tests.dnsdist/test_Advanced.py | 69 +++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/regression-tests.dnsdist/dnsdisttests.py b/regression-tests.dnsdist/dnsdisttests.py index 048479d68f..ecaf2de399 100644 --- a/regression-tests.dnsdist/dnsdisttests.py +++ b/regression-tests.dnsdist/dnsdisttests.py @@ -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)) diff --git a/regression-tests.dnsdist/test_Advanced.py b/regression-tests.dnsdist/test_Advanced.py index 952301ec62..00ec12b36e 100644 --- a/regression-tests.dnsdist/test_Advanced.py +++ b/regression-tests.dnsdist/test_Advanced.py @@ -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) -- 2.47.2