]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Better coverage of Lua network bindings
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 20 Apr 2022 10:22:43 +0000 (12:22 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 7 Oct 2022 15:48:52 +0000 (17:48 +0200)
pdns/dnsdistdist/dnsdist-lua-bindings-network.cc
regression-tests.dnsdist/resolv.conf.sample [new file with mode: 0644]
regression-tests.dnsdist/test_NetworkBindings.py [new file with mode: 0644]

index 9f1b9172706df4e80ff1f99da0ebfc852a4780d4..5d95a892def07b5fe44f3dc54ee5cb5790aa6e4a 100644 (file)
@@ -65,10 +65,6 @@ void setupLuaBindingsNetwork(LuaContext& luaCtx, bool client)
       return false;
     }
 
-    if (!listener) {
-      return false;
-    }
-
     return listener->addUnixListeningEndpoint(path, endpointID, [cb](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) {
       auto lock = g_lua.lock();
       cb(endpoint, dgram, from);
@@ -76,7 +72,7 @@ void setupLuaBindingsNetwork(LuaContext& luaCtx, bool client)
   });
 
   luaCtx.registerFunction<void (std::shared_ptr<dnsdist::NetworkListener>::*)()>("start", [client](std::shared_ptr<dnsdist::NetworkListener>& listener) {
-    if (client || !listener) {
+    if (client) {
       return;
     }
 
diff --git a/regression-tests.dnsdist/resolv.conf.sample b/regression-tests.dnsdist/resolv.conf.sample
new file mode 100644 (file)
index 0000000..3d768f7
--- /dev/null
@@ -0,0 +1,8 @@
+# this line should be ignored
+; that one as well
+  # even with leading spaces
+       ; or a tab
+# nameserver line, IPv4, space-separated
+nameserver 9.9.9.9
+# nameserver line, IPv6, tab-separated
+nameserver     2620:fe::fe
diff --git a/regression-tests.dnsdist/test_NetworkBindings.py b/regression-tests.dnsdist/test_NetworkBindings.py
new file mode 100644 (file)
index 0000000..f90ccd9
--- /dev/null
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+import unittest
+import os
+import subprocess
+import time
+
+class TestNetworkEndpointConfig(unittest.TestCase):
+
+    def checkDNSDistExitCode(self, configTemplate, expectedCode, clientMode=False, verboseMode=False):
+        conffile = 'configs/dnsdist_TestNetworkEndpointConfig.conf'
+        with open(conffile, 'w') as conf:
+            conf.write("-- Autogenerated by dnsdisttests.py\n")
+            conf.write(configTemplate)
+
+        dnsdistcmd = [os.environ['DNSDISTBIN'], '-C', conffile, '--check-config']
+        if clientMode:
+            dnsdistcmd.append('-c')
+        if verboseMode:
+            dnsdistcmd.append('-v')
+
+        output = None
+        returnCode = None
+        try:
+            output = subprocess.check_output(dnsdistcmd, stderr=subprocess.STDOUT, close_fds=True)
+            returnCode = 0
+        except subprocess.CalledProcessError as exc:
+            output = exc.output
+            returnCode = exc.returncode
+
+        print(output)
+        self.assertEqual(returnCode, expectedCode)
+
+    def testNonExistingEndpoint(self):
+        """
+        NetworkBindings: Non existing endpoint
+        """
+        configTemplate = """
+            newServer{address="127.0.0.1:53"}
+            local endpoint = newNetworkEndpoint('/this/path/does/not/exist')
+            if endpoint == nil then
+              os.exit(1)
+            end
+            if endpoint:isValid() then
+              os.exit(2)
+            end
+            if endpoint:send('test') then
+              os.exit(3)
+            end
+            os.exit(0)
+        """
+
+        self.checkDNSDistExitCode(configTemplate, 0)
+
+    def testClientMode(self):
+        """
+        NetworkBindings: Client mode
+        """
+        configTemplate = """
+            newServer{address="127.0.0.1:53"}
+            local endpoint = newNetworkEndpoint('/this/path/does/not/exist')
+            if endpoint == nil then
+              os.exit(1)
+            end
+            if endpoint:isValid() then
+              os.exit(2)
+            end
+            if endpoint:send('test') then
+              os.exit(3)
+            end
+            local listener = newNetworkListener()
+            if listener == nil then
+              os.exit(4)
+            end
+            local endpointId = 1
+            local function callback(_, _, _)
+            end
+            if listener:addUnixListeningEndpoint('/path', 1, callback) then
+              os.exit(5)
+            end
+            listener:start()
+            os.exit(0)
+        """
+
+        self.checkDNSDistExitCode(configTemplate, 0, clientMode=True)
+
+    def testGetResolvers(self):
+        """
+        NetworkBindings: getResolvers
+        """
+        configTemplate = """
+            newServer{address="127.0.0.1:53"}
+            local resolvers = getResolvers('resolv.conf.sample')
+            if #resolvers ~= 2 then
+              os.exit(1)
+            end
+            if resolvers[1] ~= '9.9.9.9' then
+              os.exit(2)
+            end
+            if resolvers[2] ~= '2620:fe::fe' then
+              os.exit(2)
+            end
+            os.exit(0)
+        """
+
+        self.checkDNSDistExitCode(configTemplate, 0, clientMode=True)
+
+    def testCommunication(self):
+        """
+        NetworkBindings: Communication
+        """
+        configTemplate = """
+            newServer{address="127.0.0.1:53"}
+            local listener = newNetworkListener()
+            if listener == nil then
+              os.exit(1)
+            end
+            local endpointId = 1
+
+            local function callback(id, dgram, _)
+              -- this function will never get called because we are holding the Lua lock
+            end
+
+            if not listener:addUnixListeningEndpoint('/tmp/dnsdist.network-bindings.test', 1, callback) then
+              os.exit(4)
+            end
+            --listener:start()
+
+            local endpoint = newNetworkEndpoint('/tmp/dnsdist.network-bindings.test')
+            if endpoint == nil then
+              os.exit(5)
+            end
+            if not endpoint:isValid() then
+              os.exit(6)
+            end
+            if not endpoint:send('test') then
+              os.exit(7)
+            end
+            os.exit(0)
+        """
+
+        self.checkDNSDistExitCode(configTemplate, 0)