1use rust_raknet::{RaknetSocket, Reliability};
3use std::{error::Error, time::Duration};
4
5#[tokio::main]
6async fn main() -> Result<(), Box<dyn Error>> {
7 if std::env::var_os("RAKNET_DEBUG").is_some() {
8 rust_raknet::enable_raknet_log(7);
9 }
10 let address = std::env::args()
11 .nth(1)
12 .ok_or("missing peer address")?
13 .parse()?;
14 let batch = std::env::args().nth(2).as_deref() == Some("--batch");
15 tokio::time::timeout(Duration::from_secs(60), async {
16 let socket = RaknetSocket::connect_with_version(&address, 11).await?;
17 let mut count = 0;
18 for size in [64, 800, 4096, 10000] {
19 if batch && size <= 800 {
20 for first in (0..100).step_by(16) {
21 let messages: Vec<_> = (first..(first + 16).min(100))
22 .map(|index| {
23 let mut message: Vec<_> =
24 (0..size).map(|i| (i + index) as u8).collect();
25 message[0] = 0xfe;
26 rust_raknet::Bytes::from(message)
27 })
28 .collect();
29 socket
30 .send_bytes_batch(&messages, Reliability::ReliableOrdered)
31 .await?;
32 for expected in messages {
33 assert_eq!(
34 socket.recv().await?.as_slice(),
35 expected.as_ref(),
36 "message reordered, duplicated or corrupted"
37 );
38 count += 1;
39 }
40 }
41 } else {
42 for index in 0..100 {
43 let mut payload: Vec<_> = (0..size).map(|i| (i + index) as u8).collect();
44 payload[0] = 0xfe;
45 socket.send(&payload, Reliability::ReliableOrdered).await?;
46 assert_eq!(
47 socket.recv().await?,
48 payload,
49 "message reordered, duplicated or corrupted"
50 );
51 count += 1;
52 }
53 }
54 }
55 socket.close().await?;
56 println!("PASS: {count} unique ordered messages, 64/800/4096/10000 bytes");
57 Ok::<_, Box<dyn Error>>(())
58 })
59 .await?
60}