18#include <gtest/gtest.h>
20#include <kcenon/common/interfaces/logger_interface.h>
21#include <kcenon/common/interfaces/monitoring_interface.h>
28namespace common_if = kcenon::common::interfaces;
31using kcenon::common::VoidResult;
32using kcenon::common::Result;
45 VoidResult
log([[maybe_unused]] common_if::log_level level,
46 [[maybe_unused]]
const std::string& message)
override {
51 return kcenon::common::ok();
54 VoidResult
log(
const common_if::log_entry& entry)
override {
55 return log(entry.level, entry.message);
58 bool is_enabled([[maybe_unused]] common_if::log_level level)
const override {
return true; }
59 VoidResult
set_level([[maybe_unused]] common_if::log_level level)
override {
return kcenon::common::ok(); }
60 common_if::log_level
get_level()
const override {
return common_if::log_level::info; }
61 VoidResult
flush()
override {
return kcenon::common::ok(); }
65 common_if::metrics_snapshot snapshot;
66 snapshot.source_id =
"simple_mock_logger";
67 snapshot.add_metric(
"total_logs",
static_cast<double>(
log_count_));
72 common_if::health_check_result result;
73 result.status = common_if::health_status::healthy;
74 result.message =
"Mock logger operational";
79 return "simple_mock_logger";
83 void set_monitor(std::shared_ptr<common_if::IMonitor> monitor) {
102 std::lock_guard<std::mutex> lock(
mutex_);
104 return kcenon::common::ok();
108 const std::string& name,
110 const std::unordered_map<std::string, std::string>& tags)
override {
111 std::lock_guard<std::mutex> lock(
mutex_);
112 common_if::metric_value mv(name, value);
115 return kcenon::common::ok();
119 std::lock_guard<std::mutex> lock(
mutex_);
120 common_if::metrics_snapshot snapshot;
122 snapshot.source_id =
"mock_monitor";
127 common_if::health_check_result result;
128 result.status = common_if::health_status::healthy;
129 result.message =
"Mock monitor operational";
134 std::lock_guard<std::mutex> lock(
mutex_);
136 return kcenon::common::ok();
140 std::lock_guard<std::mutex> lock(
mutex_);
148TEST(CrossSystemIntegrationTest, BothSystemsStandalone) {
150 auto logger = std::make_shared<simple_mock_logger>();
153 logger->log(common_if::log_level::info,
"Test message");
155 EXPECT_EQ(1, logger->get_log_count());
158 auto monitor = std::make_shared<mock_monitor>();
161 auto result = monitor->record_metric(
"test_metric", 1.0);
162 EXPECT_TRUE(result.is_ok());
166 auto monitor_metrics = monitor->get_metrics();
167 ASSERT_TRUE(monitor_metrics.is_ok());
168 EXPECT_EQ(1, monitor_metrics.value().metrics.size());
174TEST(CrossSystemIntegrationTest, LoggerWithMonitorInjection) {
175 auto monitor = std::make_shared<mock_monitor>();
176 auto logger = std::make_shared<simple_mock_logger>();
179 logger->set_monitor(monitor);
182 logger->log(common_if::log_level::info,
"Test 1");
183 logger->log(common_if::log_level::info,
"Test 2");
186 auto metrics_result = monitor->get_metrics();
187 ASSERT_TRUE(metrics_result.is_ok());
189 auto& snapshot = metrics_result.value();
190 EXPECT_EQ(2, snapshot.metrics.size());
196TEST(CrossSystemIntegrationTest, MonitorInterfaceCompatibility) {
197 auto monitor = std::make_shared<mock_monitor>();
201 auto result = monitor->record_metric(
"test_metric", 42.0);
202 EXPECT_TRUE(result.is_ok());
206 auto health = monitor->check_health();
207 ASSERT_TRUE(health.is_ok());
208 EXPECT_EQ(common_if::health_status::healthy, health.value().status);
217TEST(CrossSystemIntegrationTest, BidirectionalDependencyInjection) {
219 auto logger = std::make_shared<simple_mock_logger>();
220 auto monitor = std::make_shared<mock_monitor>();
223 logger->set_monitor(monitor);
226 for (
int i = 0; i < 10; ++i) {
227 logger->log(common_if::log_level::info,
"Request " + std::to_string(i));
231 auto logger_health = logger->health_check();
232 ASSERT_TRUE(logger_health.is_ok());
233 EXPECT_TRUE(logger_health.value().is_healthy());
236 auto monitor_health = monitor->check_health();
237 ASSERT_TRUE(monitor_health.is_ok());
238 EXPECT_TRUE(monitor_health.value().is_healthy());
241 auto monitor_metrics = monitor->get_metrics();
242 ASSERT_TRUE(monitor_metrics.is_ok());
243 EXPECT_EQ(10, monitor_metrics.value().metrics.size());
246 EXPECT_EQ(10, logger->get_log_count());
252TEST(CrossSystemIntegrationTest, RepeatedInjection) {
253 auto logger = std::make_shared<simple_mock_logger>();
254 auto monitor1 = std::make_shared<mock_monitor>();
255 auto monitor2 = std::make_shared<mock_monitor>();
258 logger->set_monitor(monitor1);
259 logger->log(common_if::log_level::info,
"With monitor1");
262 EXPECT_EQ(1, monitor1->get_metric_count());
265 logger->set_monitor(monitor2);
266 logger->log(common_if::log_level::info,
"With monitor2");
269 EXPECT_EQ(1, monitor1->get_metric_count());
270 EXPECT_EQ(1, monitor2->get_metric_count());
271 EXPECT_EQ(2, logger->get_log_count());
277TEST(CrossSystemIntegrationTest, NullInjection) {
278 auto logger = std::make_shared<simple_mock_logger>();
279 auto monitor = std::make_shared<mock_monitor>();
282 logger->set_monitor(monitor);
283 logger->set_monitor(
nullptr);
287 logger->log(common_if::log_level::info,
"After null injection");
290 EXPECT_EQ(1, logger->get_log_count());
292 EXPECT_EQ(0, monitor->get_metric_count());
298TEST(CrossSystemIntegrationTest, IntegrationPerformanceOverhead) {
299 auto logger = std::make_shared<simple_mock_logger>();
300 auto monitor = std::make_shared<mock_monitor>();
302 logger->set_monitor(monitor);
305 auto start = std::chrono::high_resolution_clock::now();
307 for (
int i = 0; i < 1000; ++i) {
308 logger->log(common_if::log_level::info,
"Performance test");
311 auto end = std::chrono::high_resolution_clock::now();
312 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
315 EXPECT_LT(duration.count(), 100);
316 EXPECT_EQ(1000, monitor->get_metric_count());
322TEST(CrossSystemIntegrationTest, MonitoringSystemStandalone) {
323 auto monitor = std::make_shared<mon::performance_monitor>();
327 auto timer = monitor->time_operation(
"test_op");
329 std::this_thread::sleep_for(std::chrono::milliseconds(1));
333 auto result = monitor->collect();
334 ASSERT_TRUE(result.is_ok());
337int main(
int argc,
char** argv) {
338 ::testing::InitGoogleTest(&argc, argv);
339 return RUN_ALL_TESTS();
Mock IMonitor for testing cross-system integration.
size_t get_metric_count() const
VoidResult record_metric(const std::string &name, double value) override
std::vector< common_if::metric_value > metrics_
Result< common_if::metrics_snapshot > get_metrics() override
Result< common_if::health_check_result > check_health() override
VoidResult reset() override
VoidResult record_metric(const std::string &name, double value, const std::unordered_map< std::string, std::string > &tags) override
Simple mock logger for testing.
bool is_enabled(common_if::log_level level) const override
VoidResult log(const common_if::log_entry &entry) override
Result< common_if::metrics_snapshot > get_monitoring_data() override
common_if::log_level get_level() const override
std::shared_ptr< common_if::IMonitor > monitor_
Result< common_if::health_check_result > health_check() override
VoidResult flush() override
int get_log_count() const
void set_monitor(std::shared_ptr< common_if::IMonitor > monitor)
VoidResult log(common_if::log_level level, const std::string &message) override
VoidResult set_level(common_if::log_level level) override
std::string get_component_name() const override
TEST(CrossSystemIntegrationTest, BothSystemsStandalone)
Test Case 1: Both systems standalone.