#[cfg(test)]
mod tests {
use aex::connection::{
entry::ConnectionEntry, node::Node, protocol::Protocol, scope::NetworkScope,
};
use std::{
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
sync::atomic::Ordering,
};
use tokio_util::sync::CancellationToken;
#[test]
fn test_network_scope_logic() {
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1))),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1))),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(169, 254, 1, 1))),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8))),
NetworkScope::Extranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V4(Ipv4Addr::new(114, 114, 114, 114))),
NetworkScope::Extranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V6(Ipv6Addr::LOCALHOST)),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V6(Ipv6Addr::new(0xfe80, 0, 0, 0, 0, 0, 0, 1))),
NetworkScope::Intranet
); assert_eq!(
NetworkScope::from_ip(&IpAddr::V6(Ipv6Addr::new(0xfc00, 0, 0, 0, 0, 0, 0, 1))),
NetworkScope::Intranet
);
assert_eq!(
NetworkScope::from_ip(&IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1))),
NetworkScope::Extranet
);
}
#[tokio::test]
async fn test_connection_entry_lifecycle() {
let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap();
let token = CancellationToken::new();
let handle = tokio::spawn(async {
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
})
.abort_handle();
let entry = ConnectionEntry::new_empty_node(addr, None, handle, token);
assert!(entry.uptime_secs() <= 1);
assert_eq!(entry.get_peer_id().await, None);
let node_id = b"fixed_node_id_32_bytes__________".to_vec();
let mock_node = Node::from_addr(
"192.168.1.100:9000".parse().unwrap(),
Some(3), Some(node_id.clone()), );
entry.update_node(mock_node.clone()).await;
let peer_id = entry.get_peer_id().await;
assert!(peer_id.is_some());
assert_eq!(peer_id.unwrap(), node_id);
{
let node_lock = entry.node.read().await;
let node_ref = node_lock.as_ref().unwrap();
assert_eq!(node_ref.port, 9000);
assert_eq!(node_ref.version, 3);
assert!(node_ref.protocols.contains(&Protocol::Tcp));
}
}
#[tokio::test]
async fn test_is_deactivated_logic() {
let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap();
let entry = ConnectionEntry::new_empty_node(
addr,
None,
tokio::spawn(async {}).abort_handle(),
CancellationToken::new(),
);
let now = entry.connected_at;
assert!(!entry.is_deactivated(now + 10, 30, 100));
assert!(entry.is_deactivated(now + 101, 30, 100));
entry.last_seen.store(now + 10, Ordering::SeqCst);
assert!(entry.is_deactivated(now + 50, 30, 1000));
assert!(!entry.is_deactivated(now - 100, 30, 100));
}
#[tokio::test]
async fn test_drop_aborts_handle() {
let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap();
let (tx, mut rx) = tokio::sync::mpsc::channel(1);
let handle = tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(100)).await;
let _ = tx.send(()).await;
});
{
let abort_handle = handle.abort_handle();
let _entry =
ConnectionEntry::new_empty_node(addr, None, abort_handle, CancellationToken::new());
}
let join_result = handle.await;
assert!(join_result.is_err());
assert!(join_result.unwrap_err().is_cancelled());
assert!(rx.try_recv().is_err());
}
}