xwt_tests/tests/
datagrams.rs1use 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}