From 2c909907ec9471efea4ae6049f38b9305446211f Mon Sep 17 00:00:00 2001 From: donpat1to Date: Thu, 31 Jul 2025 14:28:27 +0200 Subject: [PATCH] added test section --- WatcherAgent/src/main.rs | 133 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 5 deletions(-) diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 03b902a..499479a 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -70,6 +70,7 @@ struct HeartbeatPayload { ip_address: String, } +#[derive(Serialize, Debug)] struct HardwareInfo { cpu_type: String, cpu_cores: i32, @@ -683,9 +684,131 @@ async fn main() -> Result<(), Box> { Ok(()) } -#[tokio::test] -async fn test_metrics() { - println!("CPU Temp: {:?}", get_cpu_temp()); - println!("Disk Info: {:?}", get_disk_info()); - println!("Network: {:?}", get_network_traffic()); +#[cfg(test)] +mod tests { + use super::*; + use tokio::runtime::Runtime; + + // Test CPU temperature collection + #[test] + fn test_cpu_temp() { + let temp = get_cpu_temp(); + println!("CPU Temperature: {:?}°C", temp); + + // Basic validation - temp should be between 0-100°C if available + if let Some(t) = temp { + assert!( + t >= 0.0 && t <= 100.0, + "CPU temperature out of reasonable range" + ); + } + } + + // Test disk information collection + #[test] + fn test_disk_info() { + let (size, usage, _temp) = get_disk_info(); + println!("Disk Size: {:.2}GB, Usage: {:.2}%", size, usage); + + assert!(size >= 0.0, "Disk size should be non-negative"); + assert!( + usage >= 0.0 && usage <= 100.0, + "Disk usage should be 0-100%" + ); + } + + // Test network traffic collection + #[test] + fn test_network_traffic() { + let traffic = get_network_traffic(); + println!("Network Traffic: {:?}", traffic); + + if let Some((rx, tx)) = traffic { + assert!(rx >= 0, "RX bytes should be non-negative"); + assert!(tx >= 0, "TX bytes should be non-negative"); + } + } + + // Test hardware info collection + #[tokio::test] + async fn test_hardware_info() { + let hardware = HardwareInfo::collect().await.unwrap(); + println!("Hardware Info: {:?}", hardware); + + assert!( + !hardware.cpu_type.is_empty(), + "CPU type should not be empty" + ); + assert!(hardware.cpu_cores > 0, "CPU cores should be positive"); + assert!( + !hardware.gpu_type.is_empty(), + "GPU type should not be empty" + ); + assert!(hardware.ram_size > 0.0, "RAM size should be positive"); + assert!( + !hardware.ip_address.is_empty(), + "IP address should not be empty" + ); + } + + // Test metrics collector + #[tokio::test] + async fn test_metrics_collector() { + let mut collector = MetricsCollector::new(1, "127.0.0.1".to_string()); + let metrics = collector.collect_metrics(); + println!("Collected Metrics: {:?}", metrics); + + // Validate basic metrics ranges + assert!( + metrics.cpu_load >= 0.0 && metrics.cpu_load <= 100.0, + "CPU load should be 0-100%" + ); + assert!( + metrics.ram_load >= 0.0 && metrics.ram_load <= 100.0, + "RAM load should be 0-100%" + ); + assert!(metrics.ram_size > 0.0, "RAM size should be positive"); + } + + // Test registration flow (mock server needed for full test) + #[tokio::test] + async fn test_registration_flow() { + // Note: This would require a mock server for proper testing + // Currently just testing the hardware detection part + let hardware = HardwareInfo::collect().await.unwrap(); + let registration = RegistrationDto { + id: 1, + ip_address: hardware.ip_address.clone(), + cpu_type: hardware.cpu_type, + cpu_cores: hardware.cpu_cores, + gpu_type: hardware.gpu_type, + ram_size: hardware.ram_size, + }; + + println!("Registration DTO: {:?}", registration); + assert_eq!(registration.id, 1); + assert!(!registration.ip_address.is_empty()); + } + + // Test error cases + #[test] + fn test_error_handling() { + // Test with invalid paths + #[cfg(target_os = "linux")] + { + let temp = get_cpu_temp_with_path("/invalid/path"); + assert!(temp.is_none(), "Should handle invalid paths gracefully"); + } + } + + // Helper function for testing with custom paths + #[cfg(target_os = "linux")] + fn get_cpu_temp_with_path(path: &str) -> Option { + fs::read_to_string(path) + .ok()? + .trim() + .parse::() + .map(|t| t / 1000.0) + .ok() + } }