xwt_tests/tests/
read_resize_buf.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::OpenBi + std::fmt::Debug,
9{
10 #[error("connect: {0}")]
11 Connect(#[source] xwt_error::Connect<Endpoint>),
12 #[error("open: {0}")]
13 Open(#[source] xwt_error::OpenBi<ConnectSessionFor<Endpoint>>),
14 #[error("send: {0}")]
15 Send(#[source] WriteErrorFor<SendStreamFor<ConnectSessionFor<Endpoint>>>),
16 #[error("recv: {0}")]
17 Recv(#[source] ReadErrorFor<RecvStreamFor<ConnectSessionFor<Endpoint>>>),
18 #[error("bad data")]
19 BadData(Vec<u8>),
20}
21
22pub async fn run<Endpoint>(endpoint: Endpoint, url: &str) -> Result<(), Error<Endpoint>>
23where
24 Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
25 Endpoint::Connecting: std::fmt::Debug,
26 ConnectSessionFor<Endpoint>: xwt_core::session::stream::OpenBi + std::fmt::Debug,
27{
28 let session = crate::utils::connect(&endpoint, url)
29 .await
30 .map_err(Error::Connect)?;
31
32 let (mut send_stream, mut recv_stream) =
33 crate::utils::open_bi(&session).await.map_err(Error::Open)?;
34
35 let mut to_write = &b"hello"[..];
36 loop {
37 let written = send_stream.write(to_write).await.map_err(Error::Send)?;
38 let written = written.get();
39 to_write = &to_write[written..];
40 if to_write.is_empty() {
41 break;
42 }
43 }
44
45 let mut read_buf = vec![0u8; 1];
46
47 let read = recv_stream
48 .read(&mut read_buf[..])
49 .await
50 .map_err(Error::Recv)?;
51 let read = read.get();
52 read_buf.truncate(read);
53
54 if read_buf != b"h" {
55 return Err(Error::BadData(read_buf));
56 }
57
58 let mut read_buf = vec![0u8; 3];
59
60 let read = recv_stream
61 .read(&mut read_buf[..])
62 .await
63 .map_err(Error::Recv)?;
64 let read = read.get();
65 read_buf.truncate(read);
66
67 if read_buf != b"ell" {
68 return Err(Error::BadData(read_buf));
69 }
70
71 let read = recv_stream
72 .read(&mut read_buf[..])
73 .await
74 .map_err(Error::Recv)?;
75 let read = read.get();
76 read_buf.truncate(read);
77
78 if read_buf != b"o" {
79 return Err(Error::BadData(read_buf));
80 }
81
82 Ok(())
83}