xwt_tests/tests/
read_resize_buf.rs

1use 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}