5#include <gtest/gtest.h>
9#include <unordered_set>
19class MetricFactoryTest :
public ::testing::Test {
21 void SetUp()
override {
31TEST_F(MetricFactoryTest, SingletonInstance) {
34 EXPECT_EQ(&instance1, &instance2);
38TEST_F(MetricFactoryTest, BuiltinCollectorsRegistered) {
42 for (
const auto& name : names) {
43 EXPECT_TRUE(factory.is_registered(name)) <<
"Collector not registered: " << name;
48TEST_F(MetricFactoryTest, CreateSystemResourceCollector) {
51 auto result = factory.create(
"system_resource_collector", {});
52 EXPECT_TRUE(result) << result.error_message;
53 EXPECT_NE(result.collector,
nullptr);
54 EXPECT_EQ(result.collector->get_name(),
"system_resource_collector");
58TEST_F(MetricFactoryTest, CreateVmCollector) {
61 auto result = factory.create(
"vm_collector", {});
62 EXPECT_TRUE(result) << result.error_message;
63 EXPECT_NE(result.collector,
nullptr);
64 EXPECT_EQ(result.collector->get_name(),
"vm_collector");
68TEST_F(MetricFactoryTest, CreateWithConfiguration) {
72 auto result = factory.create(
"uptime_collector", config);
73 EXPECT_TRUE(result) << result.error_message;
74 EXPECT_TRUE(result.collector->is_healthy());
78TEST_F(MetricFactoryTest, CreateUnknownCollectorFails) {
81 auto result = factory.create(
"nonexistent_collector", {});
83 EXPECT_EQ(result.collector,
nullptr);
84 EXPECT_FALSE(result.error_message.empty());
88TEST_F(MetricFactoryTest, CreateOrNull) {
91 auto collector = factory.create_or_null(
"system_resource_collector", {});
92 EXPECT_NE(collector,
nullptr);
94 auto null_collector = factory.create_or_null(
"nonexistent", {});
95 EXPECT_EQ(null_collector,
nullptr);
99TEST_F(MetricFactoryTest, GetRegisteredCollectors) {
102 auto registered = factory.get_registered_collectors();
103 EXPECT_FALSE(registered.empty());
107 for (
const auto& name : builtin) {
108 bool found = std::find(registered.begin(), registered.end(), name) != registered.end();
109 EXPECT_TRUE(found) <<
"Builtin collector not in registered list: " << name;
114TEST_F(MetricFactoryTest, UnregisterCollector) {
117 EXPECT_TRUE(factory.is_registered(
"vm_collector"));
118 EXPECT_TRUE(factory.unregister_collector(
"vm_collector"));
119 EXPECT_FALSE(factory.is_registered(
"vm_collector"));
122 EXPECT_FALSE(factory.unregister_collector(
"vm_collector"));
126class MockCollector :
public collector_interface {
128 bool initialize(
const config_map& )
override {
return true; }
129 [[nodiscard]] std::string get_name()
const override {
return "mock_collector"; }
130 [[nodiscard]]
bool is_healthy()
const override {
return true; }
131 [[nodiscard]] std::vector<std::string> get_metric_types()
const override {
return {
"mock.metric"}; }
134TEST_F(MetricFactoryTest, RegisterCustomCollector) {
137 bool registered = factory.register_collector(
"mock_collector", []() {
138 return std::make_unique<MockCollector>();
140 EXPECT_TRUE(registered);
141 EXPECT_TRUE(factory.is_registered(
"mock_collector"));
143 auto result = factory.create(
"mock_collector", {});
145 EXPECT_EQ(result.collector->get_name(),
"mock_collector");
149TEST_F(MetricFactoryTest, DuplicateRegistrationFails) {
152 EXPECT_TRUE(factory.is_registered(
"vm_collector"));
153 bool registered = factory.register_collector(
"vm_collector", []() {
154 return std::make_unique<MockCollector>();
156 EXPECT_FALSE(registered);
160TEST_F(MetricFactoryTest, CreateMultiple) {
163 std::unordered_map<std::string, config_map> configs = {
164 {
"system_resource_collector", {}},
165 {
"vm_collector", {}},
166 {
"uptime_collector", {{
"enabled",
"true"}}}};
168 auto collectors = factory.create_multiple(configs);
169 EXPECT_EQ(collectors.size(), 3);
173class ConfigParserTest :
public ::testing::Test {};
176TEST_F(ConfigParserTest, ParseBool) {
178 {
"disabled",
"false"},
201TEST_F(ConfigParserTest, ParseInt) {
205 {
"large",
"1000000"}};
214TEST_F(ConfigParserTest, ParseSizeT) {
215 config_map config = {{
"samples",
"1000"}, {
"max",
"9999999999"}};
222TEST_F(ConfigParserTest, ParseDouble) {
223 config_map config = {{
"threshold",
"0.75"}, {
"negative",
"-1.5"}, {
"integer",
"10"}};
231TEST_F(ConfigParserTest, ParseString) {
232 config_map config = {{
"name",
"test_collector"}, {
"empty",
""}};
239TEST_F(ConfigParserTest, DefaultValueForMissingKey) {
248TEST_F(ConfigParserTest, DefaultValueForInvalidParsing) {
249 config_map config = {{
"invalid_int",
"not_a_number"}, {
"invalid_double",
"abc"}};
256TEST_F(ConfigParserTest, HasKey) {
264TEST_F(ConfigParserTest, GetOptional) {
268 EXPECT_TRUE(value.has_value());
269 EXPECT_EQ(*value, 42);
272 EXPECT_FALSE(missing.has_value());
276TEST_F(ConfigParserTest, GetClamped) {
277 config_map config = {{
"low",
"5"}, {
"high",
"150"}, {
"normal",
"50"}};
285TEST_F(ConfigParserTest, GetEnum) {
286 config_map config = {{
"level",
"debug"}, {
"invalid_level",
"unknown"}};
288 std::unordered_set<std::string> allowed = {
"debug",
"info",
"warning",
"error"};
296TEST_F(ConfigParserTest, GetEnumInteger) {
297 config_map config = {{
"priority",
"1"}, {
"invalid_priority",
"5"}};
299 std::unordered_set<int> allowed = {0, 1, 2, 3};
306TEST_F(ConfigParserTest, GetMatching) {
308 {
"valid_email",
"test@example.com"},
309 {
"invalid_email",
"not-an-email"},
310 {
"ipv4",
"192.168.1.1"}
314 std::string email_pattern = R
"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})";
319 std::string ipv4_pattern = R
"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})";
324TEST_F(ConfigParserTest, GetValidated) {
325 config_map config = {{
"port",
"8080"}, {
"invalid_port",
"70000"}};
327 auto port_validator = [](
const int& value) {
return value > 0 && value < 65536; };
335TEST_F(ConfigParserTest, GetValidatedSizeConstraint) {
336 config_map config = {{
"buffer_size",
"1024"}, {
"too_small",
"10"}};
338 auto min_size_validator = [](
const size_t& value) {
return value >= 100; };
345TEST_F(ConfigParserTest, GetDurationMilliseconds) {
354 using ms = std::chrono::milliseconds;
364TEST_F(ConfigParserTest, GetDurationSeconds) {
371 using sec = std::chrono::seconds;
379TEST_F(ConfigParserTest, GetDurationDefault) {
380 config_map config = {{
"invalid",
"not_a_duration"}};
382 using ms = std::chrono::milliseconds;
389TEST_F(ConfigParserTest, GetListInt) {
391 {
"ports",
"80, 443, 8080"},
397 EXPECT_EQ(ports.size(), 3u);
398 EXPECT_EQ(ports[0], 80);
399 EXPECT_EQ(ports[1], 443);
400 EXPECT_EQ(ports[2], 8080);
403 EXPECT_EQ(single.size(), 1u);
404 EXPECT_EQ(single[0], 9000);
407 EXPECT_EQ(empty.size(), 1u);
408 EXPECT_EQ(empty[0], 100);
412TEST_F(ConfigParserTest, GetListString) {
413 config_map config = {{
"tags",
"cpu, memory, disk"}};
416 EXPECT_EQ(tags.size(), 3u);
417 EXPECT_EQ(tags[0],
"cpu");
418 EXPECT_EQ(tags[1],
"memory");
419 EXPECT_EQ(tags[2],
"disk");
423TEST_F(ConfigParserTest, GetListDefault) {
426 std::vector<int> defaults = {1, 2, 3};
428 EXPECT_EQ(result.size(), 3u);
429 EXPECT_EQ(result[0], 1);
430 EXPECT_EQ(result[1], 2);
431 EXPECT_EQ(result[2], 3);
Registration of built-in metric collectors with the registry.
static T get_validated(const config_map &config, const std::string &key, const T &default_value, std::function< bool(const T &)> validator)
Get a configuration value with custom validation.
static Duration get_duration(const config_map &config, const std::string &key, const Duration &default_value)
Get a duration value from configuration.
static bool has_key(const config_map &config, const std::string &key)
Check if a configuration key exists.
static std::optional< T > get_optional(const config_map &config, const std::string &key)
Get a configuration value as optional.
static std::vector< T > get_list(const config_map &config, const std::string &key, const std::vector< T > &default_values)
Get a list of values from a comma-separated string.
static T get_enum(const config_map &config, const std::string &key, const T &default_value, const std::unordered_set< T > &allowed_values)
Get a configuration value from a set of allowed values.
static T get(const config_map &config, const std::string &key, const T &default_value)
Get a configuration value with type conversion.
static std::string get_matching(const config_map &config, const std::string &key, const std::string &default_value, const std::string &pattern)
Get a string configuration value matching a regex pattern.
static T get_clamped(const config_map &config, const std::string &key, const T &default_value, const T &min_value, const T &max_value)
Get a configuration value with validation.
static metric_factory & instance()
Get the singleton instance.
void clear()
Clear all registered collectors.
Unified configuration parsing utility.
Unified factory for metric collector instantiation.
std::vector< std::string > get_builtin_collector_names()
Get list of all built-in collector names.
std::unordered_map< std::string, std::string > config_map
Type alias for configuration map.
bool register_builtin_collectors()
Register all built-in collectors with the collector_registry.
TEST_F(AdaptiveMonitoringTest, AdaptiveConfigDefaults)