]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add unit tests for the connection management code 9997/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 29 Jan 2021 10:24:30 +0000 (11:24 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 29 Jan 2021 10:24:30 +0000 (11:24 +0100)
pdns/dnsdistdist/Makefile.am
pdns/dnsdistdist/test-connectionmanagement_hh.cc [new file with mode: 0644]

index da64c8c9b9fedff13c09e581e7e7a2055458e8f8..be29ab34ee9138c0542291259f1419570db929e9 100644 (file)
@@ -220,6 +220,7 @@ testrunner_SOURCES = \
        bpf-filter.cc bpf-filter.hh \
        cachecleaner.hh \
        circular_buffer.hh \
+       connection-management.hh \
        dns.cc dns.hh \
        dnscrypt.cc dnscrypt.hh \
        dnsdist-backend.cc \
@@ -263,6 +264,7 @@ testrunner_SOURCES = \
        statnode.cc statnode.hh \
        svc-records.cc svc-records.hh \
        test-base64_cc.cc \
+       test-connectionmanagement_hh.cc \
        test-delaypipe_hh.cc \
        test-dnscrypt_cc.cc \
        test-dnsdist_cc.cc \
diff --git a/pdns/dnsdistdist/test-connectionmanagement_hh.cc b/pdns/dnsdistdist/test-connectionmanagement_hh.cc
new file mode 100644 (file)
index 0000000..34432f2
--- /dev/null
@@ -0,0 +1,93 @@
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_NO_MAIN
+
+#include <boost/test/unit_test.hpp>
+
+#include "connection-management.hh"
+
+BOOST_AUTO_TEST_SUITE(connectionmanagement_hh)
+
+BOOST_AUTO_TEST_CASE(test_ConnectionManagementEnabled) {
+  size_t maxConns = 10;
+
+  ConcurrentConnectionManager manager(maxConns);
+
+  for (size_t idx = 0; idx < maxConns; idx++) {
+    BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  }
+
+  /* we are full */
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  manager.releaseConnection();
+  /* we can register one additional connection now that we released one */
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  /* but not two */
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  /* raise the number of slots */
+  maxConns = 12;
+  manager.setMaxConcurrentConnections(maxConns);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  /* release everything */
+  for (size_t idx = 0; idx < maxConns; idx++) {
+    manager.releaseConnection();
+  }
+
+  /* decrease the number of slots */
+  maxConns = 2;
+  manager.setMaxConcurrentConnections(maxConns);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  /* decrease the number of slots with some connections still registered */
+  maxConns = 1;
+  manager.setMaxConcurrentConnections(maxConns);
+
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+  for (size_t idx = 0; idx < 2; idx++) {
+    manager.releaseConnection();
+  }
+
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+}
+
+BOOST_AUTO_TEST_CASE(test_ConnectionManagementDisabledThenEnabled) {
+  /* 0 means no limit */
+  size_t maxConns = 0;
+  ConcurrentConnectionManager manager(maxConns);
+
+  for (size_t idx = 0; idx < 10; idx++) {
+    BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  }
+
+  /* set a limit to 5 connections */
+  maxConns = 5;
+  manager.setMaxConcurrentConnections(maxConns);
+  /* we can no longer register new sessions */
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  /* release all of them */
+  for (size_t idx = 0; idx < 10; idx++) {
+    manager.releaseConnection();
+  }
+
+  /* register as many as we now can */
+  for (size_t idx = 0; idx < maxConns; idx++) {
+    BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+  }
+
+  BOOST_CHECK_EQUAL(manager.registerConnection(), false);
+
+  manager.releaseConnection();
+
+  BOOST_CHECK_EQUAL(manager.registerConnection(), true);
+}
+
+BOOST_AUTO_TEST_SUITE_END()