use bytes::BytesMut;
use kdb_codec::codec::{CompressionMode, KdbCodec, ValidationMode};
use tokio_util::codec::Decoder;
#[test]
fn test_reject_oversized_message_header() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, ]);
let result = codec.decode(&mut buffer);
assert!(result.is_err(), "should reject oversized message header");
}
#[test]
fn test_reject_message_size_2gb() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, ]);
let result = codec.decode(&mut buffer);
assert!(result.is_err(), "should reject oversized message header");
}
#[test]
fn test_reject_message_size_below_header_size() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ]);
let result = codec.decode(&mut buffer);
assert!(result.is_err(), "should reject message smaller than header");
}
#[test]
fn test_accept_reasonable_message_size() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
let message_size = 1024;
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, ]);
buffer.extend_from_slice(&(message_size as u32).to_le_bytes());
let result = codec.decode(&mut buffer);
assert!(result.is_ok());
assert!(result.unwrap().is_none());
}
#[test]
fn test_maximum_message_size_boundary() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
let max_size = 1024;
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, ]);
buffer.extend_from_slice(&(max_size as u32).to_le_bytes());
let result = codec.decode(&mut buffer);
assert!(result.is_ok(), "should accept at boundary");
}
#[test]
fn test_zero_message_size() {
let mut codec = KdbCodec::builder()
.is_local(false)
.compression_mode(CompressionMode::Never)
.validation_mode(ValidationMode::Strict)
.max_message_size(1024)
.build();
let mut buffer = BytesMut::new();
buffer.extend_from_slice(&[
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]);
let result = codec.decode(&mut buffer);
assert!(result.is_err(), "should reject zero-length message");
}