use std::{net::Shutdown, sync::Arc};
use test_harness::test;
use trillium_http::{Conn, HttpContext};
use trillium_testing::{RuntimeTrait, TestTransport, harness};
async fn handler(mut conn: Conn<TestTransport>) -> Conn<TestTransport> {
conn.set_status(200);
conn.set_response_body("ok");
conn
}
fn response_count(responses: &str) -> usize {
responses.matches("HTTP/1.1 200").count()
}
async fn drive(requests: &str) -> String {
let runtime = trillium_testing::runtime();
let (client, server) = TestTransport::new();
let context = Arc::new(HttpContext::new());
let res = runtime.spawn(async move { context.run(server, handler).await });
client.write_all(requests);
client.shutdown(Shutdown::Write);
res.await.unwrap().unwrap();
client.read_available_string().await
}
#[test(harness)]
async fn connection_close_split_across_lines() {
let responses = drive(
"GET /1 HTTP/1.1\r\nHost: _\r\nConnection: keep-alive\r\nConnection: close\r\n\r\nGET /2 \
HTTP/1.1\r\nHost: _\r\n\r\n",
)
.await;
assert_eq!(response_count(&responses), 1, "{responses:?}");
}
#[test(harness)]
async fn keep_alive_serves_pipelined_requests() {
let responses =
drive("GET /1 HTTP/1.1\r\nHost: _\r\n\r\nGET /2 HTTP/1.1\r\nHost: _\r\n\r\n").await;
assert_eq!(response_count(&responses), 2, "{responses:?}");
}