xwt_tests/tests/
accept_bi_stream.rs1use xwt_core::prelude::*;
2
3#[derive(Debug, thiserror::Error)]
4pub enum Error<Endpoint>
5where
6 Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
7 Endpoint::Connecting: std::fmt::Debug,
8 ConnectSessionFor<Endpoint>: xwt_core::session::stream::AcceptBi + std::fmt::Debug,
9{
10 #[error("connect: {0}")]
11 Connect(#[source] xwt_error::Connect<Endpoint>),
12 #[error("accept bi stream: {0}")]
13 AcceptBiStream(
14 #[source] <ConnectSessionFor<Endpoint> as xwt_core::session::stream::AcceptBi>::Error,
15 ),
16 #[error("send: {0}")]
17 Send(#[source] WriteErrorFor<SendStreamFor<ConnectSessionFor<Endpoint>>>),
18 #[error("recv: {0}")]
19 Recv(#[source] ReadErrorFor<RecvStreamFor<ConnectSessionFor<Endpoint>>>),
20 #[error("bad data")]
21 BadData(Vec<u8>),
22}
23
24pub async fn run<Endpoint>(endpoint: Endpoint, url: &str) -> Result<(), Error<Endpoint>>
25where
26 Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
27 Endpoint::Connecting: std::fmt::Debug,
28 ConnectSessionFor<Endpoint>: xwt_core::session::stream::AcceptBi + std::fmt::Debug,
29{
30 let session = crate::utils::connect(&endpoint, url)
31 .await
32 .map_err(Error::Connect)?;
33
34 let (mut send_stream, mut recv_stream) =
35 session.accept_bi().await.map_err(Error::AcceptBiStream)?;
36
37 let mut to_write = &b"hello"[..];
38 loop {
39 let written = send_stream.write(to_write).await.map_err(Error::Send)?;
40 let written = written.get();
41 to_write = &to_write[written..];
42 if to_write.is_empty() {
43 break;
44 }
45 }
46
47 let mut read_buf = vec![0u8; 1024];
48
49 let read = recv_stream
50 .read(&mut read_buf[..])
51 .await
52 .map_err(Error::Recv)?;
53 let read = read.get();
54 read_buf.truncate(read);
55
56 if read_buf != b"hello" {
57 return Err(Error::BadData(read_buf));
58 }
59
60 Ok(())
61}