// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. // Unit tests for sessionmanager. #include #include #include #include #include #include #include #include #include LOG_SETUP("sessionmanager_test"); using vespalib::string; using namespace proton; using namespace proton::matching; using vespalib::StateExplorer; using vespalib::steady_time; namespace { void checkStats(SessionManager::Stats stats, uint32_t numInsert, uint32_t numPick, uint32_t numDropped, uint32_t numCached, uint32_t numTimedout) { EXPECT_EQUAL(numInsert, stats.numInsert); EXPECT_EQUAL(numPick, stats.numPick); EXPECT_EQUAL(numDropped, stats.numDropped); EXPECT_EQUAL(numCached, stats.numCached); EXPECT_EQUAL(numTimedout, stats.numTimedout); } TEST("require that SessionManager handles SearchSessions.") { string session_id("foo"); steady_time start(100ns); steady_time doom(1000ns); MatchToolsFactory::UP mtf; SearchSession::OwnershipBundle owned_objects; auto session = std::make_shared(session_id, start, doom, std::move(mtf), std::move(owned_objects)); SessionManager session_manager(10); TEST_DO(checkStats(session_manager.getSearchStats(), 0, 0, 0, 0, 0)); session_manager.insert(std::move(session)); TEST_DO(checkStats(session_manager.getSearchStats(), 1, 0, 0, 1, 0)); session = session_manager.pickSearch(session_id); EXPECT_TRUE(session.get()); TEST_DO(checkStats(session_manager.getSearchStats(), 0, 1, 0, 1, 0)); session_manager.insert(std::move(session)); TEST_DO(checkStats(session_manager.getSearchStats(), 1, 0, 0, 1, 0)); session_manager.pruneTimedOutSessions(steady_time(500ns)); TEST_DO(checkStats(session_manager.getSearchStats(), 0, 0, 0, 1, 0)); session_manager.pruneTimedOutSessions(steady_time(2000ns)); TEST_DO(checkStats(session_manager.getSearchStats(), 0, 0, 0, 0, 1)); session = session_manager.pickSearch(session_id); EXPECT_FALSE(session.get()); } TEST("require that SessionManager can be explored") { steady_time start(100ns); steady_time doom(1000ns); SessionManager session_manager(10); session_manager.insert(std::make_shared("foo", start, doom, MatchToolsFactory::UP(), SearchSession::OwnershipBundle())); session_manager.insert(std::make_shared("bar", start, doom, MatchToolsFactory::UP(), SearchSession::OwnershipBundle())); session_manager.insert(std::make_shared("baz", start, doom, MatchToolsFactory::UP(), SearchSession::OwnershipBundle())); SessionManagerExplorer explorer(session_manager); EXPECT_EQUAL(std::vector({"search"}), explorer.get_children_names()); std::unique_ptr search = explorer.get_child("search"); ASSERT_TRUE(search.get() != nullptr); vespalib::Slime state; vespalib::Slime full_state; search->get_state(vespalib::slime::SlimeInserter(state), false); search->get_state(vespalib::slime::SlimeInserter(full_state), true); EXPECT_EQUAL(3, state.get()["numSessions"].asLong()); EXPECT_EQUAL(3, full_state.get()["numSessions"].asLong()); EXPECT_EQUAL(0u, state.get()["sessions"].entries()); EXPECT_EQUAL(3u, full_state.get()["sessions"].entries()); } } // namespace TEST_MAIN() { TEST_RUN_ALL(); }