mod common;
use std::time::Duration;
use scion_http3::{Client, Error, Request, TimeoutPhase};
use test_log::test;
use crate::common::{SERVER_NAME, e2e_setup};
#[test(tokio::test)]
#[ntest::timeout(120_000)]
async fn e2e_get_post_over_dns_resolution() {
let setup = e2e_setup().await;
let client = Client::new(
setup
.client_config()
.with_dns_override(SERVER_NAME, vec![setup.server_ip()]),
);
let response = client.get(setup.url("/hello")).await.expect("GET /hello");
assert!(response.is_success());
let (body, _trailers) = response.text(Some(1024)).await.expect("collecting body");
assert_eq!(body, "world");
let response = client
.post(setup.url("/echo"), "ping over SCION")
.await
.expect("POST /echo");
let (body, _trailers) = response.text(Some(1024)).await.expect("collecting body");
assert_eq!(body, "ping over SCION");
client.close().await;
}
#[test(tokio::test)]
#[ntest::timeout(120_000)]
async fn e2e_dns_override_bypasses_resolution() {
let setup = e2e_setup().await;
let client = Client::new(
setup
.client_config()
.with_dns_override(SERVER_NAME, vec![setup.server_ip()]),
);
let request = Request::get(setup.url("/hello"))
.build()
.expect("building request");
let response = client.request(request).await.expect("GET /hello");
let (body, _trailers) = response.text(Some(1024)).await.expect("collecting body");
assert_eq!(body, "world");
client.close().await;
}
#[test(tokio::test)]
#[ntest::timeout(120_000)]
async fn e2e_per_request_timeout() {
let setup = e2e_setup().await;
let client = Client::new(
setup
.client_config()
.with_dns_override(SERVER_NAME, vec![setup.server_ip()]),
);
client.warm_up(setup.url("/")).await.expect("warming up");
let request = Request::get(setup.url("/slow"))
.request_timeout(Duration::from_millis(300))
.build()
.expect("building request");
let err = client.request(request).await.expect_err("must time out");
assert!(
matches!(
err,
Error::Timeout {
phase: TimeoutPhase::Request,
..
}
),
"{err}"
);
assert!(err.is_retryable());
client.close().await;
}
#[test(tokio::test)]
#[ntest::timeout(120_000)]
async fn e2e_body_size_limit() {
let setup = e2e_setup().await;
let client = Client::new(
setup
.client_config()
.with_dns_override(SERVER_NAME, vec![setup.server_ip()]),
);
let request = Request::get(setup.url("/hello"))
.build()
.expect("building request");
let response = client.request(request).await.expect("GET /hello");
let err = response
.bytes(Some(2))
.await
.expect_err("body exceeds the limit");
assert!(matches!(err, Error::BodyTooLarge { limit: 2 }), "{err}");
client.close().await;
}