use super::*;
use netlink_packet_core::NetlinkHeader;
#[test]
fn test_connector_message_new() {
let data = vec![1, 2, 3, 4, 5];
let message = ConnectorMessage::new(100, 200, 300, 400, 0x1234, data.clone());
assert_eq!(message.idx(), 100);
assert_eq!(message.value(), 200);
assert_eq!(message.seq(), 300);
assert_eq!(message.ack(), 400);
assert_eq!(message.flags(), 0x1234);
assert_eq!(message.data(), &data);
}
#[test]
fn test_connector_message_getters() {
let data = vec![0xFF, 0xAA, 0x55];
let message = ConnectorMessage::new(0x12345678, 0x87654321, 999, 888, 0xABCD, data.clone());
assert_eq!(message.idx(), 0x12345678);
assert_eq!(message.value(), 0x87654321);
assert_eq!(message.seq(), 999);
assert_eq!(message.ack(), 888);
assert_eq!(message.flags(), 0xABCD);
assert_eq!(message.data(), &data);
}
#[test]
fn test_connector_message_empty_data() {
let message = ConnectorMessage::new(1, 2, 3, 4, 5, Vec::new());
assert_eq!(message.data(), &[] as &[u8]);
assert_eq!(message.data().len(), 0);
}
#[test]
fn test_serialize_basic() {
let data = vec![0x01, 0x02, 0x03, 0x04];
let message =
ConnectorMessage::new(0x11223344, 0x55667788, 0x99AABBCC, 0xDDEEFF00, 0x1122, data);
let buffer_len = message.buffer_len();
assert_eq!(buffer_len, 24);
let mut buffer = vec![0u8; buffer_len];
message.serialize(&mut buffer);
assert_eq!(NativeEndian::read_u32(&buffer[0..4]), 0x11223344); assert_eq!(NativeEndian::read_u32(&buffer[4..8]), 0x55667788); assert_eq!(NativeEndian::read_u32(&buffer[8..12]), 0x99AABBCC); assert_eq!(NativeEndian::read_u32(&buffer[12..16]), 0xDDEEFF00); assert_eq!(NativeEndian::read_u16(&buffer[16..18]), 4); assert_eq!(NativeEndian::read_u16(&buffer[18..20]), 0x1122); assert_eq!(&buffer[20..24], &[0x01, 0x02, 0x03, 0x04]); }
#[test]
fn test_serialize_empty_data() {
let message = ConnectorMessage::new(1, 2, 3, 4, 5, Vec::new());
let buffer_len = message.buffer_len();
assert_eq!(buffer_len, 20);
let mut buffer = vec![0u8; buffer_len];
message.serialize(&mut buffer);
assert_eq!(NativeEndian::read_u16(&buffer[16..18]), 0); }
#[test]
fn test_deserialize_basic() {
let mut payload = vec![0u8; 24];
NativeEndian::write_u32(&mut payload[0..4], 0x11223344); NativeEndian::write_u32(&mut payload[4..8], 0x55667788); NativeEndian::write_u32(&mut payload[8..12], 0x99AABBCC); NativeEndian::write_u32(&mut payload[12..16], 0xDDEEFF00); NativeEndian::write_u16(&mut payload[16..18], 4); NativeEndian::write_u16(&mut payload[18..20], 0x1122); payload[20..24].copy_from_slice(&[0x01, 0x02, 0x03, 0x04]);
let header = NetlinkHeader::default();
let message = ConnectorMessage::deserialize(&header, &payload).unwrap();
assert_eq!(message.idx(), 0x11223344);
assert_eq!(message.value(), 0x55667788);
assert_eq!(message.seq(), 0x99AABBCC);
assert_eq!(message.ack(), 0xDDEEFF00);
assert_eq!(message.flags(), 0x1122);
assert_eq!(message.data(), &[0x01, 0x02, 0x03, 0x04]);
}
#[test]
fn test_deserialize_empty_data() {
let mut payload = vec![0u8; 20];
NativeEndian::write_u32(&mut payload[0..4], 1); NativeEndian::write_u32(&mut payload[4..8], 2); NativeEndian::write_u32(&mut payload[8..12], 3); NativeEndian::write_u32(&mut payload[12..16], 4); NativeEndian::write_u16(&mut payload[16..18], 0); NativeEndian::write_u16(&mut payload[18..20], 5);
let header = NetlinkHeader::default();
let message = ConnectorMessage::deserialize(&header, &payload).unwrap();
assert_eq!(message.data(), &[] as &[u8]);
}
#[test]
fn test_deserialize_with_padding() {
let mut payload = vec![0u8; 24];
NativeEndian::write_u32(&mut payload[0..4], 1);
NativeEndian::write_u32(&mut payload[4..8], 2);
NativeEndian::write_u32(&mut payload[8..12], 3);
NativeEndian::write_u32(&mut payload[12..16], 4);
NativeEndian::write_u16(&mut payload[16..18], 1); NativeEndian::write_u16(&mut payload[18..20], 5);
payload[20] = 0xFF;
let header = NetlinkHeader::default();
let message = ConnectorMessage::deserialize(&header, &payload).unwrap();
assert_eq!(message.data(), &[0xFF]);
}
#[test]
fn test_deserialize_invalid_data_length_negative() {
let mut payload = vec![0u8; 22];
NativeEndian::write_u32(&mut payload[0..4], 1);
NativeEndian::write_u32(&mut payload[4..8], 2);
NativeEndian::write_u32(&mut payload[8..12], 3);
NativeEndian::write_u32(&mut payload[12..16], 4);
NativeEndian::write_u16(&mut payload[16..18], 5); NativeEndian::write_u16(&mut payload[18..20], 6);
let header = NetlinkHeader::default();
let result = ConnectorMessage::deserialize(&header, &payload);
assert!(result.is_err());
assert_eq!(result.unwrap_err(), DeserializeError("Invalid data length"));
}
#[test]
fn test_deserialize_invalid_data_length_too_much_padding() {
let mut payload = vec![0u8; 26];
NativeEndian::write_u32(&mut payload[0..4], 1);
NativeEndian::write_u32(&mut payload[4..8], 2);
NativeEndian::write_u32(&mut payload[8..12], 3);
NativeEndian::write_u32(&mut payload[12..16], 4);
NativeEndian::write_u16(&mut payload[16..18], 1); NativeEndian::write_u16(&mut payload[18..20], 5);
let header = NetlinkHeader::default();
let result = ConnectorMessage::deserialize(&header, &payload);
assert!(result.is_err());
assert_eq!(result.unwrap_err(), DeserializeError("Invalid data length"));
}
#[test]
fn test_serialize_deserialize_roundtrip() {
let original_data = vec![0xAA, 0xBB, 0xCC, 0xDD, 0xEE];
let original_message = ConnectorMessage::new(
0x12345678,
0x87654321,
0xABCDEF00,
0x11223344,
0x5566,
original_data,
);
let buffer_len = original_message.buffer_len();
let mut buffer = vec![0u8; buffer_len];
original_message.serialize(&mut buffer);
let header = NetlinkHeader::default();
let deserialized_message = ConnectorMessage::deserialize(&header, &buffer).unwrap();
assert_eq!(original_message, deserialized_message);
}
#[test]
fn test_message_type() {
let message = ConnectorMessage::new(1, 2, 3, 4, 5, vec![]);
assert_eq!(message.message_type(), 0);
}
#[test]
fn test_buffer_len() {
let message1 = ConnectorMessage::new(1, 2, 3, 4, 5, vec![]);
assert_eq!(message1.buffer_len(), 20);
let message2 = ConnectorMessage::new(1, 2, 3, 4, 5, vec![1, 2, 3]);
assert_eq!(message2.buffer_len(), 23);
let message3 = ConnectorMessage::new(1, 2, 3, 4, 5, vec![1; 100]);
assert_eq!(message3.buffer_len(), 120);
}
#[test]
fn test_connector_id_equality() {
let id1 = ConnectorId {
idx: 100,
value: 200,
};
let id2 = ConnectorId {
idx: 100,
value: 200,
};
let id3 = ConnectorId {
idx: 100,
value: 201,
};
assert_eq!(id1, id2);
assert_ne!(id1, id3);
}
#[test]
fn test_connector_message_equality() {
let data = vec![1, 2, 3];
let msg1 = ConnectorMessage::new(1, 2, 3, 4, 5, data.clone());
let msg2 = ConnectorMessage::new(1, 2, 3, 4, 5, data.clone());
let msg3 = ConnectorMessage::new(1, 2, 3, 4, 6, data.clone());
assert_eq!(msg1, msg2);
assert_ne!(msg1, msg3);
}
#[test]
fn test_deserialize_error_display() {
let error = DeserializeError("Test error message");
assert_eq!(format!("{}", error), "Test error message");
}
#[test]
fn test_deserialize_error_description() {
let error = DeserializeError("Test error");
assert_eq!(error.to_string(), "Test error");
assert!(error.source().is_none());
}
#[test]
fn test_deserialize_error_equality() {
let error1 = DeserializeError("Same message");
let error2 = DeserializeError("Same message");
let error3 = DeserializeError("Different message");
assert_eq!(error1, error2);
assert_ne!(error1, error3);
}
#[test]
fn test_from_connector_message_to_netlink_payload() {
let message = ConnectorMessage::new(1, 2, 3, 4, 5, vec![6, 7, 8]);
let payload: NetlinkPayload<ConnectorMessage> = message.clone().into();
match payload {
NetlinkPayload::InnerMessage(inner_msg) => {
assert_eq!(inner_msg, message);
}
_ => panic!("Expected InnerMessage variant"),
}
}
#[test]
fn test_connector_message_debug_format() {
let message = ConnectorMessage::new(1, 2, 3, 4, 5, vec![6, 7]);
let debug_str = format!("{:?}", message);
assert!(debug_str.contains("ConnectorMessage"));
assert!(debug_str.contains("ConnectorId"));
}
#[test]
fn test_connector_message_clone() {
let original = ConnectorMessage::new(1, 2, 3, 4, 5, vec![6, 7, 8]);
let cloned = original.clone();
assert_eq!(original, cloned);
assert_eq!(original.data(), cloned.data());
assert_ne!(original.data().as_ptr(), cloned.data().as_ptr());
}
#[test]
fn test_large_data_serialization() {
let large_data = vec![0x42; 1000];
let message = ConnectorMessage::new(1, 2, 3, 4, 5, large_data.clone());
let buffer_len = message.buffer_len();
assert_eq!(buffer_len, 1020);
let mut buffer = vec![0u8; buffer_len];
message.serialize(&mut buffer);
assert_eq!(NativeEndian::read_u16(&buffer[16..18]), 1000);
assert_eq!(&buffer[20..], &large_data);
}
#[test]
fn test_edge_case_max_u32_values() {
let message = ConnectorMessage::new(
u32::MAX,
u32::MAX,
u32::MAX,
u32::MAX,
u16::MAX,
vec![0xFF; 65535],
);
assert_eq!(message.idx(), u32::MAX);
assert_eq!(message.value(), u32::MAX);
assert_eq!(message.seq(), u32::MAX);
assert_eq!(message.ack(), u32::MAX);
assert_eq!(message.flags(), u16::MAX);
assert_eq!(message.data().len(), 65535);
}