From: Remi Gacogne Date: Mon, 24 Jan 2022 16:53:54 +0000 (+0100) Subject: dnsdist: Add more unit tests for the Lua network helpers X-Git-Tag: dnsdist-1.8.0-rc1~285^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=94833a51f3fda13d9a452f46eb01e84469613d6c;p=thirdparty%2Fpdns.git dnsdist: Add more unit tests for the Lua network helpers --- diff --git a/pdns/dnsdistdist/test-dnsdistluanetwork.cc b/pdns/dnsdistdist/test-dnsdistluanetwork.cc index d649522588..1255418576 100644 --- a/pdns/dnsdistdist/test-dnsdistluanetwork.cc +++ b/pdns/dnsdistdist/test-dnsdistluanetwork.cc @@ -55,6 +55,106 @@ BOOST_AUTO_TEST_CASE(test_Basic) close(fd); } +BOOST_AUTO_TEST_CASE(test_Exceptions) +{ + std::string payload = {'h', 'e', 'l', 'l', 'o'}; + char socketPath[] = "/tmp/test_dnsdistluanetwork.XXXXXX"; + int fd = mkstemp(socketPath); + BOOST_REQUIRE(fd >= 0); + + { + dnsdist::NetworkListener listener; + /* try running while empty */ + struct timeval now; + BOOST_CHECK_THROW(listener.runOnce(now, 1000), std::runtime_error); + } + + { + /* invalid path */ + dnsdist::NetworkListener listener; + BOOST_CHECK_THROW(listener.addUnixListeningEndpoint(std::string(), 0, + [](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) {}), + std::runtime_error); + + bool caught = false; + try { + std::string empty; + dnsdist::NetworkEndpoint endpoint(empty); + } + catch (const std::runtime_error& e) { + caught = true; + } + BOOST_CHECK(caught); + } + + { + dnsdist::NetworkListener listener; + bool received = false; + listener.addUnixListeningEndpoint(socketPath, 0, [&received](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) { + received = true; + }); + + dnsdist::NetworkEndpoint client(socketPath); + BOOST_CHECK(client.send(payload)); + + struct timeval now; + listener.runOnce(now, 1000); + BOOST_CHECK(received); + + char otherSocketPath[] = "/tmp/test_dnsdistluanetworkOtherPath"; + /* try binding when already running */ + bool raised = false; + try { + listener.addUnixListeningEndpoint(otherSocketPath, 0, + [](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) {}); + } + catch (const std::runtime_error& e) { + raised = true; + BOOST_CHECK_EQUAL(e.what(), "NetworkListener should not be altered at runtime"); + } + BOOST_CHECK(raised); + } + + { + dnsdist::NetworkListener listener; + bool received = false; + listener.addUnixListeningEndpoint(socketPath, 0, [&received](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) { + received = true; + throw std::runtime_error("Test exception"); + }); + + dnsdist::NetworkEndpoint client(socketPath); + BOOST_CHECK(client.send(payload)); + + struct timeval now; + listener.runOnce(now, 1000); + BOOST_CHECK(received); + } + + { + class UnexpectedException + { + }; + + dnsdist::NetworkListener listener; + bool received = false; + listener.addUnixListeningEndpoint(socketPath, 0, [&received](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) { + received = true; + throw UnexpectedException(); + }); + + dnsdist::NetworkEndpoint client(socketPath); + BOOST_CHECK(client.send(payload)); + + struct timeval now; + listener.runOnce(now, 1000); + BOOST_CHECK(received); + } + + unlink(socketPath); + close(fd); +} + #ifdef __linux__ BOOST_AUTO_TEST_CASE(test_Abstract) { @@ -78,6 +178,43 @@ BOOST_AUTO_TEST_CASE(test_Abstract) listener.runOnce(now, 1000); BOOST_CHECK(received); } + +BOOST_AUTO_TEST_CASE(test_Abstract_Exceptions) +{ + dnsdist::NetworkListener listener; + std::string socketPath("test_dnsdistluanetwork"); + socketPath.insert(0, 1, 0); + bool received = false; + listener.addUnixListeningEndpoint(socketPath, 0, [&received](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) { + received = true; + }); + + /* try binding twice to the same path */ + bool raised = false; + try { + listener.addUnixListeningEndpoint(socketPath, 0, [](dnsdist::NetworkListener::EndpointID endpoint, std::string&& dgram, const std::string& from) {}); + } + catch (const std::runtime_error& e) { + raised = true; + BOOST_CHECK(boost::starts_with(e.what(), "Error binding Unix socket to path")); + } + BOOST_CHECK(raised); + + { + /* try connecting to a non-existing path */ + raised = false; + std::string nonExistingPath("test_dnsdistluanetwork_non_existing"); + nonExistingPath.insert(0, 1, 0); + try { + dnsdist::NetworkEndpoint endpoint(nonExistingPath); + } + catch (const std::runtime_error& e) { + raised = true; + } + BOOST_CHECK(raised); + } +} + #endif /* __linux__ */ BOOST_AUTO_TEST_SUITE_END();