#![allow(clippy::expect_used, clippy::unwrap_used)]
use bytes::{Bytes, BytesMut};
use network_protocol::config::PROTOCOL_VERSION;
use network_protocol::core::codec::PacketCodec;
use network_protocol::core::packet::Packet;
use tokio_util::codec::{Decoder, Encoder};
#[test]
fn test_codec_decode_zero_copy_split() {
let mut codec = PacketCodec;
let payload = vec![1, 2, 3, 4, 5];
let packet = Packet {
version: PROTOCOL_VERSION,
payload,
};
let bytes = packet.to_bytes();
let mut buffer = BytesMut::from(&bytes[..]);
let original_capacity = buffer.capacity();
let decoded = codec.decode(&mut buffer).expect("Failed to decode");
assert!(decoded.is_some());
let decoded_packet = decoded.unwrap();
assert_eq!(decoded_packet.payload, vec![1, 2, 3, 4, 5]);
assert_eq!(buffer.len(), 0);
assert!(buffer.capacity() <= original_capacity);
}
#[test]
fn test_codec_partial_decode_preserves_buffer() {
let mut codec = PacketCodec;
let mut buffer = BytesMut::from(&[0x4E, 0x50, 0x52, 0x4F, 0x01][..]);
let result = codec.decode(&mut buffer).expect("Decode should not error");
assert!(result.is_none());
assert_eq!(buffer.len(), 5); }
#[test]
fn test_codec_encode_reserves_space_efficiently() {
let mut codec = PacketCodec;
let payload = vec![0u8; 100];
let packet = Packet {
version: PROTOCOL_VERSION,
payload: payload.clone(),
};
let mut buffer = BytesMut::new();
codec.encode(packet, &mut buffer).expect("Failed to encode");
assert_eq!(buffer.len(), 9 + 100);
let bytes = buffer.freeze();
let decoded = Packet::from_bytes(&bytes).expect("Failed to decode");
assert_eq!(decoded.payload, payload);
}
#[test]
fn test_codec_multiple_packets_in_buffer() {
let mut codec = PacketCodec;
let packet1 = Packet {
version: PROTOCOL_VERSION,
payload: vec![1, 2, 3],
};
let packet2 = Packet {
version: PROTOCOL_VERSION,
payload: vec![4, 5, 6],
};
let bytes1 = packet1.to_bytes();
let bytes2 = packet2.to_bytes();
let mut buffer = BytesMut::new();
buffer.extend_from_slice(&bytes1);
buffer.extend_from_slice(&bytes2);
let decoded1 = codec
.decode(&mut buffer)
.expect("Failed to decode")
.expect("Should have packet");
assert_eq!(decoded1.payload, vec![1, 2, 3]);
let decoded2 = codec
.decode(&mut buffer)
.expect("Failed to decode")
.expect("Should have packet");
assert_eq!(decoded2.payload, vec![4, 5, 6]);
assert_eq!(buffer.len(), 0);
}
#[test]
fn test_bytes_freeze_is_zero_copy() {
let mut buffer = BytesMut::with_capacity(100);
buffer.extend_from_slice(&[1, 2, 3, 4, 5]);
let ptr_before = buffer.as_ptr();
let frozen: Bytes = buffer.freeze();
assert_eq!(ptr_before, frozen.as_ptr());
assert_eq!(frozen.len(), 5);
}
#[test]
fn test_codec_decode_with_exact_data() {
let mut codec = PacketCodec;
let payload = vec![10, 20, 30];
let packet = Packet {
version: PROTOCOL_VERSION,
payload,
};
let bytes = packet.to_bytes();
let mut buffer = BytesMut::from(&bytes[..]);
let decoded = codec
.decode(&mut buffer)
.expect("Failed to decode")
.expect("Should have packet");
assert_eq!(decoded.payload, vec![10, 20, 30]);
assert_eq!(buffer.len(), 0);
}
#[test]
fn test_codec_encode_large_payload() {
let mut codec = PacketCodec;
let payload = vec![0xAB; 1024 * 1024];
let packet = Packet {
version: PROTOCOL_VERSION,
payload: payload.clone(),
};
let mut buffer = BytesMut::new();
codec.encode(packet, &mut buffer).expect("Failed to encode");
assert_eq!(buffer.len(), 9 + 1024 * 1024);
let bytes = buffer.freeze();
let decoded = Packet::from_bytes(&bytes).expect("Failed to decode");
assert_eq!(decoded.payload.len(), 1024 * 1024);
assert_eq!(decoded.payload[0], 0xAB);
}
#[test]
fn test_codec_buffer_reuse() {
let mut codec = PacketCodec;
let mut buffer = BytesMut::with_capacity(1000);
for i in 0..10 {
let packet = Packet {
version: PROTOCOL_VERSION,
payload: vec![i as u8; 10],
};
codec.encode(packet, &mut buffer).expect("Failed to encode");
}
assert_eq!(buffer.len(), 10 * (9 + 10));
let mut count = 0;
while let Some(packet) = codec.decode(&mut buffer).expect("Failed to decode") {
assert_eq!(packet.payload.len(), 10);
assert_eq!(packet.payload[0], count as u8);
count += 1;
}
assert_eq!(count, 10);
}
#[test]
fn test_codec_incremental_buffer_fill() {
let mut codec = PacketCodec;
let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let packet = Packet {
version: PROTOCOL_VERSION,
payload,
};
let full_bytes = packet.to_bytes();
let mut buffer = BytesMut::new();
for (i, byte) in full_bytes.iter().enumerate() {
buffer.extend_from_slice(&[*byte]);
let result = codec.decode(&mut buffer).expect("Should not error");
if i < full_bytes.len() - 1 {
assert!(result.is_none());
assert!(!buffer.is_empty());
} else {
assert!(result.is_some());
let decoded = result.unwrap();
assert_eq!(decoded.payload, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
assert_eq!(buffer.len(), 0);
}
}
}
#[test]
fn test_codec_split_to_is_zero_copy() {
let mut buffer = BytesMut::with_capacity(100);
buffer.extend_from_slice(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
let original_ptr = buffer.as_ptr();
let split = buffer.split_to(5);
assert_eq!(split.as_ptr(), original_ptr);
assert_eq!(split.len(), 5);
assert_eq!(buffer.len(), 5);
assert_eq!(buffer[0], 6);
}
#[test]
fn test_codec_memory_efficiency() {
let mut codec = PacketCodec;
let large_payload = vec![0xFF; 10 * 1024]; let packet = Packet {
version: PROTOCOL_VERSION,
payload: large_payload.clone(),
};
let bytes = packet.to_bytes();
let mut buffer = BytesMut::from(&bytes[..]);
let initial_capacity = buffer.capacity();
let decoded = codec
.decode(&mut buffer)
.expect("Failed to decode")
.expect("Should have packet");
assert_eq!(decoded.payload, large_payload);
assert!(buffer.capacity() <= initial_capacity * 2);
}
#[test]
fn test_bytes_reference_counting() {
let data = vec![1, 2, 3, 4, 5];
let bytes1 = Bytes::from(data);
let bytes2 = bytes1.clone();
assert_eq!(bytes1.as_ptr(), bytes2.as_ptr());
assert_eq!(bytes1.len(), bytes2.len());
assert_eq!(bytes1, bytes2);
}