Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
test_service_registration.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5
16#include <gtest/gtest.h>
18
19#if KCENON_HAS_COMMON_SYSTEM
20
22#include <kcenon/common/di/service_container.h>
23#include <kcenon/common/interfaces/monitoring_interface.h>
24#include <thread>
25#include <vector>
26#include <atomic>
27
28namespace {
29
30// Use explicit namespace aliases to avoid ambiguity
31namespace common_di = kcenon::common::di;
32namespace monitoring_di = kcenon::monitoring::di;
33namespace interfaces = kcenon::common::interfaces;
34
39class MonitorServiceRegistrationTest : public ::testing::Test {
40protected:
41 void SetUp() override {
42 // Each test gets a fresh container - no need for cleanup
43 }
44
45 void TearDown() override {
46 // Clear the container after each test
47 container_.clear();
48 }
49
54 static monitoring_di::monitor_registration_config default_test_config() {
55 monitoring_di::monitor_registration_config config;
56 config.enable_system_monitoring = false; // Disable to avoid platform issues
57 return config;
58 }
59
60 // Local container instance for test isolation
61 common_di::service_container container_;
62};
63
67TEST_F(MonitorServiceRegistrationTest, RegisterWithDefaultConfig) {
68 auto result = monitoring_di::register_monitor_services(container_, default_test_config());
69
70 ASSERT_TRUE(result.is_ok()) << "Failed to register monitor services";
71 EXPECT_TRUE(container_.is_registered<interfaces::IMonitor>());
72}
73
77TEST_F(MonitorServiceRegistrationTest, ResolveRegisteredService) {
78 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
79 ASSERT_TRUE(reg_result.is_ok());
80
81 auto resolve_result = container_.resolve<interfaces::IMonitor>();
82 ASSERT_TRUE(resolve_result.is_ok()) << "Failed to resolve IMonitor";
83
84 auto monitor = resolve_result.value();
85 EXPECT_NE(monitor, nullptr);
86}
87
91TEST_F(MonitorServiceRegistrationTest, SingletonLifetime) {
92 auto config = default_test_config();
93 config.lifetime = common_di::service_lifetime::singleton;
94
95 auto reg_result = monitoring_di::register_monitor_services(container_, config);
96 ASSERT_TRUE(reg_result.is_ok());
97
98 auto monitor1 = container_.resolve<interfaces::IMonitor>().value();
99 auto monitor2 = container_.resolve<interfaces::IMonitor>().value();
100
101 EXPECT_EQ(monitor1, monitor2) << "Singleton should return same instance";
102}
103
107TEST_F(MonitorServiceRegistrationTest, CustomConfiguration) {
108 auto config = default_test_config();
109 config.monitor_name = "custom_test_monitor";
110 config.cpu_threshold = 95.0;
111 config.memory_threshold = 85.0;
112 config.latency_threshold = std::chrono::milliseconds{500};
113
114 auto result = monitoring_di::register_monitor_services(container_, config);
115 ASSERT_TRUE(result.is_ok());
116
117 auto monitor = container_.resolve<interfaces::IMonitor>().value();
118 EXPECT_NE(monitor, nullptr);
119
120 // Verify configuration was applied by checking the underlying monitor
121 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(monitor);
122 ASSERT_NE(perf_monitor, nullptr);
123
124 auto thresholds = perf_monitor->get_thresholds();
125 EXPECT_DOUBLE_EQ(thresholds.cpu_threshold, 95.0);
126 EXPECT_DOUBLE_EQ(thresholds.memory_threshold, 85.0);
127 EXPECT_EQ(thresholds.latency_threshold, std::chrono::milliseconds{500});
128}
129
133TEST_F(MonitorServiceRegistrationTest, DoubleRegistrationFails) {
134 auto result1 = monitoring_di::register_monitor_services(container_, default_test_config());
135 ASSERT_TRUE(result1.is_ok());
136
137 auto result2 = monitoring_di::register_monitor_services(container_, default_test_config());
138 EXPECT_TRUE(result2.is_err()) << "Double registration should fail";
139}
140
144TEST_F(MonitorServiceRegistrationTest, UnregisterService) {
145 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
146 ASSERT_TRUE(reg_result.is_ok());
147 ASSERT_TRUE(container_.is_registered<interfaces::IMonitor>());
148
149 auto unreg_result = monitoring_di::unregister_monitor_services(container_);
150 ASSERT_TRUE(unreg_result.is_ok());
151 EXPECT_FALSE(container_.is_registered<interfaces::IMonitor>());
152}
153
157TEST_F(MonitorServiceRegistrationTest, RegisterInstance) {
158 auto monitor = std::make_shared<kcenon::monitoring::performance_monitor>("test_instance_monitor");
159 monitor->set_cpu_threshold(70.0);
160
161 auto result = monitoring_di::register_monitor_instance(container_, monitor);
162 ASSERT_TRUE(result.is_ok());
163
164 auto resolved = container_.resolve<interfaces::IMonitor>().value();
165 EXPECT_NE(resolved, nullptr);
166
167 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(resolved);
168 ASSERT_NE(perf_monitor, nullptr);
169
170 auto thresholds = perf_monitor->get_thresholds();
171 EXPECT_DOUBLE_EQ(thresholds.cpu_threshold, 70.0);
172}
173
177TEST_F(MonitorServiceRegistrationTest, RegisterNullInstanceFails) {
178 auto result = monitoring_di::register_monitor_instance(container_, nullptr);
179 EXPECT_TRUE(result.is_err()) << "Registering null instance should fail";
180}
181
185TEST_F(MonitorServiceRegistrationTest, IMonitorInterface) {
186 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
187 ASSERT_TRUE(reg_result.is_ok());
188
189 auto monitor = container_.resolve<interfaces::IMonitor>().value();
190 ASSERT_NE(monitor, nullptr);
191
192 // Test record_metric
193 auto record_result = monitor->record_metric("test_metric", 42.0);
194 EXPECT_TRUE(record_result.is_ok());
195
196 // Test get_metrics
197 auto metrics_result = monitor->get_metrics();
198 EXPECT_TRUE(metrics_result.is_ok());
199
200 // Test check_health
201 auto health_result = monitor->check_health();
202 ASSERT_TRUE(health_result.is_ok());
203 EXPECT_TRUE(health_result.value().is_operational());
204
205 // Test reset
206 auto reset_result = monitor->reset();
207 EXPECT_TRUE(reset_result.is_ok());
208}
209
213TEST_F(MonitorServiceRegistrationTest, GetUnderlyingMonitor) {
214 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
215 ASSERT_TRUE(reg_result.is_ok());
216
217 auto imonitor = container_.resolve<interfaces::IMonitor>().value();
218 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(imonitor);
219
220 ASSERT_NE(perf_monitor, nullptr);
221 EXPECT_EQ(perf_monitor->get_name(), "default_performance_monitor");
222}
223
227TEST_F(MonitorServiceRegistrationTest, ThreadSafeResolution) {
228 auto config = default_test_config();
229 config.lifetime = common_di::service_lifetime::singleton;
230
231 auto reg_result = monitoring_di::register_monitor_services(container_, config);
232 ASSERT_TRUE(reg_result.is_ok());
233
234 std::vector<std::thread> threads;
235 std::vector<std::shared_ptr<interfaces::IMonitor>> results(10);
236 std::atomic<int> success_count{0};
237
238 for (size_t i = 0; i < 10; ++i) {
239 threads.emplace_back([this, &results, &success_count, i]() {
240 auto result = container_.resolve<interfaces::IMonitor>();
241 if (result.is_ok()) {
242 results[i] = result.value();
243 ++success_count;
244 }
245 });
246 }
247
248 for (auto& t : threads) {
249 t.join();
250 }
251
252 EXPECT_EQ(success_count.load(), 10);
253
254 // All threads should get the same singleton instance
255 auto first = results[0];
256 for (const auto& result : results) {
257 EXPECT_EQ(result, first) << "All threads should get same singleton";
258 }
259}
260
264TEST_F(MonitorServiceRegistrationTest, LockFreeMode) {
265 auto config = default_test_config();
266 config.enable_lock_free = true;
267
268 auto result = monitoring_di::register_monitor_services(container_, config);
269 ASSERT_TRUE(result.is_ok());
270
271 auto monitor = container_.resolve<interfaces::IMonitor>().value();
272 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(monitor);
273
274 ASSERT_NE(perf_monitor, nullptr);
275 EXPECT_TRUE(perf_monitor->get_profiler().is_lock_free_mode());
276}
277
278} // anonymous namespace
279
280#else // KCENON_HAS_COMMON_SYSTEM
281
282// Stub test when common_system is not available
283TEST(MonitorServiceRegistrationSkipTest, CommonSystemNotAvailable) {
284 GTEST_SKIP() << "common_system integration not available - skipping service registration tests";
285}
286
287#endif // KCENON_HAS_COMMON_SYSTEM
Unified feature flags header for monitoring_system.
@ resolved
Alert condition cleared.
Service container registration for monitoring_system services.
TEST_F(AdaptiveMonitoringTest, AdaptiveConfigDefaults)
TEST(MonitorServiceRegistrationSkipTest, CommonSystemNotAvailable)