use blvm_node::network::{transport::TransportPreference, NetworkManager};
use std::net::SocketAddr;
use tokio::time::{sleep, Duration};
#[tokio::test(flavor = "multi_thread")]
async fn test_request_id_matching() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (id1, rx1) = manager.register_request(peer_addr);
let (id2, rx2) = manager.register_request(peer_addr);
let (id3, rx3) = manager.register_request(peer_addr);
let response2 = vec![2, 2, 2];
let response1 = vec![1, 1, 1];
let response3 = vec![3, 3, 3];
assert!(manager.complete_request(id2, response2.clone()));
assert!(manager.complete_request(id1, response1.clone()));
assert!(manager.complete_request(id3, response3.clone()));
tokio::select! {
result = rx1 => {
assert_eq!(result.unwrap(), response1);
}
_ = sleep(Duration::from_millis(100)) => {
panic!("Request 1 timeout");
}
}
tokio::select! {
result = rx2 => {
assert_eq!(result.unwrap(), response2);
}
_ = sleep(Duration::from_millis(100)) => {
panic!("Request 2 timeout");
}
}
tokio::select! {
result = rx3 => {
assert_eq!(result.unwrap(), response3);
}
_ = sleep(Duration::from_millis(100)) => {
panic!("Request 3 timeout");
}
}
}
#[tokio::test(flavor = "multi_thread")]
async fn test_request_cancellation() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (request_id, rx) = manager.register_request(peer_addr);
assert!(manager.cancel_request(request_id));
assert!(!manager.complete_request(request_id, vec![1, 2, 3]));
assert!(rx.await.is_err());
}
#[tokio::test(flavor = "multi_thread")]
async fn test_timestamp_cleanup() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (request_id, _rx) = manager.register_request(peer_addr);
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
let cleaned = manager.cleanup_expired_requests(0);
assert_eq!(cleaned, 1);
assert!(!manager.complete_request(request_id, vec![1, 2, 3]));
}
#[tokio::test(flavor = "multi_thread")]
async fn test_multiple_concurrent_requests_per_peer() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (id1, rx1) = manager.register_request(peer_addr);
let (id2, rx2) = manager.register_request(peer_addr);
let (id3, rx3) = manager.register_request(peer_addr);
let pending = manager.get_pending_requests_for_peer(peer_addr);
assert_eq!(pending.len(), 3);
assert!(pending.contains(&id1));
assert!(pending.contains(&id2));
assert!(pending.contains(&id3));
manager.complete_request(id1, vec![1]);
manager.complete_request(id2, vec![2]);
manager.complete_request(id3, vec![3]);
assert_eq!(rx1.await.unwrap(), vec![1]);
assert_eq!(rx2.await.unwrap(), vec![2]);
assert_eq!(rx3.await.unwrap(), vec![3]);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_request_metrics() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (id1, _rx1) = manager.register_request(peer_addr);
manager.complete_request(id1, vec![1, 2, 3]);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_request_priority() {
let listen_addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager =
NetworkManager::with_transport_preference(listen_addr, 100, TransportPreference::TCP_ONLY);
let peer_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let (_id1, _rx1) = manager.register_request_with_priority(peer_addr, 0);
let (_id2, _rx2) = manager.register_request_with_priority(peer_addr, 5);
let (_id3, _rx3) = manager.register_request_with_priority(peer_addr, 10);
let pending = manager.get_pending_requests_for_peer(peer_addr);
assert_eq!(pending.len(), 3);
}