xwt_tests/tests/
closed_bi_read_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::OpenBi + std::fmt::Debug,
9{
10    #[error("connect: {0}")]
11    Connect(#[source] xwt_error::Connect<Endpoint>),
12    #[error("open bi stream: {0}")]
13    OpenBiStream(#[source] BiStreamOpenErrorFor<ConnectSessionFor<Endpoint>>),
14    #[error("opening bi stream: {0}")]
15    OpeningBiStream(#[source] BiStreamOpeningErrorFor<ConnectSessionFor<Endpoint>>),
16    #[error("write stream aborted: {0}")]
17    WriteStreamAborted(#[source] WriteAbortedErrorFor<SendStreamFor<ConnectSessionFor<Endpoint>>>),
18    #[error("error code mismatch: got code {0}")]
19    ErrorCodeMismatch(xwt_core::stream::ErrorCode),
20}
21
22pub async fn run<Endpoint>(
23    endpoint: Endpoint,
24    url: &str,
25    expected_error_code: xwt_core::stream::ErrorCode,
26) -> Result<(), Error<Endpoint>>
27where
28    Endpoint: xwt_core::endpoint::Connect + std::fmt::Debug,
29    Endpoint::Connecting: std::fmt::Debug,
30    ConnectSessionFor<Endpoint>: xwt_core::session::stream::OpenBi + std::fmt::Debug,
31    SendStreamFor<ConnectSessionFor<Endpoint>>: xwt_core::stream::WriteAborted,
32{
33    let session = crate::utils::connect(&endpoint, url)
34        .await
35        .map_err(Error::Connect)?;
36
37    let opening = session.open_bi().await.map_err(Error::OpenBiStream)?;
38    let (send_stream, _recv_stream) = opening.wait_bi().await.map_err(Error::OpeningBiStream)?;
39
40    let error_code = send_stream
41        .aborted()
42        .await
43        .map_err(Error::WriteStreamAborted)?;
44
45    if error_code != expected_error_code {
46        return Err(Error::ErrorCodeMismatch(error_code));
47    }
48
49    Ok(())
50}