|
1 | | -use std::mem::size_of; |
2 | | -use std::str::FromStr; |
3 | | -use std::time::{Duration, SystemTime}; |
| 1 | +use std::time::{Duration, SystemTime, UNIX_EPOCH}; |
4 | 2 |
|
5 | | -use libp2p::PeerId; |
| 3 | +use lazy_static::lazy_static; |
6 | 4 |
|
7 | | -pub const METADATA_SIZE: usize = size_of::<u32>() + size_of::<u64>() + size_of::<u32>() + 38; |
| 5 | +lazy_static! { |
| 6 | + // Calculate actual metadata size based on serialized empty message |
| 7 | + pub static ref METADATA_SIZE: usize = { |
| 8 | + let empty_message = StressTestMessage::new(0, 0, vec![]); |
| 9 | + let serialized: Vec<u8> = empty_message.into(); |
| 10 | + serialized.len() |
| 11 | + }; |
| 12 | +} |
| 13 | + |
| 14 | +#[derive(Debug, Clone, Copy)] |
| 15 | +pub struct StressTestMessageMetadata { |
| 16 | + pub sender_id: u64, |
| 17 | + pub message_index: u64, |
| 18 | + pub time: SystemTime, |
| 19 | +} |
8 | 20 |
|
9 | 21 | #[derive(Debug, Clone)] |
10 | 22 | pub struct StressTestMessage { |
11 | | - pub id: u32, |
| 23 | + pub metadata: StressTestMessageMetadata, |
12 | 24 | pub payload: Vec<u8>, |
13 | | - pub time: SystemTime, |
14 | | - pub peer_id: String, |
15 | 25 | } |
16 | 26 |
|
17 | 27 | impl StressTestMessage { |
18 | | - pub fn new(id: u32, payload: Vec<u8>, peer_id: String) -> Self { |
19 | | - StressTestMessage { id, payload, time: SystemTime::now(), peer_id } |
| 28 | + pub fn new(sender_id: u64, message_index: u64, payload: Vec<u8>) -> Self { |
| 29 | + StressTestMessage { |
| 30 | + metadata: StressTestMessageMetadata { |
| 31 | + sender_id, |
| 32 | + message_index, |
| 33 | + time: SystemTime::now(), |
| 34 | + }, |
| 35 | + payload, |
| 36 | + } |
| 37 | + } |
| 38 | + |
| 39 | + #[cfg(test)] |
| 40 | + pub fn slow_len(self) -> usize { |
| 41 | + let seq = Vec::<u8>::from(self); |
| 42 | + seq.len() |
| 43 | + } |
| 44 | + |
| 45 | + pub fn len(&self) -> usize { |
| 46 | + *METADATA_SIZE + self.payload.len() |
20 | 47 | } |
21 | 48 | } |
22 | 49 |
|
23 | 50 | impl From<StressTestMessage> for Vec<u8> { |
24 | 51 | fn from(value: StressTestMessage) -> Self { |
25 | | - let StressTestMessage { id, mut payload, time, peer_id } = value; |
26 | | - let id = id.to_be_bytes().to_vec(); |
27 | | - let time = time.duration_since(SystemTime::UNIX_EPOCH).unwrap(); |
28 | | - let seconds = time.as_secs().to_be_bytes().to_vec(); |
29 | | - let nanos = time.subsec_nanos().to_be_bytes().to_vec(); |
30 | | - let peer_id = PeerId::from_str(&peer_id).unwrap().to_bytes(); |
31 | | - payload.extend(id); |
32 | | - payload.extend(seconds); |
33 | | - payload.extend(nanos); |
34 | | - payload.extend(peer_id); |
35 | | - payload |
| 52 | + let payload_len: u64 = value.payload.len().try_into().unwrap(); |
| 53 | + let duration = value.metadata.time.duration_since(UNIX_EPOCH).unwrap(); |
| 54 | + [ |
| 55 | + &value.metadata.sender_id.to_be_bytes()[..], |
| 56 | + &value.metadata.message_index.to_be_bytes()[..], |
| 57 | + &duration.as_secs().to_be_bytes()[..], |
| 58 | + &duration.subsec_nanos().to_be_bytes()[..], |
| 59 | + &payload_len.to_be_bytes()[..], |
| 60 | + &value.payload[..], |
| 61 | + ] |
| 62 | + .concat() |
36 | 63 | } |
37 | 64 | } |
38 | 65 |
|
39 | 66 | impl From<Vec<u8>> for StressTestMessage { |
40 | | - // This auto implements TryFrom<Vec<u8>> for StressTestMessage |
41 | | - fn from(mut value: Vec<u8>) -> Self { |
42 | | - let vec_size = value.len(); |
43 | | - let payload_size = vec_size - METADATA_SIZE; |
44 | | - let id_and_time = value.split_off(payload_size); |
45 | | - let id = u32::from_be_bytes(id_and_time[0..4].try_into().unwrap()); |
46 | | - let seconds = u64::from_be_bytes(id_and_time[4..12].try_into().unwrap()); |
47 | | - let nanos = u32::from_be_bytes(id_and_time[12..16].try_into().unwrap()); |
48 | | - let time = SystemTime::UNIX_EPOCH + Duration::new(seconds, nanos); |
49 | | - let peer_id = PeerId::from_bytes(&id_and_time[16..]).unwrap().to_string(); |
50 | | - StressTestMessage { id, payload: value, time, peer_id } |
| 67 | + fn from(bytes: Vec<u8>) -> Self { |
| 68 | + let mut i = 0; |
| 69 | + let mut get = |n: usize| { |
| 70 | + let r = &bytes[i..i + n]; |
| 71 | + i += n; |
| 72 | + r |
| 73 | + }; |
| 74 | + |
| 75 | + let sender_id = u64::from_be_bytes(get(8).try_into().unwrap()); |
| 76 | + let message_index = u64::from_be_bytes(get(8).try_into().unwrap()); |
| 77 | + let secs = u64::from_be_bytes(get(8).try_into().unwrap()); |
| 78 | + let nanos = u32::from_be_bytes(get(4).try_into().unwrap()); |
| 79 | + let time = UNIX_EPOCH + Duration::new(secs, nanos); |
| 80 | + let payload_len = u64::from_be_bytes(get(8).try_into().unwrap()).try_into().unwrap(); |
| 81 | + let payload = get(payload_len).to_vec(); |
| 82 | + |
| 83 | + StressTestMessage { |
| 84 | + metadata: StressTestMessageMetadata { sender_id, message_index, time }, |
| 85 | + payload, |
| 86 | + } |
51 | 87 | } |
52 | 88 | } |
0 commit comments