use mqtt_protocol_core::mqtt;
mod common;
use std::convert::TryInto;
#[test]
fn test_mqttbinary_creation() {
common::init_tracing();
let data = b"test data";
let binary = mqtt::packet::MqttBinary::new(data).unwrap();
assert_eq!(binary.as_slice(), b"test data");
assert_eq!(binary.len(), 9);
assert_eq!(binary.size(), 11); }
#[test]
fn test_mqttbinary_empty() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"").unwrap();
assert_eq!(binary.as_slice(), b"");
assert_eq!(binary.len(), 0);
assert_eq!(binary.size(), 2); assert!(binary.is_empty());
}
#[test]
fn test_mqttbinary_as_bytes() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"hi").unwrap();
let bytes = binary.as_bytes();
assert_eq!(bytes, &[0x00, 0x02, b'h', b'i']);
let empty_binary = mqtt::packet::MqttBinary::new(b"").unwrap();
let empty_bytes = empty_binary.as_bytes();
assert_eq!(empty_bytes, &[0x00, 0x00]);
}
#[test]
fn test_mqttbinary_as_slice() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"hello").unwrap();
assert_eq!(binary.as_slice(), b"hello");
let empty_binary = mqtt::packet::MqttBinary::new(b"").unwrap();
assert_eq!(empty_binary.as_slice(), b"");
}
#[test]
fn test_mqttbinary_len_and_size() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"hello world").unwrap();
assert_eq!(binary.len(), 11); assert_eq!(binary.size(), 13); assert!(!binary.is_empty());
let empty = mqtt::packet::MqttBinary::new(b"").unwrap();
assert_eq!(empty.len(), 0);
assert_eq!(empty.size(), 2);
assert!(empty.is_empty());
}
#[test]
fn test_mqttbinary_decode() {
common::init_tracing();
let data = [0, 4, b't', b'e', b's', b't'];
let (binary, consumed) = mqtt::packet::MqttBinary::decode(&data).unwrap();
assert_eq!(binary.as_slice(), b"test");
assert_eq!(consumed, 6);
}
#[test]
fn test_mqttbinary_decode_empty() {
common::init_tracing();
let data = [0, 0];
let (binary, consumed) = mqtt::packet::MqttBinary::decode(&data).unwrap();
assert_eq!(binary.as_slice(), b"");
assert_eq!(consumed, 2);
assert!(binary.is_empty());
}
#[test]
fn test_mqttbinary_decode_large_data() {
common::init_tracing();
let mut data = vec![0x03, 0xE8]; data.extend(vec![0xAB; 1000]);
let (binary, consumed) = mqtt::packet::MqttBinary::decode(&data).unwrap();
assert_eq!(binary.len(), 1000);
assert_eq!(consumed, 1002);
assert_eq!(binary.as_slice(), vec![0xAB; 1000].as_slice());
}
#[test]
fn test_mqttbinary_new_size_limit() {
common::init_tracing();
let max_data = vec![0u8; 65535];
let binary = mqtt::packet::MqttBinary::new(&max_data);
assert!(binary.is_ok());
assert_eq!(binary.unwrap().len(), 65535);
let oversized_data = vec![0u8; 65536];
let result = mqtt::packet::MqttBinary::new(&oversized_data);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
mqtt::result_code::MqttError::MalformedPacket
);
}
#[test]
fn test_mqttbinary_decode_insufficient_length() {
common::init_tracing();
let partial_header = [0];
let result = mqtt::packet::MqttBinary::decode(&partial_header);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
mqtt::result_code::MqttError::MalformedPacket
);
let data = [0, 10, b't', b'e']; let result = mqtt::packet::MqttBinary::decode(&data);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
mqtt::result_code::MqttError::MalformedPacket
);
}
#[test]
fn test_mqttbinary_decode_empty_buffer() {
common::init_tracing();
let empty_buffer = [];
let result = mqtt::packet::MqttBinary::decode(&empty_buffer);
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
mqtt::result_code::MqttError::MalformedPacket
);
}
#[test]
fn test_mqttbinary_to_buffers() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"data").unwrap();
let all_bytes = binary.to_continuous_buffer();
assert_eq!(all_bytes, &[0x00, 0x04, b'd', b'a', b't', b'a']);
#[cfg(feature = "std")]
{
let buffers = binary.to_buffers();
assert_eq!(buffers.len(), 1);
let buffer_data: &[u8] = &buffers[0];
assert_eq!(buffer_data, &[0x00, 0x04, b'd', b'a', b't', b'a']);
assert_eq!(all_bytes, buffer_data);
}
}
#[test]
fn test_mqttbinary_to_buffers_empty() {
common::init_tracing();
let empty_binary = mqtt::packet::MqttBinary::new(b"").unwrap();
let all_bytes = empty_binary.to_continuous_buffer();
assert_eq!(all_bytes, &[0x00, 0x00]);
#[cfg(feature = "std")]
{
let buffers = empty_binary.to_buffers();
assert_eq!(buffers.len(), 1);
let buffer_data: &[u8] = &buffers[0];
assert_eq!(buffer_data, &[0x00, 0x00]);
assert_eq!(all_bytes, buffer_data);
}
}
#[test]
fn test_mqttbinary_as_ref() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"test_binary").unwrap();
let slice_ref: &[u8] = binary.as_ref();
assert_eq!(slice_ref, b"test_binary");
fn takes_slice_ref<T: AsRef<[u8]>>(value: T) -> usize {
value.as_ref().len()
}
assert_eq!(takes_slice_ref(binary), 11);
}
#[test]
fn test_mqttbinary_deref() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"deref_test").unwrap();
assert_eq!(binary.len(), 10);
assert_eq!(&binary[0..5], b"deref");
assert_eq!(binary.first(), Some(&b'd'));
assert_eq!(binary.last(), Some(&b't'));
}
#[test]
fn test_mqttbinary_serialize() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"serialize_test").unwrap();
let serialized = serde_json::to_string(&binary).unwrap();
assert!(serialized.contains("serialize_test") || !serialized.is_empty());
}
#[test]
fn test_mqttbinary_try_from_str() {
common::init_tracing();
let str_data = "convert_test";
let binary: Result<mqtt::packet::MqttBinary, _> = str_data.try_into();
assert!(binary.is_ok());
assert_eq!(binary.unwrap().as_slice(), b"convert_test");
let empty_str = "";
let empty_binary: Result<mqtt::packet::MqttBinary, _> = empty_str.try_into();
assert!(empty_binary.is_ok());
assert_eq!(empty_binary.unwrap().as_slice(), b"");
}
#[test]
fn test_mqttbinary_try_from_str_size_limit() {
common::init_tracing();
let large_str = "x".repeat(65536);
let result: Result<mqtt::packet::MqttBinary, _> = large_str.as_str().try_into();
assert!(result.is_err());
assert_eq!(
result.unwrap_err(),
mqtt::result_code::MqttError::MalformedPacket
);
}
#[test]
fn test_mqttbinary_default() {
common::init_tracing();
let default_binary = mqtt::packet::MqttBinary::default();
assert!(default_binary.is_empty());
assert_eq!(default_binary.len(), 0);
assert_eq!(default_binary.size(), 2);
assert_eq!(default_binary.as_slice(), b"");
assert_eq!(default_binary.as_bytes(), &[0x00, 0x00]);
}
#[test]
fn test_mqttbinary_partial_eq() {
common::init_tracing();
let binary1 = mqtt::packet::MqttBinary::new(b"hello").unwrap();
let binary2 = mqtt::packet::MqttBinary::new(b"hello").unwrap();
let binary3 = mqtt::packet::MqttBinary::new(b"world").unwrap();
assert_eq!(binary1, binary2);
assert_ne!(binary1, binary3);
assert_ne!(binary2, binary3);
}
#[test]
fn test_mqttbinary_partial_ord() {
common::init_tracing();
let binary_a = mqtt::packet::MqttBinary::new(b"a").unwrap();
let binary_b = mqtt::packet::MqttBinary::new(b"b").unwrap();
let binary_aa = mqtt::packet::MqttBinary::new(b"aa").unwrap();
assert!(binary_a < binary_b);
assert!(binary_a < binary_aa);
assert!(binary_b > binary_a);
assert!(binary_aa > binary_a);
let binary_same = mqtt::packet::MqttBinary::new(b"a").unwrap();
assert!(binary_a <= binary_same);
assert!(binary_a >= binary_same);
}
#[test]
fn test_mqttbinary_clone() {
common::init_tracing();
let original = mqtt::packet::MqttBinary::new(b"clone_test").unwrap();
let cloned = original.clone();
assert_eq!(original, cloned);
assert_eq!(original.as_slice(), cloned.as_slice());
assert_eq!(original.as_bytes(), cloned.as_bytes());
}
#[test]
fn test_mqttbinary_debug() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"debug").unwrap();
let debug_str = format!("{binary:?}");
assert!(!debug_str.is_empty());
assert!(debug_str.contains("MqttBinary"));
}
#[test]
fn test_mqttbinary_binary_data() {
common::init_tracing();
let binary_data = vec![0x00, 0x01, 0xFF, 0xFE, 0x80, 0x7F];
let binary = mqtt::packet::MqttBinary::new(&binary_data).unwrap();
assert_eq!(binary.as_slice(), binary_data.as_slice());
assert_eq!(binary.len(), 6);
let encoded = binary.as_bytes();
assert_eq!(&encoded[0..2], &[0x00, 0x06]); assert_eq!(&encoded[2..], binary_data.as_slice()); }
#[test]
fn test_mqttbinary_roundtrip() {
common::init_tracing();
let original_data = b"roundtrip_test_data";
let binary = mqtt::packet::MqttBinary::new(original_data).unwrap();
let encoded = binary.as_bytes();
let (decoded, consumed) = mqtt::packet::MqttBinary::decode(encoded).unwrap();
assert_eq!(consumed, encoded.len());
assert_eq!(decoded.as_slice(), original_data);
assert_eq!(decoded, binary);
}
#[test]
fn test_mqttbinary_various_sizes() {
common::init_tracing();
let sizes = [0, 1, 2, 255, 256, 1000, 32767, 65535];
for &size in &sizes {
let data = vec![0xAA; size];
let binary = mqtt::packet::MqttBinary::new(&data).unwrap();
assert_eq!(binary.len(), size);
assert_eq!(binary.size(), size + 2);
assert_eq!(binary.as_slice(), data.as_slice());
assert_eq!(binary.is_empty(), size == 0);
let encoded = binary.as_bytes();
let (decoded, consumed) = mqtt::packet::MqttBinary::decode(encoded).unwrap();
assert_eq!(consumed, size + 2);
assert_eq!(decoded, binary);
}
}
#[test]
fn test_mqttbinary_new_from_different_types() {
common::init_tracing();
let slice_binary = mqtt::packet::MqttBinary::new(b"slice").unwrap();
assert_eq!(slice_binary.as_slice(), b"slice");
let vec_data = vec![1, 2, 3, 4, 5];
let vec_binary = mqtt::packet::MqttBinary::new(vec_data).unwrap();
assert_eq!(vec_binary.as_slice(), &[1, 2, 3, 4, 5]);
let array_data = [10, 20, 30];
let array_binary = mqtt::packet::MqttBinary::new(array_data).unwrap();
assert_eq!(array_binary.as_slice(), &[10, 20, 30]);
}
#[test]
fn test_mqttbinary_buffers_equivalence() {
common::init_tracing();
let binary = mqtt::packet::MqttBinary::new(b"test_binary_data").unwrap();
let continuous_buffer = binary.to_continuous_buffer();
#[cfg(feature = "std")]
{
let io_slices = binary.to_buffers();
let mut concatenated = Vec::new();
for slice in io_slices {
concatenated.extend_from_slice(&slice);
}
assert_eq!(continuous_buffer, concatenated);
}
assert!(!continuous_buffer.is_empty());
}