Skip to main content

xwebtransport_tests/
tests.rs

1use xwebtransport_core::prelude::*;
2
3#[derive(Debug, thiserror::Error)]
4pub enum EchoError<Endpoint>
5where
6    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
7    Endpoint::Connecting: std::fmt::Debug,
8    EndpointConnectConnectionFor<Endpoint>: xwebtransport_core::OpenBiStream + std::fmt::Debug,
9{
10    Connect(xwebtransport_error::Connect<Endpoint>),
11    Open(xwebtransport_error::OpenBi<EndpointConnectConnectionFor<Endpoint>>),
12    Send(WriteErrorFor<SendStreamFor<EndpointConnectConnectionFor<Endpoint>>>),
13    Recv(ReadErrorFor<RecvStreamFor<EndpointConnectConnectionFor<Endpoint>>>),
14    NoResponse,
15    BadData(Vec<u8>),
16}
17
18pub async fn echo<Endpoint>(endpoint: Endpoint) -> Result<(), EchoError<Endpoint>>
19where
20    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
21    Endpoint::Connecting: std::fmt::Debug,
22    EndpointConnectConnectionFor<Endpoint>: xwebtransport_core::OpenBiStream + std::fmt::Debug,
23{
24    let connection = crate::utils::connect(endpoint, "https://echo.webtransport.day")
25        .await
26        .map_err(EchoError::Connect)?;
27
28    let (mut send_stream, mut recv_stream) = crate::utils::open_bi(connection)
29        .await
30        .map_err(EchoError::Open)?;
31
32    let mut to_write = &b"hello"[..];
33    loop {
34        let written = send_stream.write(to_write).await.map_err(EchoError::Send)?;
35        to_write = &to_write[written..];
36        if to_write.is_empty() {
37            break;
38        }
39    }
40
41    let mut read_buf = vec![0u8; 1024];
42
43    let Some(read) = recv_stream
44        .read(&mut read_buf[..])
45        .await
46        .map_err(EchoError::Recv)?
47    else {
48        return Err(EchoError::NoResponse);
49    };
50    read_buf.truncate(read);
51
52    if read_buf != b"hello" {
53        return Err(EchoError::BadData(read_buf));
54    }
55
56    Ok(())
57}
58
59#[derive(Debug, thiserror::Error)]
60pub enum EchoChunksError<Endpoint, WriteChunk, ReadChunk>
61where
62    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
63    Endpoint::Connecting: std::fmt::Debug,
64    EndpointConnectConnectionFor<Endpoint>: xwebtransport_core::OpenBiStream + std::fmt::Debug,
65
66    WriteChunk: xwebtransport_core::WriteableChunk + std::fmt::Debug,
67    ReadChunk: xwebtransport_core::ReadableChunk + std::fmt::Debug,
68
69    SendStreamFor<EndpointConnectConnectionFor<Endpoint>>:
70        xwebtransport_core::WriteChunk<WriteChunk>,
71    RecvStreamFor<EndpointConnectConnectionFor<Endpoint>>: xwebtransport_core::ReadChunk<ReadChunk>,
72{
73    Connect(xwebtransport_error::Connect<Endpoint>),
74    Open(xwebtransport_error::OpenBi<EndpointConnectConnectionFor<Endpoint>>),
75    Send(WriteChunkErrorFor<SendStreamFor<EndpointConnectConnectionFor<Endpoint>>, WriteChunk>),
76    Recv(ReadChunkErrorFor<RecvStreamFor<EndpointConnectConnectionFor<Endpoint>>, ReadChunk>),
77    NoResponse,
78    BadData(Vec<u8>),
79}
80
81pub async fn echo_chunks<Endpoint, WriteChunk, ReadChunk>(
82    endpoint: Endpoint,
83) -> Result<(), EchoChunksError<Endpoint, WriteChunk, ReadChunk>>
84where
85    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
86    Endpoint::Connecting: std::fmt::Debug,
87    EndpointConnectConnectionFor<Endpoint>: xwebtransport_core::OpenBiStream + std::fmt::Debug,
88
89    WriteChunk: xwebtransport_core::WriteableChunk + std::fmt::Debug,
90    ReadChunk: xwebtransport_core::ReadableChunk + std::fmt::Debug,
91
92    <WriteChunk as xwebtransport_core::WriteableChunk>::Data<'static>: From<&'static [u8]>,
93    for<'a> <ReadChunk as xwebtransport_core::ReadableChunk>::Data<'a>: AsRef<[u8]>,
94
95    SendStreamFor<EndpointConnectConnectionFor<Endpoint>>:
96        xwebtransport_core::WriteChunk<WriteChunk>,
97    RecvStreamFor<EndpointConnectConnectionFor<Endpoint>>: xwebtransport_core::ReadChunk<ReadChunk>,
98{
99    let connection = crate::utils::connect(endpoint, "https://echo.webtransport.day")
100        .await
101        .map_err(EchoChunksError::Connect)?;
102
103    let (mut send_stream, mut recv_stream) = crate::utils::open_bi(connection)
104        .await
105        .map_err(EchoChunksError::Open)?;
106
107    let write_data: WriteChunk::Data<'static> = (&b"hello"[..]).into();
108    send_stream
109        .write_chunk(write_data)
110        .await
111        .map_err(EchoChunksError::Send)?;
112
113    let maybe_read_chunk = recv_stream
114        .read_chunk(1024, false)
115        .await
116        .map_err(EchoChunksError::Recv)?;
117    let Some(read_chunk) = maybe_read_chunk else {
118        return Err(EchoChunksError::NoResponse);
119    };
120    let read_data = read_chunk.data.as_ref();
121
122    if read_data != b"hello" {
123        return Err(EchoChunksError::BadData(read_data.into()));
124    }
125
126    Ok(())
127}
128
129#[derive(Debug, thiserror::Error)]
130pub enum EchoDatagrmsError<Endpoint>
131where
132    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
133    Endpoint::Connecting: std::fmt::Debug,
134    EndpointConnectConnectionFor<Endpoint>:
135        xwebtransport_core::datagram::Datagrams + std::fmt::Debug,
136    ReceiveDatagramFor<EndpointConnectConnectionFor<Endpoint>>: std::fmt::Debug,
137{
138    Connect(xwebtransport_error::Connect<Endpoint>),
139    Send(SendErrorFor<EndpointConnectConnectionFor<Endpoint>>),
140    Recv(ReceiveErrorFor<EndpointConnectConnectionFor<Endpoint>>),
141    BadData(ReceiveDatagramFor<EndpointConnectConnectionFor<Endpoint>>),
142}
143
144pub async fn echo_datagrams<Endpoint>(endpoint: Endpoint) -> Result<(), EchoDatagrmsError<Endpoint>>
145where
146    Endpoint: xwebtransport_core::EndpointConnect + std::fmt::Debug,
147    Endpoint::Connecting: std::fmt::Debug,
148    EndpointConnectConnectionFor<Endpoint>:
149        xwebtransport_core::datagram::Datagrams + std::fmt::Debug,
150    ReceiveDatagramFor<EndpointConnectConnectionFor<Endpoint>>: std::fmt::Debug,
151{
152    let connection = crate::utils::connect(endpoint, "https://echo.webtransport.day")
153        .await
154        .map_err(EchoDatagrmsError::Connect)?;
155
156    connection
157        .send_datagram(&b"hello"[..])
158        .await
159        .map_err(EchoDatagrmsError::Send)?;
160
161    let read = connection
162        .receive_datagram()
163        .await
164        .map_err(EchoDatagrmsError::Recv)?;
165
166    if read.as_ref() != b"hello" {
167        return Err(EchoDatagrmsError::BadData(read));
168    }
169
170    Ok(())
171}