pub mod interface;
pub mod traffic;
pub use interface::{Interface, InterfaceType, NetworkManager};
pub use traffic::TrafficData;
pub trait NetworkMetrics {
fn bytes_received(&self) -> u64;
fn bytes_sent(&self) -> u64;
fn packets_received(&self) -> u64;
fn packets_sent(&self) -> u64;
fn receive_errors(&self) -> u64;
fn send_errors(&self) -> u64;
fn collisions(&self) -> u64;
fn download_speed(&self) -> f64;
fn upload_speed(&self) -> f64;
fn is_active(&self) -> bool;
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
use super::*;
use crate::network::interface::{Interface, InterfaceType};
fn create_mock_interface(
name: &str,
interface_type: InterfaceType,
is_loopback: bool,
) -> Interface {
let flags = if is_loopback {
crate::utils::bindings::if_flags::IFF_UP
| crate::utils::bindings::if_flags::IFF_RUNNING
| crate::utils::bindings::if_flags::IFF_LOOPBACK
} else {
crate::utils::bindings::if_flags::IFF_UP | crate::utils::bindings::if_flags::IFF_RUNNING
};
Interface::new(
name.to_string(),
interface_type,
flags,
Some("00:00:00:00:00:00".to_string()),
vec![],
1000, 2000, 100, 200, 0, 0, 0, )
}
fn create_test_network_manager() -> NetworkManager {
let mut interfaces = HashMap::new();
let lo0 = create_mock_interface("lo0", InterfaceType::Loopback, true);
interfaces.insert("lo0".to_string(), lo0);
let en0 = create_mock_interface("en0", InterfaceType::Ethernet, false);
interfaces.insert("en0".to_string(), en0);
NetworkManager { interfaces }
}
#[test]
fn test_network_metrics_trait() {
let interface = create_mock_interface("test0", InterfaceType::Ethernet, false);
assert_eq!(interface.bytes_received(), 1000);
assert_eq!(interface.bytes_sent(), 2000);
assert_eq!(interface.packets_received(), 100);
assert_eq!(interface.packets_sent(), 200);
assert_eq!(interface.receive_errors(), 0);
assert_eq!(interface.send_errors(), 0);
assert_eq!(interface.collisions(), 0);
assert!(interface.is_active());
assert_eq!(interface.download_speed(), 0.0);
assert_eq!(interface.upload_speed(), 0.0);
}
#[test]
fn test_interface_properties() {
let loopback = create_mock_interface("lo0", InterfaceType::Loopback, true);
let ethernet = create_mock_interface("en0", InterfaceType::Ethernet, false);
assert!(loopback.is_loopback());
assert!(!ethernet.is_loopback());
assert_eq!(loopback.name(), "lo0");
assert_eq!(ethernet.name(), "en0");
assert_eq!(loopback.interface_type(), &InterfaceType::Loopback);
assert_eq!(ethernet.interface_type(), &InterfaceType::Ethernet);
assert_eq!(loopback.mac_address(), Some("00:00:00:00:00:00"));
assert_eq!(ethernet.mac_address(), Some("00:00:00:00:00:00"));
}
#[test]
fn test_network_manager() {
let network_manager = create_test_network_manager();
let interfaces = network_manager.interfaces();
assert_eq!(interfaces.len(), 2, "Should have 2 interfaces");
let lo0 = network_manager.get_interface("lo0");
assert!(lo0.is_some(), "Loopback interface should exist");
assert!(lo0.unwrap().is_loopback(), "lo0 should be a loopback interface");
let en0 = network_manager.get_interface("en0");
assert!(en0.is_some(), "Ethernet interface should exist");
assert!(!en0.unwrap().is_loopback(), "en0 should not be a loopback interface");
let nonexistent = network_manager.get_interface("nonexistent");
assert!(nonexistent.is_none(), "Nonexistent interface should return None");
assert_eq!(
network_manager.total_download_speed(),
0.0,
"Initial download speed should be 0"
);
assert_eq!(network_manager.total_upload_speed(), 0.0, "Initial upload speed should be 0");
}
#[test]
#[ignore = "This test needs a real network environment"]
fn test_real_network_manager() {
let network_manager = NetworkManager::new();
if let Ok(manager) = network_manager {
assert!(!manager.interfaces().is_empty(), "Should have at least one interface");
}
}
}