diff --git a/tests/dhtrunnertester.cpp b/tests/dhtrunnertester.cpp index 606aa7cdcb7ea25edb9c79c25520289b2ff61c1f..b3dcbe003767223f8ca89c6842ec44c953113d17 100644 --- a/tests/dhtrunnertester.cpp +++ b/tests/dhtrunnertester.cpp @@ -19,6 +19,8 @@ #include "dhtrunnertester.h" +#include <opendht/thread_pool.h> + #include <chrono> #include <mutex> #include <condition_variable> @@ -298,4 +300,39 @@ DhtRunnerTester::testListenLotOfBytes() { node3.cancelListen(foo, ftokenfoo.get()); } + +void +DhtRunnerTester::testMultithread() { + std::mutex mutex; + std::condition_variable cv; + unsigned putCount(0); + unsigned putOkCount(0); + + constexpr unsigned N = 2048; + + for (unsigned i=0; i<N; i++) { + dht::ThreadPool::computation().run([&]{ + node2.put(dht::InfoHash::get("123" + std::to_string(i)), "hehe", [&](bool ok) { + std::lock_guard<std::mutex> lock(mutex); + putCount++; + if (ok) putOkCount++; + cv.notify_all(); + }); + node2.get(dht::InfoHash::get("123" + std::to_string(N-i-1)), [](const std::shared_ptr<dht::Value>&){ + return true; + }, [&](bool ok) { + std::lock_guard<std::mutex> lock(mutex); + putCount++; + if (ok) putOkCount++; + cv.notify_all(); + }); + }); + } + std::unique_lock<std::mutex> lk(mutex); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]{ return putCount == 2*N; })); + CPPUNIT_ASSERT_EQUAL(2*N, putOkCount); + +} + + } // namespace test diff --git a/tests/dhtrunnertester.h b/tests/dhtrunnertester.h index 765f1cb627f50303d8a225fb8c26e6fc6b183a63..adee2b28c31270b8dec27324ef8dc9b422878183 100644 --- a/tests/dhtrunnertester.h +++ b/tests/dhtrunnertester.h @@ -67,6 +67,11 @@ class DhtRunnerTester : public CppUnit::TestFixture { * Test listen method with lot of datas */ void testListenLotOfBytes(); + /** + * Test multithread + */ + void testMultithread(); + }; } // namespace test