Skip to content

Commit c10521e

Browse files
apollo_network_benchmark: added the message that will be used by the benchmark
1 parent e332621 commit c10521e

File tree

5 files changed

+149
-1
lines changed

5 files changed

+149
-1
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/apollo_network_benchmark/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ testing = []
1010

1111
[dependencies]
1212
clap = { workspace = true, features = ["derive"] }
13+
lazy_static.workspace = true
1314
tokio = { workspace = true, features = ["full", "sync"] }
1415

1516

1617
[dev-dependencies]
17-
18+
rstest.workspace = true
1819

1920
[lints]
2021
workspace = true

crates/apollo_network_benchmark/src/bin/broadcast_network_stress_test_node/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
//! Runs a node that stress tests the p2p communication of the network.
22
33
use clap::Parser;
4+
5+
#[cfg(test)]
6+
mod message_test;
7+
48
mod args;
9+
mod message;
510

611
use args::Args;
712

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
use std::time::{Duration, SystemTime, UNIX_EPOCH};
2+
3+
use lazy_static::lazy_static;
4+
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+
}
20+
21+
#[derive(Debug, Clone)]
22+
pub struct StressTestMessage {
23+
pub metadata: StressTestMessageMetadata,
24+
pub payload: Vec<u8>,
25+
}
26+
27+
impl StressTestMessage {
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()
47+
}
48+
}
49+
50+
impl From<StressTestMessage> for Vec<u8> {
51+
fn from(value: StressTestMessage) -> Self {
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()
63+
}
64+
}
65+
66+
impl From<Vec<u8>> for StressTestMessage {
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+
}
87+
}
88+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
use rstest::rstest;
2+
3+
use crate::message::{StressTestMessage, METADATA_SIZE};
4+
5+
#[rstest]
6+
#[case::one_byte_len(10)]
7+
#[case::two_byte_len(300)]
8+
#[case::three_byte_len(20_000)]
9+
fn test_message_size(#[case] vec_len: usize) {
10+
let payload = vec![0xAA; vec_len];
11+
let message = StressTestMessage::new(1, 7070, payload.clone());
12+
let expected_size = *METADATA_SIZE + vec_len;
13+
assert_eq!(message.len(), expected_size);
14+
assert_eq!(message.slow_len(), expected_size);
15+
}
16+
17+
#[test]
18+
fn test_serialization_and_deserilization() {
19+
let original_message =
20+
StressTestMessage::new(u64::MAX - 1, u64::MAX - 2, vec![0xa1, 0xb2, 0xc3, 0xd4, 0xe5]);
21+
22+
// Serialize to bytes
23+
let serialized_bytes: Vec<u8> = original_message.clone().into();
24+
25+
// Deserialize back to message
26+
let deserialized_message: StressTestMessage = serialized_bytes.into();
27+
28+
// Verify all fields match
29+
assert_eq!(deserialized_message.metadata.sender_id, original_message.metadata.sender_id);
30+
assert_eq!(
31+
deserialized_message.metadata.message_index,
32+
original_message.metadata.message_index
33+
);
34+
assert_eq!(deserialized_message.payload, original_message.payload);
35+
assert_eq!(deserialized_message.metadata.time, original_message.metadata.time);
36+
}
37+
38+
#[test]
39+
fn test_empty_payload() {
40+
let original_message = StressTestMessage::new(1, 42, vec![]);
41+
42+
let serialized_bytes: Vec<u8> = original_message.clone().into();
43+
let deserialized_message: StressTestMessage = serialized_bytes.into();
44+
45+
assert_eq!(deserialized_message.metadata.sender_id, original_message.metadata.sender_id);
46+
assert_eq!(
47+
deserialized_message.metadata.message_index,
48+
original_message.metadata.message_index
49+
);
50+
assert_eq!(deserialized_message.payload, original_message.payload);
51+
assert_eq!(deserialized_message.metadata.time, original_message.metadata.time);
52+
}

0 commit comments

Comments
 (0)