16#include <gtest/gtest.h>
19#if KCENON_HAS_COMMON_SYSTEM
22#include <kcenon/common/di/service_container.h>
23#include <kcenon/common/interfaces/monitoring_interface.h>
31namespace common_di = kcenon::common::di;
32namespace monitoring_di = kcenon::monitoring::di;
33namespace interfaces = kcenon::common::interfaces;
39class MonitorServiceRegistrationTest :
public ::testing::Test {
41 void SetUp()
override {
45 void TearDown()
override {
54 static monitoring_di::monitor_registration_config default_test_config() {
55 monitoring_di::monitor_registration_config config;
56 config.enable_system_monitoring =
false;
61 common_di::service_container container_;
67TEST_F(MonitorServiceRegistrationTest, RegisterWithDefaultConfig) {
68 auto result = monitoring_di::register_monitor_services(container_, default_test_config());
70 ASSERT_TRUE(result.is_ok()) <<
"Failed to register monitor services";
71 EXPECT_TRUE(container_.is_registered<interfaces::IMonitor>());
77TEST_F(MonitorServiceRegistrationTest, ResolveRegisteredService) {
78 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
79 ASSERT_TRUE(reg_result.is_ok());
81 auto resolve_result = container_.resolve<interfaces::IMonitor>();
82 ASSERT_TRUE(resolve_result.is_ok()) <<
"Failed to resolve IMonitor";
84 auto monitor = resolve_result.value();
85 EXPECT_NE(monitor,
nullptr);
91TEST_F(MonitorServiceRegistrationTest, SingletonLifetime) {
92 auto config = default_test_config();
93 config.lifetime = common_di::service_lifetime::singleton;
95 auto reg_result = monitoring_di::register_monitor_services(container_, config);
96 ASSERT_TRUE(reg_result.is_ok());
98 auto monitor1 = container_.resolve<interfaces::IMonitor>().value();
99 auto monitor2 = container_.resolve<interfaces::IMonitor>().value();
101 EXPECT_EQ(monitor1, monitor2) <<
"Singleton should return same instance";
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};
114 auto result = monitoring_di::register_monitor_services(container_, config);
115 ASSERT_TRUE(result.is_ok());
117 auto monitor = container_.resolve<interfaces::IMonitor>().value();
118 EXPECT_NE(monitor,
nullptr);
121 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(monitor);
122 ASSERT_NE(perf_monitor,
nullptr);
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});
133TEST_F(MonitorServiceRegistrationTest, DoubleRegistrationFails) {
134 auto result1 = monitoring_di::register_monitor_services(container_, default_test_config());
135 ASSERT_TRUE(result1.is_ok());
137 auto result2 = monitoring_di::register_monitor_services(container_, default_test_config());
138 EXPECT_TRUE(result2.is_err()) <<
"Double registration should fail";
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>());
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>());
157TEST_F(MonitorServiceRegistrationTest, RegisterInstance) {
158 auto monitor = std::make_shared<kcenon::monitoring::performance_monitor>(
"test_instance_monitor");
159 monitor->set_cpu_threshold(70.0);
161 auto result = monitoring_di::register_monitor_instance(container_, monitor);
162 ASSERT_TRUE(result.is_ok());
164 auto resolved = container_.resolve<interfaces::IMonitor>().value();
165 EXPECT_NE(resolved,
nullptr);
167 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(resolved);
168 ASSERT_NE(perf_monitor,
nullptr);
170 auto thresholds = perf_monitor->get_thresholds();
171 EXPECT_DOUBLE_EQ(thresholds.cpu_threshold, 70.0);
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";
185TEST_F(MonitorServiceRegistrationTest, IMonitorInterface) {
186 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
187 ASSERT_TRUE(reg_result.is_ok());
189 auto monitor = container_.resolve<interfaces::IMonitor>().value();
190 ASSERT_NE(monitor,
nullptr);
193 auto record_result = monitor->record_metric(
"test_metric", 42.0);
194 EXPECT_TRUE(record_result.is_ok());
197 auto metrics_result = monitor->get_metrics();
198 EXPECT_TRUE(metrics_result.is_ok());
201 auto health_result = monitor->check_health();
202 ASSERT_TRUE(health_result.is_ok());
203 EXPECT_TRUE(health_result.value().is_operational());
206 auto reset_result = monitor->reset();
207 EXPECT_TRUE(reset_result.is_ok());
213TEST_F(MonitorServiceRegistrationTest, GetUnderlyingMonitor) {
214 auto reg_result = monitoring_di::register_monitor_services(container_, default_test_config());
215 ASSERT_TRUE(reg_result.is_ok());
217 auto imonitor = container_.resolve<interfaces::IMonitor>().value();
218 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(imonitor);
220 ASSERT_NE(perf_monitor,
nullptr);
221 EXPECT_EQ(perf_monitor->get_name(),
"default_performance_monitor");
227TEST_F(MonitorServiceRegistrationTest, ThreadSafeResolution) {
228 auto config = default_test_config();
229 config.lifetime = common_di::service_lifetime::singleton;
231 auto reg_result = monitoring_di::register_monitor_services(container_, config);
232 ASSERT_TRUE(reg_result.is_ok());
234 std::vector<std::thread> threads;
235 std::vector<std::shared_ptr<interfaces::IMonitor>> results(10);
236 std::atomic<int> success_count{0};
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();
248 for (
auto& t : threads) {
252 EXPECT_EQ(success_count.load(), 10);
255 auto first = results[0];
256 for (
const auto& result : results) {
257 EXPECT_EQ(result, first) <<
"All threads should get same singleton";
264TEST_F(MonitorServiceRegistrationTest, LockFreeMode) {
265 auto config = default_test_config();
266 config.enable_lock_free =
true;
268 auto result = monitoring_di::register_monitor_services(container_, config);
269 ASSERT_TRUE(result.is_ok());
271 auto monitor = container_.resolve<interfaces::IMonitor>().value();
272 auto perf_monitor = monitoring_di::get_underlying_performance_monitor(monitor);
274 ASSERT_NE(perf_monitor,
nullptr);
275 EXPECT_TRUE(perf_monitor->get_profiler().is_lock_free_mode());
283TEST(MonitorServiceRegistrationSkipTest, CommonSystemNotAvailable) {
284 GTEST_SKIP() <<
"common_system integration not available - skipping service registration tests";
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)