use dist_agent_lang::ffi::security::{FFIInputValidator, FFIResourceLimits};
use dist_agent_lang::http_server_security::{
InputValidator, RateLimiter, RequestSizeLimiter, SecurityLogger,
};
use std::net::IpAddr;
#[tokio::test]
async fn test_rate_limiter_rejects_excessive_requests() {
let limiter = RateLimiter::new(5, 60); let ip: IpAddr = "127.0.0.1".parse().unwrap();
for _ in 0..5 {
assert!(limiter.check_rate_limit(ip).await.is_ok());
}
assert!(limiter.check_rate_limit(ip).await.is_err());
}
#[test]
fn test_request_size_limiter() {
use axum::http::HeaderMap;
let limiter = RequestSizeLimiter::default();
let mut headers = HeaderMap::new();
headers.insert("Content-Length", "1000".parse().unwrap());
assert!(limiter.validate_request(&headers, 1000, 100).is_ok());
assert!(limiter.validate_request(&headers, 2_000_000, 100).is_err());
assert!(limiter.validate_request(&headers, 1000, 3_000).is_err());
}
#[test]
fn test_input_validator_sql_injection() {
let sql_injections = vec![
"'; DROP TABLE users; --",
"\"; DELETE FROM users; --",
"admin' OR '1'='1",
"'; EXEC xp_cmdshell('dir'); --",
];
for injection in sql_injections {
assert!(InputValidator::validate_string(injection, 1000).is_err());
}
}
#[test]
fn test_input_validator_xss() {
let xss_patterns = vec![
"<script>alert('XSS')</script>",
"javascript:alert('XSS')",
"<img src=x onerror=alert('XSS')>",
"eval('malicious code')",
];
for pattern in xss_patterns {
assert!(InputValidator::validate_string(pattern, 1000).is_err());
}
}
#[test]
fn test_input_validator_address() {
let valid_address = "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0";
assert!(InputValidator::validate_address(valid_address).is_ok());
let invalid_addresses = vec![
"0x123", "742d35Cc6634C0532925a3b844Bc9e7595f0bEb", "0xGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", ];
for addr in invalid_addresses {
assert!(InputValidator::validate_address(addr).is_err());
}
}
#[test]
fn test_ffi_input_validator_size() {
let limits = FFIResourceLimits::default();
let valid_input = "x".repeat(1_000_000);
assert!(FFIInputValidator::validate_source(&valid_input, &limits).is_ok());
let oversized_input = "x".repeat(11_000_000);
assert!(FFIInputValidator::validate_source(&oversized_input, &limits).is_err());
}
#[test]
fn test_ffi_input_validator_null_bytes() {
let limits = FFIResourceLimits::default();
let input_with_null = "valid code\0malicious code";
assert!(FFIInputValidator::validate_source(input_with_null, &limits).is_err());
}
#[test]
fn test_ffi_input_validator_long_lines() {
let limits = FFIResourceLimits::default();
let long_line = "x".repeat(2_000_000);
assert!(FFIInputValidator::validate_source(&long_line, &limits).is_err());
}
#[test]
fn test_security_logger() {
SecurityLogger::log_event("TEST", "Test event", Some("127.0.0.1"));
SecurityLogger::log_rate_limit("127.0.0.1");
SecurityLogger::log_auth_failure("127.0.0.1", "Invalid token");
SecurityLogger::log_invalid_input("127.0.0.1", "SQL injection attempt");
}
#[test]
fn test_input_sanitization() {
let dangerous = "test<script>alert('xss')</script>test";
let sanitized = InputValidator::sanitize_string(dangerous);
assert!(!sanitized.contains("<script>"));
}
#[test]
fn test_ffi_input_sanitization() {
let with_null = "test\0null\0bytes";
let sanitized = FFIInputValidator::sanitize_string(with_null);
assert!(!sanitized.contains('\0'));
assert_eq!(sanitized, "testnullbytes");
}