From bef4e61fc6b6d0ea1442b0e2f6dd0cb5fe6aa6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Fri, 13 Mar 2026 15:08:26 -0400 Subject: [PATCH] tests: add test for update of listen token --- tests/test_networkengine.cpp | 45 ++++++++++++++++++++++++++++++++++++ tests/test_networkengine.h | 2 ++ 2 files changed, 47 insertions(+) diff --git a/tests/test_networkengine.cpp b/tests/test_networkengine.cpp index c10b8a8e..01171dea 100644 --- a/tests/test_networkengine.cpp +++ b/tests/test_networkengine.cpp @@ -352,6 +352,51 @@ NetworkEngineTester::testListenConfirmationCarriesToken() CPPUNIT_ASSERT(reply.token == responseToken); } +void +NetworkEngineTester::testListenConfirmationUpdatesSearchNodeToken() +{ + Config config {}; + config.max_req_per_sec = -1; + config.max_peer_req_per_sec = -1; + + auto rd = std::make_unique(6); + Dht localDht(std::make_unique(), config, {}, std::move(rd)); + + auto node = std::make_shared(InfoHash::getRandom(localDht.rd), + makeIPv4("127.0.0.2", 5006), + localDht.rd, + false); + auto sr = std::make_shared(); + auto query = std::make_shared(); + ValueCallback valueCallback = [](const std::vector>&, bool) { + return true; + }; + + sr->id = InfoHash::getRandom(localDht.rd); + sr->af = AF_INET; + sr->nextSearchStep = localDht.scheduler.add(time_point::max(), [] {}); + sr->listeners.emplace(1, Dht::Search::SearchListener {query, valueCallback, {}}); + + auto searchNode = std::make_unique(node); + auto socketId = node->openSocket([](const Sp&, net::RequestAnswer&&) {}); + searchNode->listenStatus.emplace(std::piecewise_construct, + std::forward_as_tuple(query), + std::forward_as_tuple(valueCallback, dht::SyncCallback {}, socketId)); + auto* searchNodePtr = sr->nodes.emplace_back(std::move(searchNode)).get(); + + CPPUNIT_ASSERT(searchNodePtr->token.empty()); + CPPUNIT_ASSERT(!searchNodePtr->isSynced(localDht.scheduler.time())); + + net::RequestAnswer answer {}; + answer.ntoken = Blob {0xaa, 0xbb, 0xcc, 0xdd}; + + localDht.onListenDone(node, answer, sr); + + CPPUNIT_ASSERT(searchNodePtr->token == answer.ntoken); + CPPUNIT_ASSERT(searchNodePtr->last_get_reply == localDht.scheduler.time()); + CPPUNIT_ASSERT(searchNodePtr->isSynced(localDht.scheduler.time())); +} + void NetworkEngineTester::testListenReopensSocketAfterNodeExpiration() { diff --git a/tests/test_networkengine.h b/tests/test_networkengine.h index 3c1ce878..1390a563 100644 --- a/tests/test_networkengine.h +++ b/tests/test_networkengine.h @@ -14,6 +14,7 @@ class NetworkEngineTester : public CppUnit::TestFixture CPPUNIT_TEST(testCompletesPartialSessionFromSameSource); CPPUNIT_TEST(testKeepsSessionForWrongSourceFragment); CPPUNIT_TEST(testListenConfirmationCarriesToken); + CPPUNIT_TEST(testListenConfirmationUpdatesSearchNodeToken); CPPUNIT_TEST(testListenReopensSocketAfterNodeExpiration); CPPUNIT_TEST(testUnauthorizedListenFlushClearsListenState); CPPUNIT_TEST_SUITE_END(); @@ -26,6 +27,7 @@ public: void testCompletesPartialSessionFromSameSource(); void testKeepsSessionForWrongSourceFragment(); void testListenConfirmationCarriesToken(); + void testListenConfirmationUpdatesSearchNodeToken(); void testListenReopensSocketAfterNodeExpiration(); void testUnauthorizedListenFlushClearsListenState(); };