From: Remi Gacogne Date: Wed, 20 Apr 2022 10:22:43 +0000 (+0200) Subject: dnsdist: Better coverage of Lua network bindings X-Git-Tag: dnsdist-1.8.0-rc1~285^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1cfaa5c051b8d5797834fd7eed18e68776e305e8;p=thirdparty%2Fpdns.git dnsdist: Better coverage of Lua network bindings --- diff --git a/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc b/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc index 9f1b917270..5d95a892de 100644 --- a/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc +++ b/pdns/dnsdistdist/dnsdist-lua-bindings-network.cc @@ -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::*)()>("start", [client](std::shared_ptr& 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 index 0000000000..3d768f7ae1 --- /dev/null +++ b/regression-tests.dnsdist/resolv.conf.sample @@ -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 index 0000000000..f90ccd9c27 --- /dev/null +++ b/regression-tests.dnsdist/test_NetworkBindings.py @@ -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)