diff --git a/tests/dhtrunnertester.cpp b/tests/dhtrunnertester.cpp index 9028653fcb052cf455825004b8cd16c7291dfc06..b59a20e1d26a4378c05bd70f64a09d64c18ad7e0 100644 --- a/tests/dhtrunnertester.cpp +++ b/tests/dhtrunnertester.cpp @@ -23,6 +23,7 @@ #include <mutex> #include <condition_variable> using namespace std::chrono_literals; +using namespace std::literals; namespace test { CPPUNIT_TEST_SUITE_REGISTRATION(DhtRunnerTester); @@ -173,6 +174,76 @@ DhtRunnerTester::testListen() { node1.cancelListen(d, tokend); } +void +DhtRunnerTester::testIdOps() { + std::mutex mutex; + std::condition_variable cv; + unsigned valueCount(0); + + dht::DhtRunner::Config config2; + config2.dht_config.node_config.max_peer_req_per_sec = -1; + config2.dht_config.node_config.max_req_per_sec = -1; + config2.dht_config.id = dht::crypto::generateIdentity(); + + dht::DhtRunner::Context context2; + context2.identityAnnouncedCb = [&](bool ok) { + CPPUNIT_ASSERT(ok); + std::lock_guard<std::mutex> lk(mutex); + valueCount++; + cv.notify_all(); + }; + + node2.join(); + node2.run(42232, config2, std::move(context2)); + node2.bootstrap(node1.getBound()); + + node1.findCertificate(node2.getId(), [&](const std::shared_ptr<dht::crypto::Certificate>& crt){ + CPPUNIT_ASSERT(crt); + std::lock_guard<std::mutex> lk(mutex); + valueCount++; + cv.notify_all(); + }); + + { + std::unique_lock<std::mutex> lk(mutex); + CPPUNIT_ASSERT(cv.wait_for(lk, 20s, [&]{ return valueCount == 2; })); + } + + dht::DhtRunner::Context context1; + context1.identityAnnouncedCb = [&](bool ok) { + CPPUNIT_ASSERT(ok); + std::lock_guard<std::mutex> lk(mutex); + valueCount++; + cv.notify_all(); + }; + + config2.dht_config.id = dht::crypto::generateIdentity(); + node1.join(); + node1.run(42222, config2, std::move(context1)); + node1.bootstrap(node2.getBound()); + + auto key = dht::InfoHash::get("key"); + node1.putEncrypted(key, node2.getId(), dht::Value("yo"), [&](bool ok){ + CPPUNIT_ASSERT(ok); + std::lock_guard<std::mutex> lk(mutex); + valueCount++; + cv.notify_all(); + }); + + node2.listen<std::string>(key, [&](std::string&& value){ + CPPUNIT_ASSERT_EQUAL("yo"s, value); + std::lock_guard<std::mutex> lk(mutex); + valueCount++; + cv.notify_all(); + return false; + }); + + { + std::unique_lock<std::mutex> lk(mutex); + CPPUNIT_ASSERT(cv.wait_for(lk, 20s, [&]{ return valueCount == 4; })); + } +} + void DhtRunnerTester::testListenLotOfBytes() { std::mutex mutex; diff --git a/tests/dhtrunnertester.h b/tests/dhtrunnertester.h index 1d2338205ce2c2a9c21616c1f7f38ff5a0339dab..765f1cb627f50303d8a225fb8c26e6fc6b183a63 100644 --- a/tests/dhtrunnertester.h +++ b/tests/dhtrunnertester.h @@ -33,6 +33,7 @@ class DhtRunnerTester : public CppUnit::TestFixture { CPPUNIT_TEST(testGetPut); CPPUNIT_TEST(testListen); CPPUNIT_TEST(testListenLotOfBytes); + CPPUNIT_TEST(testIdOps); CPPUNIT_TEST_SUITE_END(); dht::DhtRunner node1 {}; @@ -58,6 +59,10 @@ class DhtRunnerTester : public CppUnit::TestFixture { * Test listen method */ void testListen(); + /** + * Test methods requiring a node identity + */ + void testIdOps(); /** * Test listen method with lot of datas */