-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_network_monitor.cpp
More file actions
76 lines (68 loc) · 2.69 KB
/
Copy pathtest_network_monitor.cpp
File metadata and controls
76 lines (68 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <gtest/gtest.h>
#include "sysmon/network_monitor.hpp"
TEST(NetworkMonitorTest, ReturnsVector) {
NetworkMonitor mon;
// First call initializes internal state (may return empty on first run)
auto result1 = mon.read();
auto result2 = mon.read();
// After two calls, we should have results
EXPECT_GE(result2.size(), 0u);
}
TEST(NetworkMonitorTest, InterfaceNameNotEmpty) {
NetworkMonitor mon;
mon.read(); // warm-up
auto result = mon.read();
for (const auto& n : result) {
EXPECT_FALSE(n.name.empty());
}
}
TEST(NetworkMonitorTest, RatesNonNegative) {
NetworkMonitor mon;
mon.read();
auto result = mon.read();
for (const auto& n : result) {
EXPECT_GE(n.rx_bytes_per_sec, 0.0);
EXPECT_GE(n.tx_bytes_per_sec, 0.0);
}
}
// ---------------------------------------------------------------------------
// Routing and resolver parsing
// ---------------------------------------------------------------------------
TEST(NetworkMonitorTest, ParsesDefaultGatewayFromProcNetRoute) {
// /proc/net/route stores addresses as little-endian hex words.
// 0101A8C0 == 192.168.1.1
const std::string content =
"Iface\tDestination\tGateway \tFlags\tRefCnt\tUse\tMetric\tMask\n"
"eth0\t0000A8C0\t00000000\t0001\t0\t0\t0\t00FFFFFF\n"
"eth0\t00000000\t0101A8C0\t0003\t0\t0\t100\t00000000\n";
EXPECT_EQ(NetworkMonitor::parse_proc_net_route(content), "192.168.1.1");
}
TEST(NetworkMonitorTest, NoDefaultRouteYieldsEmptyGateway) {
const std::string content =
"Iface\tDestination\tGateway \tFlags\tRefCnt\tUse\tMetric\tMask\n"
"eth0\t0000A8C0\t00000000\t0001\t0\t0\t0\t00FFFFFF\n";
EXPECT_TRUE(NetworkMonitor::parse_proc_net_route(content).empty());
EXPECT_TRUE(NetworkMonitor::parse_proc_net_route("").empty());
}
TEST(NetworkMonitorTest, ParsesNameserversAndSkipsComments) {
const std::string content =
"# generated by resolvconf\n"
"search example.com\n"
"nameserver 192.168.1.1\n"
"nameserver 8.8.8.8 # secondary\n"
"nameserver 192.168.1.1\n" // duplicate
"options edns0\n";
const auto servers = NetworkMonitor::parse_resolv_conf(content);
ASSERT_EQ(servers.size(), 2u);
EXPECT_EQ(servers[0], "192.168.1.1");
EXPECT_EQ(servers[1], "8.8.8.8");
}
TEST(NetworkMonitorTest, LinkSpeedIsEitherUnsetOrPlausible) {
NetworkMonitor monitor;
for (const auto& n : monitor.read()) {
if (!n.speed_mbps.has_value()) continue;
// A reported link speed must be a real one, not a zero placeholder.
EXPECT_GT(n.speed_mbps.value(), 0u) << n.name;
EXPECT_LE(n.speed_mbps.value(), 1'000'000u) << n.name;
}
}