#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TimestampMessage {
pub id: u16,
pub seq: u16,
pub originate_timestamp: u32,
pub receive_timestamp: u32,
pub transmit_timestamp: u32,
}
impl TimestampMessage {
#[deprecated(since = "0.14.0", note = "Use `TimestampMessage::LEN` instead")]
pub const SERIALIZED_SIZE: usize = 20;
pub const LEN: usize = 20;
pub fn from_bytes(bytes: [u8; 16]) -> TimestampMessage {
TimestampMessage {
id: u16::from_be_bytes([bytes[0], bytes[1]]),
seq: u16::from_be_bytes([bytes[2], bytes[3]]),
originate_timestamp: u32::from_be_bytes([bytes[4], bytes[5], bytes[6], bytes[7]]),
receive_timestamp: u32::from_be_bytes([bytes[8], bytes[9], bytes[10], bytes[11]]),
transmit_timestamp: u32::from_be_bytes([bytes[12], bytes[13], bytes[14], bytes[15]]),
}
}
}
#[cfg(test)]
mod test {
use crate::icmpv4::*;
use alloc::format;
use proptest::prelude::*;
#[test]
fn constants() {
assert_eq!(20, TimestampMessage::LEN);
}
proptest! {
#[test]
fn from_bytes(bytes in any::<[u8;16]>()) {
assert_eq!(
TimestampMessage::from_bytes(bytes),
TimestampMessage{
id: u16::from_be_bytes([bytes[0], bytes[1]]),
seq: u16::from_be_bytes([bytes[2], bytes[3]]),
originate_timestamp: u32::from_be_bytes([bytes[4], bytes[5], bytes[6], bytes[7]]),
receive_timestamp: u32::from_be_bytes([bytes[8], bytes[9], bytes[10], bytes[11]]),
transmit_timestamp: u32::from_be_bytes([bytes[12], bytes[13], bytes[14], bytes[15]]),
}
);
}
}
#[test]
fn clone_eq() {
let v = TimestampMessage {
id: 0,
seq: 0,
originate_timestamp: 0,
receive_timestamp: 0,
transmit_timestamp: 0,
};
assert_eq!(v.clone(), v);
}
#[test]
fn debug() {
let v = TimestampMessage {
id: 0,
seq: 0,
originate_timestamp: 0,
receive_timestamp: 0,
transmit_timestamp: 0,
};
assert_eq!(
format!("{:?}", v),
format!(
"TimestampMessage {{ id: {:?}, seq: {:?}, originate_timestamp: {:?}, receive_timestamp: {:?}, transmit_timestamp: {:?} }}",
v.id,
v.seq,
v.originate_timestamp,
v.receive_timestamp,
v.transmit_timestamp,
)
);
}
}