xwt_tests/tests/
datagrams.rs

1use xwt_core::prelude::*;
2
3const MIN_DATAGRAM_SIZE: usize = 1024;
4
5#[derive(Debug, thiserror::Error)]
6pub enum Error<Endpoint>
7where
8    Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
9    Endpoint::Connecting: std::fmt::Debug,
10    ConnectSessionFor<Endpoint>:
11        xwt_core::session::datagram::Send + xwt_core::session::datagram::Receive + std::fmt::Debug,
12    ReceiveDatagramFor<ConnectSessionFor<Endpoint>>: std::fmt::Debug,
13{
14    #[error("connect: {0}")]
15    Connect(#[source] xwt_error::Connect<Endpoint>),
16    #[error("datagrams not supported")]
17    DatagramsNotSupported,
18    #[error("max datagram size is smaller than minimum - {size} / {MIN_DATAGRAM_SIZE}")]
19    MaxDatagramSizeTooSmall { size: usize },
20    #[error("send: {0}")]
21    Send(#[source] SendErrorFor<ConnectSessionFor<Endpoint>>),
22    #[error("recv: {0}")]
23    Recv(#[source] ReceiveErrorFor<ConnectSessionFor<Endpoint>>),
24    #[error("bad data")]
25    BadData(ReceiveDatagramFor<ConnectSessionFor<Endpoint>>),
26}
27
28pub async fn run<Endpoint>(endpoint: Endpoint, url: &str) -> Result<(), Error<Endpoint>>
29where
30    Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
31    Endpoint::Connecting: std::fmt::Debug,
32    ConnectSessionFor<Endpoint>: xwt_core::session::datagram::MaxSize
33        + xwt_core::session::datagram::Send
34        + xwt_core::session::datagram::Receive
35        + std::fmt::Debug,
36    ReceiveDatagramFor<ConnectSessionFor<Endpoint>>: std::fmt::Debug,
37{
38    let session = crate::utils::connect(&endpoint, url)
39        .await
40        .map_err(Error::Connect)?;
41
42    let max_datagram_size = session
43        .max_datagram_size()
44        .ok_or(Error::DatagramsNotSupported)?;
45
46    if max_datagram_size < MIN_DATAGRAM_SIZE {
47        return Err(Error::MaxDatagramSizeTooSmall {
48            size: max_datagram_size,
49        });
50    }
51
52    session
53        .send_datagram(&b"hello"[..])
54        .await
55        .map_err(Error::Send)?;
56
57    let read = session.receive_datagram().await.map_err(Error::Recv)?;
58
59    if read.as_ref() != b"hello" {
60        return Err(Error::BadData(read));
61    }
62
63    Ok(())
64}