use kdb_codec::codec::decompress_sync;
#[test]
fn test_decompress_insufficient_data() {
let invalid_data = vec![0x01, 0x02];
let result = decompress_sync(invalid_data, 1, None);
assert!(result.is_err(), "Should return error for insufficient data");
let err_msg = result.unwrap_err().to_string();
assert!(err_msg.contains("need at least 4 bytes"));
}
#[test]
fn test_decompress_negative_size() {
let mut compressed = vec![
0xFF, 0xFF, 0xFF, 0xFF, ];
compressed.extend_from_slice(&[0x00; 10]);
let result = decompress_sync(compressed, 1, None);
assert!(result.is_err(), "Should return error for negative size");
let err_msg = result.unwrap_err().to_string();
assert!(err_msg.contains("less than minimum"));
}
#[test]
fn test_decompress_size_below_minimum() {
let compressed = vec![
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
];
let result = decompress_sync(compressed, 1, None);
assert!(
result.is_err(),
"Should return error for size below minimum"
);
let err_msg = result.unwrap_err().to_string();
assert!(err_msg.contains("less than minimum"));
}
#[test]
fn test_decompression_bomb_large_size() {
let compressed = vec![
0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
];
let max_size = Some(512 * 1024 * 1024);
let result = decompress_sync(compressed, 1, max_size);
assert!(
result.is_err(),
"Should reject decompression bomb exceeding max size"
);
let err_msg = result.unwrap_err().to_string();
assert!(
err_msg.contains("exceeds maximum allowed size")
|| err_msg.contains("compression bomb"),
"Error should mention size limit or compression bomb, got: {}",
err_msg
);
}
#[test]
fn test_decompression_bomb_compression_ratio() {
let mut compressed = vec![
0x00, 0x00, 0x02, 0x00, ];
compressed.extend_from_slice(&[0x00; 10]);
println!("Testing suspicious compression ratio...");
let result = decompress_sync(compressed, 1, None);
println!("Suspicious ratio result: {:?}", result.is_ok());
}
#[test]
fn test_decompress_out_of_bounds_read() {
let compressed = vec![
0x20, 0x00, 0x00, 0x00, 0xFF, 0x10, ];
println!("Testing out-of-bounds read...");
let result = decompress_sync(compressed, 1, None);
assert!(result.is_err(), "Should detect out-of-bounds read");
let err_msg = result.unwrap_err().to_string();
assert!(err_msg.contains("Invalid compressed data"));
}
#[test]
fn test_decompress_invalid_back_reference() {
let mut compressed = vec![
0x30, 0x00, 0x00, 0x00, ];
for _ in 0..10 {
compressed.push(0x00); compressed.push(0x41); }
compressed.push(0xFF); compressed.push(0xFF); compressed.push(0x05);
println!("Testing invalid back-reference...");
let result = decompress_sync(compressed, 1, None);
println!("Invalid back-reference result: {:?}", result.is_ok());
}
#[test]
fn test_decompress_valid_small_data() {
let compressed = vec![
0x10, 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, ];
let result = decompress_sync(compressed, 1, None);
assert!(result.is_ok(), "Valid small data should decompress");
if let Ok(decompressed) = result {
println!("Decompressed {} bytes", decompressed.len());
assert_eq!(decompressed.len(), 8);
}
}
#[test]
fn test_decompress_size_overflow() {
let compressed = vec![
0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
];
println!("Testing size overflow...");
let result = decompress_sync(compressed, 1, None);
println!("Size overflow result: {:?}", result.is_ok());
}
#[test]
fn test_decompress_empty_compressed_data() {
let compressed = vec![
0x08, 0x00, 0x00, 0x00, ];
let result = decompress_sync(compressed, 1, None);
if let Ok(decompressed) = result {
assert_eq!(decompressed.len(), 0, "Should return empty data");
}
}
#[test]
fn test_decompress_big_endian() {
let compressed = vec![
0x00, 0x00, 0x00, 0x10, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, ];
let result = decompress_sync(compressed, 0, None);
assert!(result.is_ok(), "Big endian decompression should work");
if let Ok(decompressed) = result {
assert_eq!(decompressed.len(), 8);
}
}