use blvm_node::network::*;
use std::net::SocketAddr;
#[tokio::test]
async fn test_message_size_validation() {
use blvm_node::network::protocol::MAX_PROTOCOL_MESSAGE_LENGTH;
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
use blvm_node::network::protocol::ProtocolParser;
let oversized_data = vec![0u8; MAX_PROTOCOL_MESSAGE_LENGTH + 1];
let result = ProtocolParser::parse_message(&oversized_data);
assert!(result.is_err(), "Oversized message should be rejected");
}
#[tokio::test]
async fn test_rate_limiting() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
let test_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
assert_eq!(test_addr.port(), 8333);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_per_ip_connection_limit() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
let test_ip: std::net::IpAddr = "127.0.0.1".parse().unwrap();
assert!(manager.peer_count() == 0);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_ban_list_cleanup() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
use std::time::{SystemTime, UNIX_EPOCH};
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
let test_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let past_timestamp = now - 3600; manager.ban_peer(test_addr, past_timestamp);
let was_banned = manager.is_banned(test_addr);
assert!(!was_banned, "Expired ban should be automatically removed");
let banned = manager.get_banned_peers();
assert!(
!banned.iter().any(|(addr, _)| *addr == test_addr),
"Expired ban should not be in ban list"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_ban_list_permanent() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
let test_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
manager.ban_peer(test_addr, 0);
assert!(
manager.is_banned(test_addr),
"Permanent ban should be active"
);
manager.unban_peer(test_addr);
assert!(
!manager.is_banned(test_addr),
"Unbanned peer should not be banned"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_ban_list_temporary() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
use std::time::{SystemTime, UNIX_EPOCH};
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs();
let test_addr: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let future_timestamp = now + 3600;
manager.ban_peer(test_addr, future_timestamp);
assert!(
manager.is_banned(test_addr),
"Active temporary ban should be active"
);
manager.unban_peer(test_addr);
}
#[tokio::test(flavor = "multi_thread")]
async fn test_clear_bans() {
let addr: SocketAddr = "127.0.0.1:0".parse().unwrap();
let manager = NetworkManager::new(addr);
let test_addr1: SocketAddr = "127.0.0.1:8333".parse().unwrap();
let test_addr2: SocketAddr = "127.0.0.1:8334".parse().unwrap();
manager.ban_peer(test_addr1, 0);
manager.ban_peer(test_addr2, 0);
assert_eq!(manager.get_banned_peers().len(), 2);
manager.clear_bans();
assert_eq!(manager.get_banned_peers().len(), 0);
assert!(!manager.is_banned(test_addr1));
assert!(!manager.is_banned(test_addr2));
}