use blvm_node::network::dos_protection::{
ConnectionRateLimiter, DosProtectionManager, ResourceMetrics,
};
use std::net::{IpAddr, Ipv4Addr};
use tokio::time::{sleep, Duration};
fn create_test_ip(octet: u8) -> IpAddr {
IpAddr::V4(Ipv4Addr::new(192, 168, 1, octet))
}
#[test]
fn test_connection_rate_limiter_creation() {
let mut limiter = ConnectionRateLimiter::new(10, 60);
let ip = create_test_ip(1);
assert!(limiter.check_connection(ip)); }
#[test]
fn test_connection_rate_limiter_allows_connections() {
let mut limiter = ConnectionRateLimiter::new(5, 60);
let ip = create_test_ip(1);
for _ in 0..5 {
assert!(limiter.check_connection(ip));
}
assert!(!limiter.check_connection(ip));
}
#[test]
fn test_connection_rate_limiter_flood_rejection() {
let mut limiter = ConnectionRateLimiter::new(10, 60);
let ip = create_test_ip(42);
let mut allowed = 0u32;
let mut rejected = 0u32;
for _ in 0..15 {
if limiter.check_connection(ip) {
allowed += 1;
} else {
rejected += 1;
}
}
assert_eq!(allowed, 10, "First 10 connections should be allowed");
assert_eq!(rejected, 5, "Connections 11-15 should be rejected");
}
#[test]
fn test_connection_rate_limiter_per_ip_tracking() {
let mut limiter = ConnectionRateLimiter::new(3, 60);
let ip1 = create_test_ip(1);
let ip2 = create_test_ip(2);
assert!(limiter.check_connection(ip1));
assert!(limiter.check_connection(ip1));
assert!(limiter.check_connection(ip1));
assert!(limiter.check_connection(ip2));
assert!(limiter.check_connection(ip2));
assert!(limiter.check_connection(ip2));
assert!(!limiter.check_connection(ip1));
assert!(!limiter.check_connection(ip2));
}
#[test]
fn test_connection_rate_limiter_cleanup() {
let mut limiter = ConnectionRateLimiter::new(5, 1); let ip = create_test_ip(1);
for _ in 0..5 {
assert!(limiter.check_connection(ip));
}
assert!(!limiter.check_connection(ip));
std::thread::sleep(Duration::from_secs(2));
limiter.cleanup();
assert!(limiter.check_connection(ip));
}
#[test]
fn test_connection_rate_limiter_get_attempt_count() {
let mut limiter = ConnectionRateLimiter::new(10, 60);
let ip = create_test_ip(1);
assert_eq!(limiter.get_attempt_count(ip), 0);
limiter.check_connection(ip);
assert_eq!(limiter.get_attempt_count(ip), 1);
limiter.check_connection(ip);
assert_eq!(limiter.get_attempt_count(ip), 2);
}
#[test]
fn test_connection_rate_limiter_time_window() {
let mut limiter = ConnectionRateLimiter::new(3, 1); let ip = create_test_ip(1);
for _ in 0..3 {
assert!(limiter.check_connection(ip));
}
assert!(!limiter.check_connection(ip));
std::thread::sleep(Duration::from_secs(2));
assert!(limiter.check_connection(ip));
}
#[test]
fn test_resource_metrics_creation() {
let metrics = ResourceMetrics::new();
assert_eq!(metrics.active_connections, 0);
assert_eq!(metrics.message_queue_size, 0);
assert_eq!(metrics.bytes_received, 0);
assert_eq!(metrics.bytes_sent, 0);
}
#[test]
fn test_dos_protection_manager_creation() {
let _manager = DosProtectionManager::new(10, 60, 1000, 50);
assert!(true); }
#[test]
fn test_dos_protection_manager_default() {
let _manager = DosProtectionManager::default();
assert!(true); }
#[tokio::test]
async fn test_dos_protection_manager_check_connection() {
let manager = DosProtectionManager::new(3, 60, 1000, 50);
let ip = create_test_ip(1);
assert!(manager.check_connection(ip).await);
assert!(manager.check_connection(ip).await);
assert!(manager.check_connection(ip).await);
assert!(!manager.check_connection(ip).await);
}
#[tokio::test]
async fn test_dos_protection_manager_message_queue_check() {
let manager = DosProtectionManager::new(10, 60, 100, 50);
assert!(manager.check_message_queue_size(50).await);
assert!(manager.check_message_queue_size(100).await);
assert!(!manager.check_message_queue_size(101).await);
assert!(!manager.check_message_queue_size(1000).await);
}
#[tokio::test]
async fn test_dos_protection_manager_active_connections_check() {
let manager = DosProtectionManager::new(10, 60, 1000, 5);
assert!(manager.check_active_connections(0).await);
assert!(manager.check_active_connections(4).await);
assert!(!manager.check_active_connections(5).await);
assert!(!manager.check_active_connections(6).await);
assert!(!manager.check_active_connections(100).await);
}
#[tokio::test]
async fn test_dos_protection_manager_auto_ban() {
let manager = DosProtectionManager::with_ban_settings(
3, 1, 1000, 50, 2, 300, );
let ip = create_test_ip(1);
for _ in 0..3 {
assert!(manager.check_connection(ip).await);
}
assert!(!manager.check_connection(ip).await);
let dos_metrics = manager.get_dos_metrics().await;
assert!(dos_metrics.connection_rate_violations >= 1);
assert!(!manager.should_auto_ban(ip).await);
sleep(Duration::from_secs(2)).await;
for _ in 0..3 {
assert!(manager.check_connection(ip).await);
}
assert!(!manager.check_connection(ip).await);
let dos_metrics_after = manager.get_dos_metrics().await;
assert!(dos_metrics_after.connection_rate_violations >= 2);
let should_ban = manager.should_auto_ban(ip).await;
if should_ban {
assert!(dos_metrics_after.auto_bans_applied >= 1);
}
}
#[tokio::test]
async fn test_dos_protection_manager_metrics() {
let manager = DosProtectionManager::new(3, 60, 1000, 50);
let ip = create_test_ip(1);
let initial_metrics = manager.get_dos_metrics().await;
let initial_violations = initial_metrics.connection_rate_violations;
for _ in 0..4 {
manager.check_connection(ip).await; }
let metrics = manager.get_dos_metrics().await;
assert!(metrics.connection_rate_violations > initial_violations);
}
#[tokio::test]
async fn test_dos_protection_manager_violation_reset() {
let manager = DosProtectionManager::new(3, 60, 1000, 50);
let ip = create_test_ip(1);
for _ in 0..4 {
manager.check_connection(ip).await;
}
sleep(Duration::from_millis(100)).await;
assert!(true);
}
#[tokio::test]
async fn test_dos_protection_manager_multiple_ips() {
let manager = DosProtectionManager::new(3, 60, 1000, 50);
let ip1 = create_test_ip(1);
let ip2 = create_test_ip(2);
let ip3 = create_test_ip(3);
for _ in 0..3 {
assert!(manager.check_connection(ip1).await);
assert!(manager.check_connection(ip2).await);
assert!(manager.check_connection(ip3).await);
}
assert!(!manager.check_connection(ip1).await);
assert!(!manager.check_connection(ip2).await);
assert!(!manager.check_connection(ip3).await);
}
#[tokio::test]
async fn test_dos_protection_manager_ban_duration() {
let manager = DosProtectionManager::with_ban_settings(3, 60, 1000, 50, 2, 300);
let ban_duration = manager.ban_duration_seconds();
assert_eq!(ban_duration, 300);
}