use sal_net::TcpConnector;
use std::net::{IpAddr, Ipv4Addr};
use std::time::Duration;
use tokio::net::TcpListener;
#[tokio::test]
async fn test_tcp_connector_new() {
let connector = TcpConnector::new();
let result = connector
.check_port(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 65534)
.await;
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[tokio::test]
async fn test_tcp_connector_with_timeout() {
let timeout = Duration::from_millis(100); let connector = TcpConnector::with_timeout(timeout);
let start = std::time::Instant::now();
let result = connector
.check_port(IpAddr::V4(Ipv4Addr::new(10, 255, 255, 1)), 80)
.await;
let elapsed = start.elapsed();
assert!(result.is_ok());
assert!(!result.unwrap()); assert!(elapsed < Duration::from_secs(2)); }
#[tokio::test]
async fn test_tcp_connector_default() {
let connector = TcpConnector::default();
let result = connector
.check_port(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 65534)
.await;
assert!(result.is_ok());
assert!(!result.unwrap());
let ping_result = connector.ping("127.0.0.1").await;
assert!(ping_result.is_ok()); }
#[tokio::test]
async fn test_check_port_open() {
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let addr = listener.local_addr().unwrap();
let _handle = tokio::spawn(async move {
loop {
if let Ok((stream, _)) = listener.accept().await {
drop(stream); }
}
});
tokio::time::sleep(Duration::from_millis(10)).await;
let connector = TcpConnector::new();
let result = connector.check_port(addr.ip(), addr.port()).await;
assert!(result.is_ok());
assert!(result.unwrap()); }
#[tokio::test]
async fn test_check_port_closed() {
let connector = TcpConnector::new();
let result = connector
.check_port(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 65534)
.await;
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[tokio::test]
async fn test_check_port_timeout() {
let connector = TcpConnector::with_timeout(Duration::from_millis(1));
let result = connector
.check_port(IpAddr::V4(Ipv4Addr::new(10, 255, 255, 1)), 80)
.await;
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[tokio::test]
async fn test_check_multiple_ports() {
let listener1 = TcpListener::bind("127.0.0.1:0").await.unwrap();
let addr1 = listener1.local_addr().unwrap();
let listener2 = TcpListener::bind("127.0.0.1:0").await.unwrap();
let addr2 = listener2.local_addr().unwrap();
let _handle1 = tokio::spawn(async move {
loop {
if let Ok((stream, _)) = listener1.accept().await {
drop(stream);
}
}
});
let _handle2 = tokio::spawn(async move {
loop {
if let Ok((stream, _)) = listener2.accept().await {
drop(stream);
}
}
});
tokio::time::sleep(Duration::from_millis(10)).await;
let connector = TcpConnector::new();
let ports = vec![addr1.port(), addr2.port(), 65533]; let results = connector.check_ports(addr1.ip(), &ports).await;
assert!(results.is_ok());
let results = results.unwrap();
assert_eq!(results.len(), 3);
assert!(results[0].1); assert!(results[1].1); assert!(!results[2].1); }
#[tokio::test]
async fn test_ping_localhost() {
let connector = TcpConnector::new();
let result = connector.ping("localhost").await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_ping_invalid_host() {
let connector = TcpConnector::new();
let result = connector
.ping("this-host-definitely-does-not-exist-12345")
.await;
assert!(result.is_ok());
assert!(!result.unwrap()); }
#[tokio::test]
async fn test_ping_timeout() {
let connector = TcpConnector::with_timeout(Duration::from_millis(1));
let result = connector.ping("10.255.255.1").await;
assert!(result.is_ok());
}