diff --git a/src/net/ping.rs b/src/net/ping.rs index 496a813..27684c4 100644 --- a/src/net/ping.rs +++ b/src/net/ping.rs @@ -290,3 +290,80 @@ impl Display for PingDestination { } } } + +#[cfg(test)] +mod tests { + use std::{ + net::{IpAddr, Ipv4Addr, Ipv6Addr}, + str::FromStr, + time::Duration, + }; + + use gtk::gio::IOErrorEnum; + + use super::PingDestination; + + #[test] + fn ping_loopback_ipv4() { + glib::MainContext::new().block_on(async move { + let duration = super::ping_address(Ipv4Addr::LOCALHOST.into(), 4) + .await + .unwrap(); + // A reasonable sanity test + assert!(duration < Duration::from_secs(5)); + }); + } + + #[test] + fn ping_loopback_ipv6() { + glib::MainContext::new().block_on(async move { + let duration = super::ping_address(Ipv6Addr::LOCALHOST.into(), 4) + .await + .unwrap(); + // A reasonable sanity test + assert!(duration < Duration::from_secs(5)); + }); + } + + #[test] + fn ping_with_timeout_unroutable() { + glib::MainContext::new().block_on(async move { + let error = super::ping_address_with_timeout( + Ipv4Addr::from_str("192.0.2.42").unwrap().into(), + 4, + Duration::from_secs(1), + ) + .await + .unwrap_err(); + assert!(error.matches(IOErrorEnum::TimedOut)); + assert_eq!(error.message(), "Timeout after 1000ms"); + }); + } + + #[test] + fn ping_destination_resolve() { + glib::MainContext::new().block_on(async move { + assert_eq!( + PingDestination::Addr(Ipv4Addr::LOCALHOST.into()) + .resolve() + .await + .unwrap(), + vec![IpAddr::V4(Ipv4Addr::LOCALHOST)] + ); + assert_eq!( + PingDestination::Addr(Ipv6Addr::LOCALHOST.into()) + .resolve() + .await + .unwrap(), + vec![IpAddr::V6(Ipv6Addr::LOCALHOST)] + ); + let addresses = PingDestination::Dns("localhost".into()) + .resolve() + .await + .unwrap(); + assert!(addresses.len() >= 2); + assert!(addresses.contains(&IpAddr::V4(Ipv4Addr::LOCALHOST))); + assert!(addresses.contains(&IpAddr::V6(Ipv6Addr::LOCALHOST))); + }); + } +}