5#include <gtest/gtest.h>
13class NetworkMetricsCollectorTest :
public ::testing::Test {
15 void SetUp()
override {
16 collector_ = std::make_unique<network_metrics_collector>();
17 std::unordered_map<std::string, std::string> config;
25TEST_F(NetworkMetricsCollectorTest, InitializesSuccessfully) {
27 EXPECT_EQ(
collector_->name(),
"network_metrics_collector");
31TEST_F(NetworkMetricsCollectorTest, ReturnsCorrectMetricTypes) {
33 EXPECT_FALSE(types.empty());
36 std::vector<std::string> expected_socket_types = {
37 "network_socket_recv_buffer_bytes",
38 "network_socket_send_buffer_bytes",
39 "network_socket_memory_bytes",
40 "network_socket_count_total"
43 for (
const auto& expected : expected_socket_types) {
44 bool found = std::find(types.begin(), types.end(), expected) != types.end();
45 EXPECT_TRUE(found) <<
"Expected metric type not found: " << expected;
49 std::vector<std::string> expected_tcp_types = {
50 "network_tcp_connections_established",
51 "network_tcp_connections_time_wait",
52 "network_tcp_connections_close_wait",
53 "network_tcp_connections_total"
56 for (
const auto& expected : expected_tcp_types) {
57 bool found = std::find(types.begin(), types.end(), expected) != types.end();
58 EXPECT_TRUE(found) <<
"Expected metric type not found: " << expected;
63TEST_F(NetworkMetricsCollectorTest, ConfigurationOptions) {
64 auto collector = std::make_unique<network_metrics_collector>();
66 std::unordered_map<std::string, std::string> config = {
68 {
"collect_socket_buffers",
"true"},
69 {
"collect_tcp_states",
"true"},
70 {
"time_wait_warning_threshold",
"5000"},
71 {
"close_wait_warning_threshold",
"50"},
72 {
"queue_full_threshold_bytes",
"32768"},
73 {
"memory_warning_threshold_bytes",
"52428800"}
76 EXPECT_TRUE(collector->initialize(config));
80TEST_F(NetworkMetricsCollectorTest, CanBeDisabled) {
81 auto collector = std::make_unique<network_metrics_collector>();
83 std::unordered_map<std::string, std::string> config = {
87 collector->initialize(config);
89 auto metrics = collector->collect();
91 EXPECT_TRUE(metrics.empty());
95TEST_F(NetworkMetricsCollectorTest, CanDisableSocketBuffers) {
96 auto collector = std::make_unique<network_metrics_collector>();
98 std::unordered_map<std::string, std::string> config = {
99 {
"collect_socket_buffers",
"false"},
100 {
"collect_tcp_states",
"true"}
103 collector->initialize(config);
105 auto types = collector->get_metric_types();
107 bool found = std::find(types.begin(), types.end(),
108 "network_socket_recv_buffer_bytes") != types.end();
113TEST_F(NetworkMetricsCollectorTest, CanDisableTcpStates) {
114 auto collector = std::make_unique<network_metrics_collector>();
116 std::unordered_map<std::string, std::string> config = {
117 {
"collect_socket_buffers",
"true"},
118 {
"collect_tcp_states",
"false"}
121 collector->initialize(config);
123 auto types = collector->get_metric_types();
125 bool found = std::find(types.begin(), types.end(),
126 "network_tcp_connections_established") != types.end();
131TEST_F(NetworkMetricsCollectorTest, TracksStatistics) {
133 EXPECT_TRUE(stats.find(
"collection_count") != stats.end());
134 EXPECT_TRUE(stats.find(
"collection_errors") != stats.end());
135 EXPECT_TRUE(stats.find(
"enabled") != stats.end());
136 EXPECT_TRUE(stats.find(
"socket_buffer_available") != stats.end());
137 EXPECT_TRUE(stats.find(
"tcp_state_available") != stats.end());
141TEST_F(NetworkMetricsCollectorTest, CollectReturnsMetrics) {
148TEST_F(NetworkMetricsCollectorTest, GetLastMetrics) {
152 auto now = std::chrono::system_clock::now();
153 auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - last.timestamp);
154 EXPECT_LT(diff.count(), 10);
158TEST_F(NetworkMetricsCollectorTest, MonitoringAvailabilityCheck) {
159 bool socket_available =
collector_->is_socket_buffer_monitoring_available();
160 bool tcp_available =
collector_->is_tcp_state_monitoring_available();
162 (void)socket_available;
167TEST(NetworkMetricsTest, DefaultInitialization) {
168 network_metrics metrics;
169 EXPECT_EQ(metrics.recv_buffer_bytes, 0);
170 EXPECT_EQ(metrics.send_buffer_bytes, 0);
171 EXPECT_EQ(metrics.socket_memory_bytes, 0);
172 EXPECT_EQ(metrics.socket_count, 0);
173 EXPECT_EQ(metrics.tcp_socket_count, 0);
174 EXPECT_EQ(metrics.udp_socket_count, 0);
175 EXPECT_FALSE(metrics.socket_buffer_available);
176 EXPECT_EQ(metrics.total_connections, 0);
177 EXPECT_FALSE(metrics.tcp_state_available);
181TEST(TcpStateCountsTest, DefaultInitialization) {
182 tcp_state_counts counts;
183 EXPECT_EQ(counts.established, 0);
184 EXPECT_EQ(counts.syn_sent, 0);
185 EXPECT_EQ(counts.syn_recv, 0);
186 EXPECT_EQ(counts.fin_wait1, 0);
187 EXPECT_EQ(counts.fin_wait2, 0);
188 EXPECT_EQ(counts.time_wait, 0);
189 EXPECT_EQ(counts.close, 0);
190 EXPECT_EQ(counts.close_wait, 0);
191 EXPECT_EQ(counts.last_ack, 0);
192 EXPECT_EQ(counts.listen, 0);
193 EXPECT_EQ(counts.closing, 0);
194 EXPECT_EQ(counts.unknown, 0);
198TEST(TcpStateCountsTest, IncrementWorks) {
199 tcp_state_counts counts;
204 EXPECT_EQ(counts.established, 2);
205 EXPECT_EQ(counts.time_wait, 1);
206 EXPECT_EQ(counts.total(), 3);
210TEST(TcpStateCountsTest, GetCountWorks) {
211 tcp_state_counts counts;
212 counts.established = 10;
213 counts.close_wait = 5;
221TEST(TcpStateTest, ToStringWorks) {
231TEST(NetworkInfoCollectorTest, BasicFunctionality) {
232 network_info_collector collector;
235 bool socket_available = collector.is_socket_buffer_monitoring_available();
236 bool tcp_available = collector.is_tcp_state_monitoring_available();
239 network_metrics_config config;
240 auto metrics = collector.collect_metrics(config);
243 if (socket_available) {
244 EXPECT_TRUE(metrics.socket_buffer_available);
247 EXPECT_TRUE(metrics.tcp_state_available);
252TEST_F(NetworkMetricsCollectorTest, MultipleCollectionsAreStable) {
253 for (
int i = 0; i < 3; ++i) {
263TEST_F(NetworkMetricsCollectorTest, MetricsHaveCorrectTags) {
265 for (
const auto& m : metrics) {
267 auto it = m.tags.find(
"collector");
268 if (it != m.tags.end()) {
269 EXPECT_EQ(it->second,
"network_metrics_collector");
275TEST_F(NetworkMetricsCollectorTest, IsAvailableReflectsState) {
278 EXPECT_TRUE(available);
282TEST(NetworkMetricsConfigTest, DefaultValues) {
283 network_metrics_config config;
284 EXPECT_TRUE(config.collect_socket_buffers);
285 EXPECT_TRUE(config.collect_tcp_states);
286 EXPECT_EQ(config.time_wait_warning_threshold, 10000);
287 EXPECT_EQ(config.close_wait_warning_threshold, 100);
288 EXPECT_EQ(config.queue_full_threshold_bytes, 65536);
289 EXPECT_EQ(config.memory_warning_threshold_bytes, 104857600);
292#if defined(__linux__) || defined(__APPLE__)
294TEST_F(NetworkMetricsCollectorTest, UnixNetworkMonitoringAvailable) {
295 bool socket_available =
collector_->is_socket_buffer_monitoring_available();
296 bool tcp_available =
collector_->is_tcp_state_monitoring_available();
298 EXPECT_TRUE(socket_available || tcp_available);
302TEST(NetworkInfoCollectorTest, HasNetworkDataOnUnix) {
303 network_info_collector collector;
305 if (!collector.is_socket_buffer_monitoring_available() &&
306 !collector.is_tcp_state_monitoring_available()) {
307 GTEST_SKIP() <<
"Network monitoring not available";
310 network_metrics_config config;
311 auto metrics = collector.collect_metrics(config);
314 EXPECT_TRUE(metrics.socket_buffer_available || metrics.tcp_state_available);
318TEST(NetworkInfoCollectorTest, HasTcpConnectionsOnUnix) {
319 network_info_collector collector;
321 if (!collector.is_tcp_state_monitoring_available()) {
322 GTEST_SKIP() <<
"TCP state monitoring not available";
325 network_metrics_config config;
326 config.collect_socket_buffers =
false;
327 config.collect_tcp_states =
true;
328 auto metrics = collector.collect_metrics(config);
330 EXPECT_TRUE(metrics.tcp_state_available);
332 EXPECT_GT(metrics.total_connections, 0);
339TEST_F(NetworkMetricsCollectorTest, WindowsNetworkMonitoringUnavailable) {
340 EXPECT_FALSE(
collector_->is_socket_buffer_monitoring_available());
341 EXPECT_TRUE(
collector_->is_tcp_state_monitoring_available());
345TEST(NetworkInfoCollectorTest, WindowsReturnsUnavailableMetrics) {
346 network_info_collector collector;
347 network_metrics_config config;
348 auto metrics = collector.collect_metrics(config);
350 EXPECT_FALSE(metrics.socket_buffer_available);
352 EXPECT_TRUE(metrics.tcp_state_available);
std::string tcp_state_to_string(tcp_state state)
Convert tcp_state to string representation.
@ SYN_SENT
SYN sent, waiting for SYN-ACK.
@ TIME_WAIT
Waiting for enough time to pass (2MSL)
@ UNKNOWN
Unknown or invalid state.
@ ESTABLISHED
Connection established.
@ CLOSE_WAIT
Remote side has closed, waiting for local close.
@ LISTEN
Listening for incoming connections.
Unified network metrics collector for socket buffers and TCP states.
TEST(AdapterFunctionalityTest, WorksWithoutLogger)
Test Scenario 1: Adapter with NULL logger.
TEST_F(AdaptiveMonitoringTest, AdaptiveConfigDefaults)
std::unique_ptr< battery_collector > collector_