aboutsummaryrefslogtreecommitdiff
path: root/tests/perf-client/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-09-28 03:46:33 +0200
committerDario Nieuwenhuis <[email protected]>2023-09-28 03:47:14 +0200
commitd9eae79f3eea8bf968f61e476b599e9f8dc97aa8 (patch)
treee85f0fffe523aa863e9269812982ce2fd1ca8b97 /tests/perf-client/src
parent3d1b4116eccec80ecdaacb1fab9f2a6dbe5800f4 (diff)
test: deduplicate net perf test code.
Diffstat (limited to 'tests/perf-client/src')
-rw-r--r--tests/perf-client/src/lib.rs179
1 files changed, 179 insertions, 0 deletions
diff --git a/tests/perf-client/src/lib.rs b/tests/perf-client/src/lib.rs
new file mode 100644
index 000000000..a36147dbb
--- /dev/null
+++ b/tests/perf-client/src/lib.rs
@@ -0,0 +1,179 @@
1#![no_std]
2
3use defmt::{assert, *};
4use embassy_futures::join::join;
5use embassy_net::driver::Driver;
6use embassy_net::tcp::TcpSocket;
7use embassy_net::{Ipv4Address, Stack};
8use embassy_time::{with_timeout, Duration, Timer};
9
10pub struct Expected {
11 pub down_kbps: usize,
12 pub up_kbps: usize,
13 pub updown_kbps: usize,
14}
15
16pub async fn run<D: Driver>(stack: &Stack<D>, expected: Expected) {
17 info!("Waiting for DHCP up...");
18 while stack.config_v4().is_none() {
19 Timer::after(Duration::from_millis(100)).await;
20 }
21 info!("IP addressing up!");
22
23 let down = test_download(stack).await;
24 let up = test_upload(stack).await;
25 let updown = test_upload_download(stack).await;
26
27 assert!(down > expected.down_kbps);
28 assert!(up > expected.up_kbps);
29 assert!(updown > expected.updown_kbps);
30}
31
32const TEST_DURATION: usize = 10;
33const RX_BUFFER_SIZE: usize = 4096;
34const TX_BUFFER_SIZE: usize = 4096;
35const SERVER_ADDRESS: Ipv4Address = Ipv4Address::new(192, 168, 2, 2);
36const DOWNLOAD_PORT: u16 = 4321;
37const UPLOAD_PORT: u16 = 4322;
38const UPLOAD_DOWNLOAD_PORT: u16 = 4323;
39
40async fn test_download<D: Driver>(stack: &Stack<D>) -> usize {
41 info!("Testing download...");
42
43 let mut rx_buffer = [0; RX_BUFFER_SIZE];
44 let mut tx_buffer = [0; TX_BUFFER_SIZE];
45 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
46 socket.set_timeout(Some(Duration::from_secs(10)));
47
48 info!("connecting to {:?}:{}...", SERVER_ADDRESS, DOWNLOAD_PORT);
49 if let Err(e) = socket.connect((SERVER_ADDRESS, DOWNLOAD_PORT)).await {
50 error!("connect error: {:?}", e);
51 return 0;
52 }
53 info!("connected, testing...");
54
55 let mut rx_buf = [0; 4096];
56 let mut total: usize = 0;
57 with_timeout(Duration::from_secs(TEST_DURATION as _), async {
58 loop {
59 match socket.read(&mut rx_buf).await {
60 Ok(0) => {
61 error!("read EOF");
62 return 0;
63 }
64 Ok(n) => total += n,
65 Err(e) => {
66 error!("read error: {:?}", e);
67 return 0;
68 }
69 }
70 }
71 })
72 .await
73 .ok();
74
75 let kbps = (total + 512) / 1024 / TEST_DURATION;
76 info!("download: {} kB/s", kbps);
77 kbps
78}
79
80async fn test_upload<D: Driver>(stack: &Stack<D>) -> usize {
81 info!("Testing upload...");
82
83 let mut rx_buffer = [0; RX_BUFFER_SIZE];
84 let mut tx_buffer = [0; TX_BUFFER_SIZE];
85 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
86 socket.set_timeout(Some(Duration::from_secs(10)));
87
88 info!("connecting to {:?}:{}...", SERVER_ADDRESS, UPLOAD_PORT);
89 if let Err(e) = socket.connect((SERVER_ADDRESS, UPLOAD_PORT)).await {
90 error!("connect error: {:?}", e);
91 return 0;
92 }
93 info!("connected, testing...");
94
95 let buf = [0; 4096];
96 let mut total: usize = 0;
97 with_timeout(Duration::from_secs(TEST_DURATION as _), async {
98 loop {
99 match socket.write(&buf).await {
100 Ok(0) => {
101 error!("write zero?!??!?!");
102 return 0;
103 }
104 Ok(n) => total += n,
105 Err(e) => {
106 error!("write error: {:?}", e);
107 return 0;
108 }
109 }
110 }
111 })
112 .await
113 .ok();
114
115 let kbps = (total + 512) / 1024 / TEST_DURATION;
116 info!("upload: {} kB/s", kbps);
117 kbps
118}
119
120async fn test_upload_download<D: Driver>(stack: &Stack<D>) -> usize {
121 info!("Testing upload+download...");
122
123 let mut rx_buffer = [0; RX_BUFFER_SIZE];
124 let mut tx_buffer = [0; TX_BUFFER_SIZE];
125 let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
126 socket.set_timeout(Some(Duration::from_secs(10)));
127
128 info!("connecting to {:?}:{}...", SERVER_ADDRESS, UPLOAD_DOWNLOAD_PORT);
129 if let Err(e) = socket.connect((SERVER_ADDRESS, UPLOAD_DOWNLOAD_PORT)).await {
130 error!("connect error: {:?}", e);
131 return 0;
132 }
133 info!("connected, testing...");
134
135 let (mut reader, mut writer) = socket.split();
136
137 let tx_buf = [0; 4096];
138 let mut rx_buf = [0; 4096];
139 let mut total: usize = 0;
140 let tx_fut = async {
141 loop {
142 match writer.write(&tx_buf).await {
143 Ok(0) => {
144 error!("write zero?!??!?!");
145 return 0;
146 }
147 Ok(_) => {}
148 Err(e) => {
149 error!("write error: {:?}", e);
150 return 0;
151 }
152 }
153 }
154 };
155
156 let rx_fut = async {
157 loop {
158 match reader.read(&mut rx_buf).await {
159 Ok(0) => {
160 error!("read EOF");
161 return 0;
162 }
163 Ok(n) => total += n,
164 Err(e) => {
165 error!("read error: {:?}", e);
166 return 0;
167 }
168 }
169 }
170 };
171
172 with_timeout(Duration::from_secs(TEST_DURATION as _), join(tx_fut, rx_fut))
173 .await
174 .ok();
175
176 let kbps = (total + 512) / 1024 / TEST_DURATION;
177 info!("upload+download: {} kB/s", kbps);
178 kbps
179}