#[cfg(feature = "websocket")]
mod websocket_fragmentation_tests {
use bytes::Bytes;
use ultimo::websocket::test_helpers::*;
#[test]
fn test_to_fragmented_frames_small_message() {
let message = Message::Text("Hello".to_string());
let frames = message.to_fragmented_frames(1024);
assert_eq!(frames.len(), 1);
assert!(frames[0].fin);
assert_eq!(frames[0].opcode, OpCode::Text);
}
#[test]
fn test_to_fragmented_frames_large_text() {
let large_text = "A".repeat(10_000);
let message = Message::Text(large_text.clone());
let frames = message.to_fragmented_frames(4096);
assert_eq!(frames.len(), 3);
assert!(!frames[0].fin);
assert_eq!(frames[0].opcode, OpCode::Text);
assert_eq!(frames[0].payload.len(), 4096);
assert!(!frames[1].fin);
assert_eq!(frames[1].opcode, OpCode::Continue);
assert_eq!(frames[1].payload.len(), 4096);
assert!(frames[2].fin);
assert_eq!(frames[2].opcode, OpCode::Continue);
assert_eq!(frames[2].payload.len(), 10_000 - 8192);
let mut reassembled = Vec::new();
for frame in frames {
reassembled.extend_from_slice(&frame.payload);
}
assert_eq!(String::from_utf8(reassembled).unwrap(), large_text);
}
#[test]
fn test_to_fragmented_frames_large_binary() {
let large_binary = vec![42u8; 15_000];
let message = Message::Binary(Bytes::from(large_binary.clone()));
let frames = message.to_fragmented_frames(5120);
assert_eq!(frames.len(), 3);
assert!(!frames[0].fin);
assert_eq!(frames[0].opcode, OpCode::Binary);
assert_eq!(frames[0].payload.len(), 5120);
assert!(!frames[1].fin);
assert_eq!(frames[1].opcode, OpCode::Continue);
assert_eq!(frames[1].payload.len(), 5120);
assert!(frames[2].fin);
assert_eq!(frames[2].opcode, OpCode::Continue);
assert_eq!(frames[2].payload.len(), 15_000 - 10_240);
let mut reassembled = Vec::new();
for frame in frames {
reassembled.extend_from_slice(&frame.payload);
}
assert_eq!(reassembled, large_binary);
}
#[test]
fn test_to_fragmented_frames_exact_chunk_size() {
let message = Message::Text("X".repeat(8192));
let frames = message.to_fragmented_frames(4096);
assert_eq!(frames.len(), 2);
assert!(!frames[0].fin);
assert_eq!(frames[0].payload.len(), 4096);
assert!(frames[1].fin);
assert_eq!(frames[1].payload.len(), 4096);
}
#[test]
fn test_to_fragmented_frames_control_frames_not_fragmented() {
let ping = Message::Ping(Bytes::from(vec![1u8; 10_000]));
let frames = ping.to_fragmented_frames(100);
assert_eq!(frames.len(), 1);
assert!(frames[0].fin);
let pong = Message::Pong(Bytes::from(vec![1u8; 10_000]));
let frames = pong.to_fragmented_frames(100);
assert_eq!(frames.len(), 1);
assert!(frames[0].fin);
}
#[test]
fn test_fragmented_frame_encoding() {
let message = Message::Text("Hello World!".to_string());
let frames = message.to_fragmented_frames(5);
for frame in frames {
let encoded = frame.encode();
let mut buf = bytes::BytesMut::from(encoded.as_ref());
let decoded = Frame::parse(&mut buf).unwrap().unwrap();
assert_eq!(decoded.fin, frame.fin);
assert_eq!(decoded.opcode, frame.opcode);
assert_eq!(decoded.payload, frame.payload);
}
}
#[test]
fn test_single_byte_chunks() {
let message = Message::Text("ABC".to_string());
let frames = message.to_fragmented_frames(1);
assert_eq!(frames.len(), 3);
assert!(!frames[0].fin);
assert_eq!(frames[0].opcode, OpCode::Text);
assert_eq!(frames[0].payload.len(), 1);
assert!(!frames[1].fin);
assert_eq!(frames[1].opcode, OpCode::Continue);
assert_eq!(frames[1].payload.len(), 1);
assert!(frames[2].fin);
assert_eq!(frames[2].opcode, OpCode::Continue);
assert_eq!(frames[2].payload.len(), 1);
}
#[test]
fn test_empty_message() {
let message = Message::Text(String::new());
let frames = message.to_fragmented_frames(1024);
assert_eq!(frames.len(), 1);
assert!(frames[0].fin);
assert_eq!(frames[0].payload.len(), 0);
}
#[test]
fn test_fragmentation_preserves_utf8() {
let message = Message::Text("Hello δΈη π".to_string());
let frames = message.to_fragmented_frames(5);
let mut reassembled = Vec::new();
for frame in frames {
reassembled.extend_from_slice(&frame.payload);
}
let result = String::from_utf8(reassembled).unwrap();
assert_eq!(result, "Hello δΈη π");
}
}