Monitoring System 0.1.0
System resource monitoring with pluggable collectors and alerting
Loading...
Searching...
No Matches
test_result_types.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
5#include <gtest/gtest.h>
9#include <kcenon/common/error/error_codes.h>
10
11using namespace kcenon::monitoring;
12
16class ResultTypesTest : public ::testing::Test {
17protected:
18 void SetUp() override {}
19 void TearDown() override {}
20};
21
22TEST_F(ResultTypesTest, SuccessResultContainsValue) {
23 auto result = kcenon::common::ok(42);
24
25 EXPECT_TRUE(result.is_ok());
26 EXPECT_FALSE(result.is_err());
27 EXPECT_EQ(result.value(), 42);
28}
29
30TEST_F(ResultTypesTest, ErrorResultContainsError) {
31 auto result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::collector_not_found), "Test error");
32
33 EXPECT_FALSE(result.is_ok());
34 EXPECT_TRUE(result.is_err());
35 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::collector_not_found);
36 EXPECT_EQ(result.error().message, "Test error");
37}
38
39TEST_F(ResultTypesTest, ValueOrReturnsDefaultOnError) {
40 auto error_result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::unknown_error), "");
41 EXPECT_EQ(error_result.value_or(100), 100);
42
43 auto success_result = kcenon::common::ok(42);
44 EXPECT_EQ(success_result.value_or(100), 42);
45}
46
47TEST_F(ResultTypesTest, MapTransformsSuccessValue) {
48 auto result = kcenon::common::ok(10);
49 auto mapped = result.map([](int x) { return x * 2; });
50
51 EXPECT_TRUE(mapped.is_ok());
52 EXPECT_EQ(mapped.value(), 20);
53}
54
55TEST_F(ResultTypesTest, MapPropagatesError) {
56 auto result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::invalid_configuration), "");
57 auto mapped = result.map([](int x) { return x * 2; });
58
59 EXPECT_FALSE(mapped.is_ok());
60 EXPECT_EQ(static_cast<monitoring_error_code>(mapped.error().code), monitoring_error_code::invalid_configuration);
61}
62
63TEST_F(ResultTypesTest, AndThenChainsOperations) {
64 auto result = kcenon::common::ok(10);
65 auto chained = result.and_then([](int x) {
66 if (x > 5) {
67 return kcenon::common::ok(std::string("Large"));
68 }
69 return kcenon::common::make_error<std::string>(static_cast<int>(monitoring_error_code::invalid_configuration), "");
70 });
71
72 EXPECT_TRUE(chained.is_ok());
73 EXPECT_EQ(chained.value(), "Large");
74}
75
76TEST_F(ResultTypesTest, ResultVoidSuccess) {
77 auto result = kcenon::common::ok();
78
79 EXPECT_TRUE(result.is_ok());
80 EXPECT_FALSE(result.is_err());
81}
82
83TEST_F(ResultTypesTest, ResultVoidError) {
84 auto result = kcenon::common::VoidResult::err(static_cast<int>(monitoring_error_code::storage_full), "Storage is full");
85
86 EXPECT_FALSE(result.is_ok());
87 EXPECT_TRUE(result.is_err());
88 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::storage_full);
89}
90
91TEST_F(ResultTypesTest, ErrorCodeToString) {
92 EXPECT_EQ(error_code_to_string(monitoring_error_code::success), "Success");
93 EXPECT_EQ(error_code_to_string(monitoring_error_code::collector_not_found), "Collector not found");
94 EXPECT_EQ(error_code_to_string(monitoring_error_code::storage_full), "Storage is full");
95 EXPECT_EQ(error_code_to_string(monitoring_error_code::invalid_configuration), "Invalid configuration");
96}
97
98TEST_F(ResultTypesTest, ErrorInfoWithContext) {
99 auto result = kcenon::common::make_error<int>(
100 static_cast<int>(monitoring_error_code::collection_failed),
101 "Failed to collect metrics",
102 "",
103 "CPU collector timeout"
104 );
105
106 EXPECT_FALSE(result.is_ok());
107 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::collection_failed);
108 EXPECT_EQ(result.error().message, "Failed to collect metrics");
109 EXPECT_TRUE(result.error().details.has_value());
110 EXPECT_EQ(result.error().details.value(), "CPU collector timeout");
111}
112
113TEST_F(ResultTypesTest, MetricsSnapshotOperations) {
114 metrics_snapshot snapshot;
115 snapshot.add_metric("cpu_usage", 45.5);
116 snapshot.add_metric("memory_usage", 2048.0);
117
118 EXPECT_EQ(snapshot.metrics.size(), 2);
119
120 auto cpu = snapshot.get_metric("cpu_usage");
121 EXPECT_TRUE(cpu.has_value());
122 EXPECT_EQ(cpu.value(), 45.5);
123
124 auto unknown = snapshot.get_metric("unknown_metric");
125 EXPECT_FALSE(unknown.has_value());
126}
127
128TEST_F(ResultTypesTest, MonitoringConfigValidation) {
129 monitoring_config config;
130
131 // Valid configuration
132 config.history_size = 100;
133 config.collection_interval = std::chrono::milliseconds(100);
134 config.buffer_size = 1000;
135 auto result = config.validate();
136 EXPECT_TRUE(result.is_ok());
137
138 // Invalid history size
139 config.history_size = 0;
140 result = config.validate();
141 EXPECT_FALSE(result.is_ok());
142 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_capacity);
143
144 // Invalid interval
145 config.history_size = 100;
146 config.collection_interval = std::chrono::milliseconds(5);
147 result = config.validate();
148 EXPECT_FALSE(result.is_ok());
149 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_interval);
150
151 // Invalid buffer size
152 config.collection_interval = std::chrono::milliseconds(100);
153 config.buffer_size = 50; // Less than history_size
154 result = config.validate();
155 EXPECT_FALSE(result.is_ok());
156 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_capacity);
157}
158
168TEST_F(ResultTypesTest, ErrorCodesAreInCommonMonitoringBand) {
169 // Representative codes spanning several category sub-bands.
170 const monitoring_error_code samples[] = {
171 monitoring_error_code::collector_not_found,
172 monitoring_error_code::storage_full,
173 monitoring_error_code::invalid_configuration,
174 monitoring_error_code::circuit_breaker_open,
175 monitoring_error_code::transaction_failed,
176 monitoring_error_code::unknown_error,
177 };
178
179 for (auto code : samples) {
180 const int value = static_cast<int>(code);
181 EXPECT_LT(value, 0) << "code must be negative";
182 EXPECT_GE(value, -399) << "code must be >= -399";
183 EXPECT_LE(value, -300) << "code must be <= -300";
184 EXPECT_EQ(kcenon::common::error::get_category_name(value),
185 "MonitoringSystem")
186 << "common must classify code " << value << " as MonitoringSystem";
187 }
188}
189
194TEST_F(ResultTypesTest, ToCommonErrorPreservesNegativeCode) {
195 error_info err(monitoring_error_code::collection_failed,
196 "Failed to collect");
197 kcenon::common::error_info common_err = err.to_common_error();
198
199 EXPECT_EQ(common_err.code,
200 static_cast<int>(monitoring_error_code::collection_failed));
201 EXPECT_LT(common_err.code, 0);
202 EXPECT_EQ(kcenon::common::error::get_category_name(common_err.code),
203 "MonitoringSystem");
204}
205
206TEST_F(ResultTypesTest, HealthCheckResult) {
207 health_check_result health;
208
209 EXPECT_EQ(health.status, health_status::unknown);
210 EXPECT_FALSE(health.is_healthy());
211
212 health.status = health_status::healthy;
213 EXPECT_TRUE(health.is_healthy());
214
215 health.status = health_status::degraded;
216 health.issues.push_back("High memory usage");
217 EXPECT_FALSE(health.is_healthy());
218 EXPECT_EQ(health.issues.size(), 1);
219}
Test basic Result pattern functionality.
void SetUp() override
void TearDown() override
Monitoring system specific error codes.
Core monitoring system interface definitions.
std::string error_code_to_string(monitoring_error_code code)
Convert error code to string representation.
monitoring_error_code
Comprehensive error codes for monitoring system operations.
Definition error_codes.h:40
@ cpu
CPU power domain (RAPL)
Result pattern type definitions for monitoring system.
Extended error information with context.
common::error_info to_common_error() const
Convert to common_system error_info.
Result of a health check operation.
Complete snapshot of metrics at a point in time.
std::optional< double > get_metric(const std::string &name) const
Get a specific metric value.
std::vector< metric_value > metrics
void add_metric(const std::string &name, double value)
Add a metric to the snapshot.
Configuration for the monitoring system.
std::chrono::milliseconds collection_interval
common::VoidResult validate() const
Validate configuration parameters.
TEST_F(ResultTypesTest, SuccessResultContainsValue)