From: stzuraski898 Date: Wed, 28 Jan 2026 21:48:58 +0000 (+0000) Subject: test/mgr: Add TestMgr scaffolding to support unit tests X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=753da89d7caaae6440cd5206245c8edc348e7564;p=ceph-ci.git test/mgr: Add TestMgr scaffolding to support unit tests Fixes: https://tracker.ceph.com/issues/72938 Signed-off-by: stzuraski898 --- diff --git a/src/test/mgr/TestMgr.h b/src/test/mgr/TestMgr.h new file mode 100644 index 00000000000..ef21de07482 --- /dev/null +++ b/src/test/mgr/TestMgr.h @@ -0,0 +1,190 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include + +#include + +#include "common/async/context_pool.h" +#include "global/global_context.h" +#include "gtest/gtest.h" +#include "messages/MPGStats.h" +#include "mgr/ClusterState.h" +#include "mgr/DaemonState.h" +#include "mon/MgrMap.h" +#include "mon/MonClient.h" +#include "msg/Messenger.h" +#include "osdc/Objecter.h" + +#define dout_subsys ceph_subsys_client + +namespace bs = boost::system; +namespace ca = ceph::async; + +class ClusterStateTestHelper : public ClusterState { +public: + ClusterStateTestHelper( + MonClient* mc_, + Objecter* objecter_, + const MgrMap& mgrmap_) : + ClusterState(mc_, objecter_, mgrmap_) + {} + + const PGMap::Incremental& + test_get_pending_inc() const + { + return pending_inc; + } + + const std::map& + test_get_existing_pools() const + { + return existing_pools; + } + + const PGMap& + test_get_pg_map() const + { + return pg_map; + } + + Objecter* + test_get_objecter() const + { + return objecter; + } +}; + +class TestMgr : public ::testing::Test { +public: + static void + SetUpTestSuite() + { + if (!cct) { + std::vector args = {"unittest_mgr"}; + cct = global_init( + nullptr, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, + CINIT_FLAG_NO_DEFAULT_CONFIG_FILE); + + cct->_conf.set_val("auth_client_required", "none"); + cct->_conf.set_val("auth_cluster_required", "none"); + cct->_conf.set_val("auth_service_required", "none"); + cct->_conf.apply_changes(nullptr); + + common_init_finish(cct.get()); + } + } + + void + SetUp() override + { + icp = std::make_unique(1); + mc = std::make_unique(cct.get(), *icp); + messenger.reset( + Messenger::create_client_messenger(cct.get(), "unittest_mgr")); + objecter = + std::make_unique(cct.get(), messenger.get(), mc.get(), *icp); + + ceph_assert(objecter != nullptr); + objecter->set_client_incarnation(0); + objecter->init(); + + cs = std::make_unique( + mc.get(), objecter.get(), mgr_map); + } + + void + TearDown() override + { + ceph_assert(objecter != nullptr); + ceph_assert(mc != nullptr); + objecter->shutdown(); + mc->shutdown(); + messenger->shutdown(); + messenger->wait(); + + cs.reset(); + objecter.reset(); + mc.reset(); + messenger.reset(); + icp.reset(); + } + +protected: + static inline boost::intrusive_ptr cct; + std::unique_ptr cs; + std::unique_ptr icp; + std::unique_ptr messenger; + std::unique_ptr objecter; + std::unique_ptr mc; + MgrMap mgr_map; + OSDMap osd_map; +}; + +class ClusterStateTest : public TestMgr { +public: + ceph::ref_t device; + + void + SetUp() override + { + TestMgr::SetUp(); + + //Setup pools and notify osdmap + pool.set_pg_num(2); + osd_inc.new_pool_max = 1; + osd_inc.new_pools[1] = pool; + osd_map.apply_incremental(osd_inc); + + cs->with_osdmap_and_pgmap([&](const OSDMap& old_map, const PGMap& pg_map) { + cs->notify_osdmap(osd_map); + }); + + stats->pool_stat[1] = store_statfs_t{}; + stats->set_src(entity_name_t::OSD(0)); + stats->osd_stat.seq = 1; + pgstat.state = PG_STATE_ACTIVE; + pgstat.reported_epoch = 1; + pgstat.reported_seq = 2; + } + + void + ingest_and_pginc() + { + cs->ingest_pgstats(stats); + p_inc = cs->test_get_pending_inc(); + } + +protected: + const mempool::osdmap::map& pools = osd_map.get_pools(); + OSDMap::Incremental osd_inc = OSDMap::Incremental(osd_map.get_epoch() + 1); + ceph::ref_t stats = ceph::make_ref(); + PGMap::Incremental p_inc; + pg_stat_t pgstat; + pg_pool_t pool; +}; + +class DeviceStateTest : public ::testing::Test { +public: + ceph::ref_t device; + + void + SetUp() override + { + device = ceph::make_ref("test_device_111"); + } +}; + +struct PythonEnv : public ::testing::Environment { + void + SetUp() override + { + Py_Initialize(); + } + + void + TearDown() override + { + Py_Finalize(); + } +};