]> granicus.if.org Git - pdns/commitdiff
add tests for lock.hh
authorbert hubert <bert.hubert@powerdns.com>
Fri, 7 Apr 2017 13:09:01 +0000 (15:09 +0200)
committerbert hubert <bert.hubert@powerdns.com>
Fri, 7 Apr 2017 13:09:01 +0000 (15:09 +0200)
pdns/Makefile.am
pdns/test-lock_hh.cc [new file with mode: 0644]

index 50ebea9123d65f44ccbd21b4a22e0fbb10401753..48acdbe8f43146d929cde6611c74dbb4477ef472 100644 (file)
@@ -1156,6 +1156,7 @@ testrunner_SOURCES = \
        test-dnsparser_hh.cc \
        test-dnsrecords_cc.cc \
        test-iputils_hh.cc \
+       test-lock_hh.cc \
        test-md5_hh.cc \
        test-misc_hh.cc \
        test-nameserver_cc.cc \
diff --git a/pdns/test-lock_hh.cc b/pdns/test-lock_hh.cc
new file mode 100644 (file)
index 0000000..707dcc1
--- /dev/null
@@ -0,0 +1,54 @@
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_NO_MAIN
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <boost/test/unit_test.hpp>
+#include "lock.hh"
+#include <thread>
+
+using namespace boost;
+
+BOOST_AUTO_TEST_SUITE(test_lock_hh)
+
+static std::vector<std::unique_ptr<pthread_rwlock_t> > g_locks;
+
+static void lthread()
+{
+  std::vector<ReadLock> rlocks;
+  for(auto& pp : g_locks)
+    rlocks.emplace_back(&*pp);
+  
+}
+
+BOOST_AUTO_TEST_CASE(test_pdns_lock)
+{
+  for(unsigned int n=0; n < 1000; ++n) {
+    auto p = new pthread_rwlock_t;
+    pthread_rwlock_init(p, 0);
+    g_locks.emplace_back(p);
+  }
+
+  std::vector<ReadLock> rlocks;
+  for(auto& pp : g_locks)
+    rlocks.emplace_back(&*pp);
+
+  std::thread thr(lthread);
+  thr.join();
+  rlocks.clear();
+
+  std::vector<WriteLock> wlocks;
+  for(auto& pp : g_locks)
+    wlocks.emplace_back(&*pp);
+
+  TryReadLock trl(&*g_locks[0]);
+  BOOST_CHECK(!trl.gotIt());
+
+  wlocks.clear();
+  TryReadLock trl2(&*g_locks[0]);
+  BOOST_CHECK(trl2.gotIt());
+  
+  
+}
+
+BOOST_AUTO_TEST_SUITE_END()