From: Remi Gacogne Date: Fri, 29 Jan 2021 10:24:30 +0000 (+0100) Subject: dnsdist: Add unit tests for the connection management code X-Git-Tag: dnsdist-1.6.0-alpha1~4^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6cf749d53fa54fc1462ae723e5f18018a1ca112a;p=thirdparty%2Fpdns.git dnsdist: Add unit tests for the connection management code --- diff --git a/pdns/dnsdistdist/Makefile.am b/pdns/dnsdistdist/Makefile.am index da64c8c9b9..be29ab34ee 100644 --- a/pdns/dnsdistdist/Makefile.am +++ b/pdns/dnsdistdist/Makefile.am @@ -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 index 0000000000..34432f2902 --- /dev/null +++ b/pdns/dnsdistdist/test-connectionmanagement_hh.cc @@ -0,0 +1,93 @@ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_NO_MAIN + +#include + +#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()