Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
test_adapter_functionality.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
16#include <gtest/gtest.h>
19#include <kcenon/common/interfaces/logger_interface.h>
20#include <memory>
21#include <atomic>
22
23using namespace kcenon::monitoring;
24using namespace kcenon::common::interfaces;
25using kcenon::common::VoidResult;
26using kcenon::common::Result;
27
31class mock_logger : public ILogger {
32private:
33 std::atomic<int> log_count_{0};
34 log_level min_level_{log_level::trace};
35
36public:
37 int get_call_count() const { return log_count_.load(); }
38
39 VoidResult log(log_level /*level*/, const std::string& /*message*/) override {
40 log_count_++;
41 return kcenon::common::ok();
42 }
43
44 VoidResult log(const log_entry& /*entry*/) override {
45 log_count_++;
46 return kcenon::common::ok();
47 }
48
49 bool is_enabled(log_level level) const override {
50 return level >= min_level_;
51 }
52
53 VoidResult set_level(log_level level) override {
54 min_level_ = level;
55 return kcenon::common::ok();
56 }
57
58 log_level get_level() const override {
59 return min_level_;
60 }
61
62 VoidResult flush() override {
63 return kcenon::common::ok();
64 }
65};
66
70TEST(AdapterFunctionalityTest, WorksWithoutLogger) {
71 auto bus = std::make_shared<event_bus>();
72 auto adapter = std::make_shared<logger_system_adapter>(bus, nullptr);
73
74 // Should not crash with null logger
75 EXPECT_FALSE(adapter->is_logger_system_available());
76 EXPECT_NO_THROW({
77 auto metrics = adapter->collect_metrics();
78 EXPECT_TRUE(metrics.is_ok());
79 });
80
81 // Get log rate should return 0
82 EXPECT_EQ(0.0, adapter->get_current_log_rate());
83}
84
88TEST(AdapterFunctionalityTest, WorksWithMockLogger) {
89 auto bus = std::make_shared<event_bus>();
90 auto logger = std::make_shared<mock_logger>();
91 auto adapter = std::make_shared<logger_system_adapter>(bus, logger);
92
93 EXPECT_TRUE(adapter->is_logger_system_available());
94
95 // Adapter should be able to work with the logger interface
96 EXPECT_NO_THROW({
97 auto metrics = adapter->collect_metrics();
98 EXPECT_TRUE(metrics.is_ok());
99 });
100
101 // Get logger should return the same instance
102 auto retrieved = adapter->get_logger();
103 EXPECT_EQ(logger, retrieved);
104}
105
109TEST(AdapterFunctionalityTest, RuntimeLoggerInjection) {
110 auto bus = std::make_shared<event_bus>();
111 auto adapter = std::make_shared<logger_system_adapter>(bus, nullptr);
112
113 EXPECT_FALSE(adapter->is_logger_system_available());
114
115 // Inject logger at runtime
116 auto logger = std::make_shared<mock_logger>();
117 adapter->set_logger(logger);
118
119 EXPECT_TRUE(adapter->is_logger_system_available());
120
121 // Collect metrics should work now
122 EXPECT_NO_THROW({
123 auto metrics = adapter->collect_metrics();
124 EXPECT_TRUE(metrics.is_ok());
125 });
126
127 // Replace with another logger
128 auto logger2 = std::make_shared<mock_logger>();
129 adapter->set_logger(logger2);
130
131 auto retrieved = adapter->get_logger();
132 EXPECT_EQ(logger2, retrieved);
133 EXPECT_NE(logger, retrieved);
134}
135
139TEST(AdapterFunctionalityTest, WorksWithMonitorableLogger) {
145 class monitorable_mock_logger : public mock_logger, public IMonitorable {
146 public:
147 Result<metrics_snapshot> get_monitoring_data() override {
148 metrics_snapshot snapshot;
149 snapshot.source_id = "mock_logger";
150 snapshot.add_metric("messages_logged", 42.0);
151 return snapshot;
152 }
153
154 Result<health_check_result> health_check() override {
155 health_check_result result;
156 result.status = health_status::healthy;
157 result.message = "Mock logger operational";
158 return result;
159 }
160
161 std::string get_component_name() const override {
162 return "monitorable_mock_logger";
163 }
164 };
165
166 auto bus = std::make_shared<event_bus>();
167 auto logger = std::make_shared<monitorable_mock_logger>();
168 auto adapter = std::make_shared<logger_system_adapter>(bus, logger);
169
170 EXPECT_TRUE(adapter->is_logger_system_available());
171
172 // Collect metrics should retrieve from IMonitorable
173 auto metrics_result = adapter->collect_metrics();
174 ASSERT_TRUE(metrics_result.is_ok());
175
176 auto& metrics = metrics_result.value();
177 EXPECT_FALSE(metrics.empty());
178
179 // Should have the metric from the mock
180 bool found_metric = false;
181 for (const auto& m : metrics) {
182 if (m.name == "messages_logged") {
183 if (auto* dval = std::get_if<double>(&m.value)) {
184 if (*dval == 42.0) {
185 found_metric = true;
186 break;
187 }
188 }
189 }
190 }
191 EXPECT_TRUE(found_metric);
192}
193
197TEST(AdapterFunctionalityTest, MultipleAdaptersIndependent) {
198 auto bus = std::make_shared<event_bus>();
199
200 auto logger1 = std::make_shared<mock_logger>();
201 auto logger2 = std::make_shared<mock_logger>();
202
203 auto adapter1 = std::make_shared<logger_system_adapter>(bus, logger1);
204 auto adapter2 = std::make_shared<logger_system_adapter>(bus, logger2);
205
206 EXPECT_TRUE(adapter1->is_logger_system_available());
207 EXPECT_TRUE(adapter2->is_logger_system_available());
208
209 EXPECT_NE(adapter1->get_logger(), adapter2->get_logger());
210}
Abstract base class for health checks.
Mock logger for testing (does not depend on logger_system)
VoidResult log(const log_entry &) override
VoidResult flush() override
VoidResult set_level(log_level level) override
VoidResult log(log_level, const std::string &) override
std::atomic< int > log_count_
bool is_enabled(log_level level) const override
log_level get_level() const override
Lightweight event bus implementation for monitoring system.
Consolidated logger system adapters for monitoring_system.
Result of a health check operation.
Complete snapshot of metrics at a point in time.
void add_metric(const std::string &name, double value)
Add a metric to the snapshot.
TEST(AdapterFunctionalityTest, WorksWithoutLogger)
Test Scenario 1: Adapter with NULL logger.