5#include <gtest/gtest.h>
14class mock_collector_plugin :
public collector_plugin {
16 explicit mock_collector_plugin(std::string_view name,
18 bool available =
true)
21 auto name() const -> std::string_view
override {
return name_; }
23 auto collect() -> std::vector<metric>
override {
28 auto interval() const -> std::chrono::milliseconds
override {
29 return std::chrono::seconds(1);
32 auto is_available() const ->
bool override {
return available_; }
34 auto get_metadata() const -> plugin_metadata
override {
35 return plugin_metadata{
37 .description =
"Mock plugin for testing",
41 .requires_platform_support =
false
45 auto initialize(
const config_map& ) ->
bool override {
52 auto get_metric_types() const -> std::vector<std::
string>
override {
53 return {
"test_metric"};
71class CollectorRegistryTest :
public ::testing::Test {
73 void SetUp()
override {
78 void TearDown()
override {
85TEST_F(CollectorRegistryTest, SingletonInstance) {
89 EXPECT_EQ(®istry1, ®istry2);
93TEST_F(CollectorRegistryTest, RegisterPlugin) {
96 auto plugin = std::make_unique<mock_collector_plugin>(
"test_plugin");
97 EXPECT_TRUE(registry.register_plugin(std::move(plugin)));
99 EXPECT_TRUE(registry.has_plugin(
"test_plugin"));
100 EXPECT_EQ(registry.plugin_count(), 1);
104TEST_F(CollectorRegistryTest, RejectsDuplicateRegistration) {
107 auto plugin1 = std::make_unique<mock_collector_plugin>(
"test_plugin");
108 EXPECT_TRUE(registry.register_plugin(std::move(plugin1)));
110 auto plugin2 = std::make_unique<mock_collector_plugin>(
"test_plugin");
111 EXPECT_FALSE(registry.register_plugin(std::move(plugin2)));
113 EXPECT_EQ(registry.plugin_count(), 1);
117TEST_F(CollectorRegistryTest, RejectsUnavailablePlugin) {
121 EXPECT_FALSE(registry.register_plugin(std::move(plugin)));
123 EXPECT_FALSE(registry.has_plugin(
"unavailable"));
124 EXPECT_EQ(registry.plugin_count(), 0);
128TEST_F(CollectorRegistryTest, GetPlugin) {
131 auto plugin = std::make_unique<mock_collector_plugin>(
"test_plugin");
132 auto* plugin_ptr = plugin.get();
133 registry.register_plugin(std::move(plugin));
135 auto* retrieved = registry.get_plugin(
"test_plugin");
136 EXPECT_EQ(retrieved, plugin_ptr);
138 auto*
not_found = registry.get_plugin(
"nonexistent");
143TEST_F(CollectorRegistryTest, GetAllPlugins) {
146 registry.register_plugin(std::make_unique<mock_collector_plugin>(
"plugin1"));
147 registry.register_plugin(std::make_unique<mock_collector_plugin>(
"plugin2"));
148 registry.register_plugin(std::make_unique<mock_collector_plugin>(
"plugin3"));
150 auto plugins = registry.get_plugins();
151 EXPECT_EQ(plugins.size(), 3);
155TEST_F(CollectorRegistryTest, GetPluginsByCategory) {
163 EXPECT_EQ(hw_plugins.size(), 2);
166 EXPECT_EQ(sys_plugins.size(), 1);
169 EXPECT_EQ(net_plugins.size(), 0);
173TEST_F(CollectorRegistryTest, UnregisterPlugin) {
176 auto plugin = std::make_unique<mock_collector_plugin>(
"test_plugin");
177 registry.register_plugin(std::move(plugin));
179 EXPECT_TRUE(registry.has_plugin(
"test_plugin"));
180 EXPECT_TRUE(registry.unregister_plugin(
"test_plugin"));
181 EXPECT_FALSE(registry.has_plugin(
"test_plugin"));
185TEST_F(CollectorRegistryTest, UnregisterNonexistentPlugin) {
188 EXPECT_FALSE(registry.unregister_plugin(
"nonexistent"));
192TEST_F(CollectorRegistryTest, InitializeAllPlugins) {
195 auto plugin1 = std::make_unique<mock_collector_plugin>(
"plugin1");
196 auto plugin2 = std::make_unique<mock_collector_plugin>(
"plugin2");
197 auto* ptr1 = plugin1.get();
198 auto* ptr2 = plugin2.get();
200 registry.register_plugin(std::move(plugin1));
201 registry.register_plugin(std::move(plugin2));
203 auto initialized_count = registry.initialize_all();
204 EXPECT_EQ(initialized_count, 2);
206 EXPECT_TRUE(ptr1->is_initialized());
207 EXPECT_TRUE(ptr2->is_initialized());
211TEST_F(CollectorRegistryTest, ShutdownAllPlugins) {
214 auto plugin1 = std::make_unique<mock_collector_plugin>(
"plugin1");
215 auto plugin2 = std::make_unique<mock_collector_plugin>(
"plugin2");
216 auto* ptr1 = plugin1.get();
217 auto* ptr2 = plugin2.get();
219 registry.register_plugin(std::move(plugin1));
220 registry.register_plugin(std::move(plugin2));
221 registry.initialize_all();
223 registry.shutdown_all();
225 EXPECT_TRUE(ptr1->is_shutdown_called());
226 EXPECT_TRUE(ptr2->is_shutdown_called());
230TEST_F(CollectorRegistryTest, ShutdownOnUnregister) {
233 auto plugin = std::make_unique<mock_collector_plugin>(
"test_plugin");
234 auto* ptr = plugin.get();
236 registry.register_plugin(std::move(plugin));
237 registry.initialize_all();
239 EXPECT_TRUE(ptr->is_initialized());
240 EXPECT_FALSE(ptr->is_shutdown_called());
242 registry.unregister_plugin(
"test_plugin");
244 EXPECT_TRUE(ptr->is_shutdown_called());
248TEST_F(CollectorRegistryTest, GetRegistryStats) {
255 auto stats = registry.get_registry_stats();
257 EXPECT_EQ(stats[
"total_plugins"], 3);
258 EXPECT_EQ(stats[
"available_plugins"], 3);
259 EXPECT_EQ(stats[
"category_hardware_count"], 2);
260 EXPECT_EQ(stats[
"category_system_count"], 1);
264TEST_F(CollectorRegistryTest, RegisterFactory) {
267 registry.register_factory<mock_collector_plugin>(
"lazy_plugin");
269 EXPECT_TRUE(registry.has_plugin(
"lazy_plugin"));
270 EXPECT_EQ(registry.plugin_count(), 1);
273 auto stats = registry.get_registry_stats();
274 EXPECT_EQ(stats[
"total_plugins"], 0);
278TEST_F(CollectorRegistryTest, FactoryInstantiatesOnGet) {
281 registry.register_factory<mock_collector_plugin>(
"lazy_plugin");
283 auto* plugin = registry.get_plugin(
"lazy_plugin");
284 EXPECT_NE(plugin,
nullptr);
287 auto stats = registry.get_registry_stats();
288 EXPECT_EQ(stats[
"total_plugins"], 1);
292TEST_F(CollectorRegistryTest, ClearRemovesAllPlugins) {
295 registry.register_plugin(std::make_unique<mock_collector_plugin>(
"plugin1"));
296 registry.register_plugin(std::make_unique<mock_collector_plugin>(
"plugin2"));
298 EXPECT_EQ(registry.plugin_count(), 2);
302 EXPECT_EQ(registry.plugin_count(), 0);
static auto instance() -> collector_registry &
Get the singleton instance.
Registry for managing collector plugin lifecycle.
plugin_category
Categorization of collector plugins.
@ hardware
Hardware sensors (GPU, temperature, battery, power)
@ system
System integration (threads, loggers, containers)
@ custom
User-defined plugins.
@ network
Network metrics (connectivity, bandwidth)
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
TEST_F(AdaptiveMonitoringTest, AdaptiveConfigDefaults)
plugin_category category_