xwt_tests/tests/
datagrams.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use xwt_core::prelude::*;

const MIN_DATAGRAM_SIZE: usize = 1024;

#[derive(Debug, thiserror::Error)]
pub enum Error<Endpoint>
where
    Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
    Endpoint::Connecting: std::fmt::Debug,
    ConnectSessionFor<Endpoint>:
        xwt_core::session::datagram::Send + xwt_core::session::datagram::Receive + std::fmt::Debug,
    ReceiveDatagramFor<ConnectSessionFor<Endpoint>>: std::fmt::Debug,
{
    #[error("connect: {0}")]
    Connect(#[source] xwt_error::Connect<Endpoint>),
    #[error("datagrams not supported")]
    DatagramsNotSupported,
    #[error("max datagram size is smaller than minimum - {size} / {MIN_DATAGRAM_SIZE}")]
    MaxDatagramSizeTooSmall { size: usize },
    #[error("send: {0}")]
    Send(#[source] SendErrorFor<ConnectSessionFor<Endpoint>>),
    #[error("recv: {0}")]
    Recv(#[source] ReceiveErrorFor<ConnectSessionFor<Endpoint>>),
    #[error("bad data")]
    BadData(ReceiveDatagramFor<ConnectSessionFor<Endpoint>>),
}

pub async fn run<Endpoint>(endpoint: Endpoint, url: &str) -> Result<(), Error<Endpoint>>
where
    Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
    Endpoint::Connecting: std::fmt::Debug,
    ConnectSessionFor<Endpoint>: xwt_core::session::datagram::MaxSize
        + xwt_core::session::datagram::Send
        + xwt_core::session::datagram::Receive
        + std::fmt::Debug,
    ReceiveDatagramFor<ConnectSessionFor<Endpoint>>: std::fmt::Debug,
{
    let session = crate::utils::connect(&endpoint, url)
        .await
        .map_err(Error::Connect)?;

    let max_datagram_size = session
        .max_datagram_size()
        .ok_or(Error::DatagramsNotSupported)?;

    if max_datagram_size < MIN_DATAGRAM_SIZE {
        return Err(Error::MaxDatagramSizeTooSmall {
            size: max_datagram_size,
        });
    }

    session
        .send_datagram(&b"hello"[..])
        .await
        .map_err(Error::Send)?;

    let read = session.receive_datagram().await.map_err(Error::Recv)?;

    if read.as_ref() != b"hello" {
        return Err(Error::BadData(read));
    }

    Ok(())
}