#[path = "../src/network/speed.rs"]
mod speed;
use speed::aggregate_interface_bytes;
use std::collections::HashSet;
fn uplinks(names: &[&str]) -> HashSet<String> {
names.iter().map(|s| s.to_string()).collect()
}
#[test]
fn only_gateway_uplink_is_counted() {
let ifaces = vec![
("vEthernet (nat)".to_string(), 178_641_887u64, 4_948_670_886u64),
("vEthernet (Default Switch)".to_string(), 0, 471_341),
("vEthernet (WSL (Hyper-V firewall))".to_string(), 19_912, 483_290),
("Wi-Fi-Native WiFi Filter Driver-0000".to_string(), 53_691_547, 459_906_686),
("Wi-Fi".to_string(), 53_691_547, 459_906_686),
];
let up = uplinks(&["Wi-Fi"]);
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, Some(&up));
assert_eq!(recv, 53_691_547, "only the Wi-Fi uplink recv should count");
assert_eq!(sent, 459_906_686, "only the Wi-Fi uplink sent should count");
assert_eq!(iface, "Wi-Fi");
}
#[test]
fn multiple_gateway_uplinks_all_counted() {
let ifaces = vec![
("Ethernet".to_string(), 1_000u64, 2_000u64),
("Wi-Fi".to_string(), 500, 300),
("vEthernet (WSL)".to_string(), 9_000_000, 9_000_000),
];
let up = uplinks(&["Ethernet", "Wi-Fi"]);
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, Some(&up));
assert_eq!(recv, 1_500);
assert_eq!(sent, 2_300);
assert_eq!(iface, "Ethernet");
}
#[test]
fn empty_uplink_set_counts_nothing() {
let ifaces = vec![("Wi-Fi".to_string(), 500u64, 300u64)];
let up: HashSet<String> = HashSet::new();
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, Some(&up));
assert_eq!(recv, 0);
assert_eq!(sent, 0);
assert_eq!(iface, "No Interface");
}
#[test]
fn fallback_filter_driver_shadow_row_is_not_double_counted() {
let ifaces = vec![
("vEthernet (nat)".to_string(), 175_425_087u64, 4_947_922_843u64),
("vEthernet (Default Switch)".to_string(), 0, 143_600),
("Wi-Fi-Native WiFi Filter Driver-0000".to_string(), 12_165_914_220, 14_636_879_690),
("vEthernet (WSL (Hyper-V firewall))".to_string(), 17_842, 155_549),
("Wi-Fi".to_string(), 12_165_914_220, 14_636_879_690),
];
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 175_425_087 + 17_842 + 12_165_914_220, "Wi-Fi bytes counted twice");
assert_eq!(sent, 4_947_922_843 + 143_600 + 155_549 + 14_636_879_690, "Wi-Fi bytes counted twice");
assert_eq!(iface, "Wi-Fi");
}
#[test]
fn fallback_independent_adapters_all_counted() {
let ifaces = vec![
("Ethernet".to_string(), 1_000u64, 2_000u64),
("Wi-Fi".to_string(), 500, 300),
];
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 1_500);
assert_eq!(sent, 2_300);
assert_eq!(iface, "Ethernet");
}
#[test]
fn fallback_short_numeric_suffix_still_counted() {
let ifaces = vec![
("Ethernet".to_string(), 1_000u64, 2_000u64),
("Ethernet-2".to_string(), 700, 800),
];
let (recv, sent, _) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 1_700);
assert_eq!(sent, 2_800);
}
#[test]
fn fallback_shadow_row_with_drifted_counters_still_skipped() {
let ifaces = vec![
("Wi-Fi".to_string(), 12_165_914_220u64, 14_636_879_690u64),
("Wi-Fi-Native WiFi Filter Driver-0000".to_string(), 12_165_915_733, 14_636_880_101),
];
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 12_165_914_220);
assert_eq!(sent, 14_636_879_690);
assert_eq!(iface, "Wi-Fi");
}
#[test]
fn fallback_suffix_without_matching_base_still_counted() {
let ifaces = vec![
("Ethernet".to_string(), 1_000u64, 2_000u64),
("Tunnel-0001".to_string(), 700, 800),
];
let (recv, sent, _) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 1_700);
assert_eq!(sent, 2_800);
}
#[test]
fn fallback_multiple_shadow_rows_all_skipped() {
let ifaces = vec![
("Wi-Fi".to_string(), 42u64, 24u64),
("Wi-Fi-Native WiFi Filter Driver-0000".to_string(), 42, 24),
("Wi-Fi-QoS Packet Scheduler-0000".to_string(), 42, 24),
];
let (recv, sent, iface) = aggregate_interface_bytes(&ifaces, None);
assert_eq!(recv, 42);
assert_eq!(sent, 24);
assert_eq!(iface, "Wi-Fi");
}