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