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
10using namespace kcenon::monitoring;
11
15class ResultTypesTest : public ::testing::Test {
16protected:
17 void SetUp() override {}
18 void TearDown() override {}
19};
20
21TEST_F(ResultTypesTest, SuccessResultContainsValue) {
22 auto result = kcenon::common::ok(42);
23
24 EXPECT_TRUE(result.is_ok());
25 EXPECT_FALSE(result.is_err());
26 EXPECT_EQ(result.value(), 42);
27}
28
29TEST_F(ResultTypesTest, ErrorResultContainsError) {
30 auto result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::collector_not_found), "Test error");
31
32 EXPECT_FALSE(result.is_ok());
33 EXPECT_TRUE(result.is_err());
34 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::collector_not_found);
35 EXPECT_EQ(result.error().message, "Test error");
36}
37
38TEST_F(ResultTypesTest, ValueOrReturnsDefaultOnError) {
39 auto error_result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::unknown_error), "");
40 EXPECT_EQ(error_result.value_or(100), 100);
41
42 auto success_result = kcenon::common::ok(42);
43 EXPECT_EQ(success_result.value_or(100), 42);
44}
45
46TEST_F(ResultTypesTest, MapTransformsSuccessValue) {
47 auto result = kcenon::common::ok(10);
48 auto mapped = result.map([](int x) { return x * 2; });
49
50 EXPECT_TRUE(mapped.is_ok());
51 EXPECT_EQ(mapped.value(), 20);
52}
53
54TEST_F(ResultTypesTest, MapPropagatesError) {
55 auto result = kcenon::common::make_error<int>(static_cast<int>(monitoring_error_code::invalid_configuration), "");
56 auto mapped = result.map([](int x) { return x * 2; });
57
58 EXPECT_FALSE(mapped.is_ok());
59 EXPECT_EQ(static_cast<monitoring_error_code>(mapped.error().code), monitoring_error_code::invalid_configuration);
60}
61
62TEST_F(ResultTypesTest, AndThenChainsOperations) {
63 auto result = kcenon::common::ok(10);
64 auto chained = result.and_then([](int x) {
65 if (x > 5) {
66 return kcenon::common::ok(std::string("Large"));
67 }
68 return kcenon::common::make_error<std::string>(static_cast<int>(monitoring_error_code::invalid_configuration), "");
69 });
70
71 EXPECT_TRUE(chained.is_ok());
72 EXPECT_EQ(chained.value(), "Large");
73}
74
75TEST_F(ResultTypesTest, ResultVoidSuccess) {
76 auto result = kcenon::common::ok();
77
78 EXPECT_TRUE(result.is_ok());
79 EXPECT_FALSE(result.is_err());
80}
81
82TEST_F(ResultTypesTest, ResultVoidError) {
83 auto result = kcenon::common::VoidResult::err(static_cast<int>(monitoring_error_code::storage_full), "Storage is full");
84
85 EXPECT_FALSE(result.is_ok());
86 EXPECT_TRUE(result.is_err());
87 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::storage_full);
88}
89
90TEST_F(ResultTypesTest, ErrorCodeToString) {
91 EXPECT_EQ(error_code_to_string(monitoring_error_code::success), "Success");
92 EXPECT_EQ(error_code_to_string(monitoring_error_code::collector_not_found), "Collector not found");
93 EXPECT_EQ(error_code_to_string(monitoring_error_code::storage_full), "Storage is full");
94 EXPECT_EQ(error_code_to_string(monitoring_error_code::invalid_configuration), "Invalid configuration");
95}
96
97TEST_F(ResultTypesTest, ErrorInfoWithContext) {
98 auto result = kcenon::common::make_error<int>(
99 static_cast<int>(monitoring_error_code::collection_failed),
100 "Failed to collect metrics",
101 "",
102 "CPU collector timeout"
103 );
104
105 EXPECT_FALSE(result.is_ok());
106 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::collection_failed);
107 EXPECT_EQ(result.error().message, "Failed to collect metrics");
108 EXPECT_TRUE(result.error().details.has_value());
109 EXPECT_EQ(result.error().details.value(), "CPU collector timeout");
110}
111
112TEST_F(ResultTypesTest, MetricsSnapshotOperations) {
113 metrics_snapshot snapshot;
114 snapshot.add_metric("cpu_usage", 45.5);
115 snapshot.add_metric("memory_usage", 2048.0);
116
117 EXPECT_EQ(snapshot.metrics.size(), 2);
118
119 auto cpu = snapshot.get_metric("cpu_usage");
120 EXPECT_TRUE(cpu.has_value());
121 EXPECT_EQ(cpu.value(), 45.5);
122
123 auto unknown = snapshot.get_metric("unknown_metric");
124 EXPECT_FALSE(unknown.has_value());
125}
126
127TEST_F(ResultTypesTest, MonitoringConfigValidation) {
128 monitoring_config config;
129
130 // Valid configuration
131 config.history_size = 100;
132 config.collection_interval = std::chrono::milliseconds(100);
133 config.buffer_size = 1000;
134 auto result = config.validate();
135 EXPECT_TRUE(result.is_ok());
136
137 // Invalid history size
138 config.history_size = 0;
139 result = config.validate();
140 EXPECT_FALSE(result.is_ok());
141 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_capacity);
142
143 // Invalid interval
144 config.history_size = 100;
145 config.collection_interval = std::chrono::milliseconds(5);
146 result = config.validate();
147 EXPECT_FALSE(result.is_ok());
148 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_interval);
149
150 // Invalid buffer size
151 config.collection_interval = std::chrono::milliseconds(100);
152 config.buffer_size = 50; // Less than history_size
153 result = config.validate();
154 EXPECT_FALSE(result.is_ok());
155 EXPECT_EQ(static_cast<monitoring_error_code>(result.error().code), monitoring_error_code::invalid_capacity);
156}
157
158TEST_F(ResultTypesTest, HealthCheckResult) {
159 health_check_result health;
160
161 EXPECT_EQ(health.status, health_status::unknown);
162 EXPECT_FALSE(health.is_healthy());
163
164 health.status = health_status::healthy;
165 EXPECT_TRUE(health.is_healthy());
166
167 health.status = health_status::degraded;
168 health.issues.push_back("High memory usage");
169 EXPECT_FALSE(health.is_healthy());
170 EXPECT_EQ(health.issues.size(), 1);
171}
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:25
@ cpu
CPU power domain (RAPL)
Result pattern type definitions for monitoring system.
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)