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