xwt_tests/tests/
accept_bi_stream.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::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}