diff --git a/test/unitTest/namedirectory/namedirectory.cpp b/test/unitTest/namedirectory/namedirectory.cpp index df73816799566ee836259543dbeca097bf3e1dc0..301f7ba47cb2c683bc21a4717554ad8e87b882fe 100644 --- a/test/unitTest/namedirectory/namedirectory.cpp +++ b/test/unitTest/namedirectory/namedirectory.cpp @@ -52,43 +52,79 @@ public: // Init daemon libjami::init( libjami::InitFlag(libjami::LIBJAMI_FLAG_DEBUG | libjami::LIBJAMI_FLAG_CONSOLE_LOG)); - if (not Manager::instance().initialized) + if (not Manager::instance().initialized) { CPPUNIT_ASSERT(libjami::start("jami-sample.yml")); - // Create express router for our service. - auto router = std::make_unique<router::express_router_t<>>(); - router->http_post( - R"(/name/:name)", - [](auto req, auto params) { - const auto qp = parse_query(req->header().query()); - return req->create_response() - .set_body( - fmt::format("{{\"success\":true}}") - ) - .done(); - }); + // Create express router for our service. + auto router = std::make_unique<router::express_router_t<>>(); + router->http_post( + R"(/name/:name)", + [](auto req, auto params) { + const auto qp = parse_query(req->header().query()); + return req->create_response() + .set_body( + fmt::format("{{\"success\":true}}") + ) + .done(); + }); + router->http_get( + R"(/name/:name)", + [](auto req, auto params) { + const auto qp = parse_query(req->header().query()); + if (params["name"] == "taken") { + return req->create_response() + .set_body( + fmt::format("{{\"name\":\"taken\",\"addr\":\"c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de\"}}") + ) + .done(); + } + return req->create_response(restinio::status_not_found()) + .set_body( + fmt::format("{{\"error\":\"name not registered\"}}") + ) + .done(); + }); + router->http_get( + R"(/addr/:addr)", + [](auto req, auto params) { + const auto qp = parse_query(req->header().query()); + if (params["addr"] == "c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de") { + return req->create_response() + .set_body( + fmt::format("{{\"name\":\"taken\",\"addr\":\"c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de\"}}") + ) + .done(); + } + return req->create_response(restinio::status_not_found()) + .set_body( + fmt::format("{{\"error\":\"address not registered\"}}") + ) + .done(); + }); - router->non_matched_request_handler( - [](auto req){ - return req->create_response(restinio::status_not_found()).connection_close().done(); - }); + router->non_matched_request_handler( + [](auto req){ + return req->create_response(restinio::status_not_found()).connection_close().done(); + }); - auto settings = restinio::run_on_this_thread_settings_t<RestRouterTraits>(); - settings.address("localhost"); - settings.port(1412); - settings.request_handler(std::move(router)); - httpServer_ = std::make_unique<restinio::http_server_t<RestRouterTraits>>( - Manager::instance().ioContext(), - std::forward<restinio::run_on_this_thread_settings_t<RestRouterTraits>>(std::move(settings)) - ); - // run http server - serverThread_ = std::thread([this](){ - httpServer_->open_async([]{/*ok*/}, [](std::exception_ptr ex){ - std::rethrow_exception(ex); + auto settings = restinio::run_on_this_thread_settings_t<RestRouterTraits>(); + settings.address("localhost"); + settings.port(1412); + settings.request_handler(std::move(router)); + httpServer_ = std::make_unique<restinio::http_server_t<RestRouterTraits>>( + Manager::instance().ioContext(), + std::forward<restinio::run_on_this_thread_settings_t<RestRouterTraits>>(std::move(settings)) + ); + // run http server + serverThread_ = std::thread([this](){ + httpServer_->open_async([]{/*ok*/}, [](std::exception_ptr ex){ + std::rethrow_exception(ex); + }); + httpServer_->io_context().run(); }); - httpServer_->io_context().run(); - }); + } + } ~NameDirectoryTest() { libjami::fini(); @@ -107,9 +143,21 @@ public: private: void testRegisterName(); + void testLookupName(); + void testLookupNameInvalid(); + void testLookupNameNotFound(); + void testLookupAddr(); + void testLookupAddrInvalid(); + void testLookupAddrNotFound(); CPPUNIT_TEST_SUITE(NameDirectoryTest); CPPUNIT_TEST(testRegisterName); + CPPUNIT_TEST(testLookupName); + CPPUNIT_TEST(testLookupNameInvalid); + CPPUNIT_TEST(testLookupNameNotFound); + CPPUNIT_TEST(testLookupAddr); + CPPUNIT_TEST(testLookupAddrInvalid); + CPPUNIT_TEST(testLookupAddrNotFound); CPPUNIT_TEST_SUITE_END(); }; @@ -152,6 +200,138 @@ NameDirectoryTest::testRegisterName() CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameRegistered; })); } +void +NameDirectoryTest::testLookupName() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool nameFound {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + nameFound = status == 0; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "taken")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameFound; })); +} + +void +NameDirectoryTest::testLookupNameInvalid() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool nameInvalid {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + nameInvalid = status == 1; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "====")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameInvalid; })); +} + +void +NameDirectoryTest::testLookupNameNotFound() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool nameNotFound {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + nameNotFound = status == 2; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "nottaken")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return nameNotFound; })); +} + +void +NameDirectoryTest::testLookupAddr() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool addrFound {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + addrFound = status == 0; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupAddress(aliceId, "", "c0dec0dec0dec0dec0dec0dec0dec0dec0dec0de")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrFound; })); +} + +void +NameDirectoryTest::testLookupAddrInvalid() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool addrInvalid {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + addrInvalid = status == 1; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupName(aliceId, "", "====")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrInvalid; })); +} + +void +NameDirectoryTest::testLookupAddrNotFound() +{ + std::mutex mtx; + std::unique_lock<std::mutex> lk {mtx}; + std::condition_variable cv; + std::map<std::string, std::shared_ptr<libjami::CallbackWrapperBase>> confHandlers; + bool addrNotFound {false}; + // Watch signals + confHandlers.insert(libjami::exportable_callback<libjami::ConfigurationSignal::RegisteredNameFound>( + [&](const std::string&, + int status, + const std::string&, + const std::string&) { + addrNotFound = status == 2; + cv.notify_one(); + })); + libjami::registerSignalHandlers(confHandlers); + CPPUNIT_ASSERT(libjami::lookupAddress(aliceId, "", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&] { return addrNotFound; })); +} + } // namespace test } // namespace jami