use super::redis::resp::{RespParser, RespValue};
const MAX_BUFFER_SIZE: usize = 64 * 1024;
#[test]
fn test_buffer_overflow_protection() {
let mut parser = RespParser::new();
let malicious = b"$999999999999999999999\r\n";
let result = parser.parse(malicious);
assert!(result.is_err(), "Should reject huge bulk string size");
}
#[test]
fn test_array_size_limit() {
let mut parser = RespParser::new();
let malicious = b"*999999999999999999999\r\n";
let result = parser.parse(malicious);
assert!(result.is_err(), "Should reject huge array size");
}
#[test]
fn test_negative_bulk_string_size() {
let mut parser = RespParser::new();
let malicious = b"$-999999999\r\n";
let result = parser.parse(malicious);
assert!(result.is_err(), "Should reject negative bulk string size");
}
#[test]
fn test_negative_array_size() {
let mut parser = RespParser::new();
let malicious = b"*-999999999\r\n";
let result = parser.parse(malicious);
assert!(result.is_err(), "Should reject negative array size");
}
#[test]
fn test_deeply_nested_arrays() {
let mut parser = RespParser::new();
let mut nested = String::new();
for _ in 0..200 {
nested.push_str("*1\r\n");
}
nested.push_str(":42\r\n");
let result = parser.parse(nested.as_bytes());
assert!(result.is_err(), "Should reject deeply nested arrays");
}
#[test]
fn test_partial_command_accumulation() {
let mut buffer = Vec::new();
let partial = b"$999999";
for _ in 0..10000 {
buffer.extend_from_slice(partial);
if buffer.len() > MAX_BUFFER_SIZE {
break;
}
}
assert!(buffer.len() > MAX_BUFFER_SIZE, "Buffer should exceed limit");
}
#[test]
fn test_integer_overflow_in_bulk_string() {
let mut parser = RespParser::new();
let malicious = format!("${}\r\n", i64::MAX).into_bytes();
let result = parser.parse(&malicious);
match result {
Ok(None) => {} Ok(Some(_)) => {} Err(_) => {} }
}
#[test]
fn test_integer_overflow_in_array() {
let mut parser = RespParser::new();
let malicious = format!("*{}\r\n", i64::MAX).into_bytes();
let result = parser.parse(&malicious);
assert!(
result.is_err(),
"Should reject array with i64::MAX elements"
);
}
#[test]
fn test_null_byte_in_bulk_string() {
let mut parser = RespParser::new();
let data = b"$5\r\nhel\x00lo\r\n";
let result = parser.parse(data).unwrap();
match result {
Some((RespValue::BulkString(Some(s)), _)) => {
assert_eq!(s.len(), 5);
assert_eq!(s.as_bytes()[3], 0);
}
_ => panic!("Expected bulk string with null byte"),
}
}
#[test]
fn test_invalid_utf8_in_bulk_string() {
let mut parser = RespParser::new();
let data = b"$4\r\n\xff\xfe\xfd\xfc\r\n";
let result = parser.parse(data);
assert!(result.is_err(), "Should reject invalid UTF-8");
}
#[test]
fn test_array_with_mixed_huge_elements() {
let mut parser = RespParser::new();
let data = b"*3\r\n:42\r\n$999999999999\r\ntest\r\n:100\r\n";
let result = parser.parse(data);
assert!(result.is_err(), "Should reject array with huge bulk string");
}
#[test]
fn test_recursive_array_memory_exhaustion() {
let mut parser = RespParser::new();
let data = "*10000000\r\n";
let result = parser.parse(data.as_bytes());
assert!(result.is_err(), "Should reject huge array");
}