Skip to main content

interop/
interop.rs

1//! Independent-peer validation driver; run only inside an isolated network.
2use 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}