]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add more unit tests for the Lua network helpers
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 24 Jan 2022 16:53:54 +0000 (17:53 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 7 Oct 2022 15:48:05 +0000 (17:48 +0200)
pdns/dnsdistdist/test-dnsdistluanetwork.cc

index d6495225888afc75c049408d536b821b699dda51..125541857672421cbb78d0072437f69db26946a3 100644 (file)
@@ -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();