diff --git a/crates/tinybrowser/src/tinybus_module/test.rs b/crates/tinybrowser/src/tinybus_module/test.rs
index 4086960..1838e32 100644
--- a/crates/tinybrowser/src/tinybus_module/test.rs
+++ b/crates/tinybrowser/src/tinybus_module/test.rs
@@ -226,7 +226,7 @@ fn options() -> tinybrowser_bus::SessionOptions {
}
}
-/// Serves one page on loopback and returns its URL.
+/// Serves one page on loopback for every browser request and returns its URL.
async fn serve(body: &'static str) -> String {
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
.await
@@ -234,26 +234,52 @@ async fn serve(body: &'static str) -> String {
let address = listener.local_addr().expect("has an address");
tokio::spawn(async move {
- let Ok((mut stream, _)) = listener.accept().await else {
- return;
- };
- let mut scratch = [0_u8; 2048];
- let _ = stream.read(&mut scratch).await;
- let document = format!(
- "
bus{body}"
- );
- let response = format!(
- "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\
- Content-Length: {}\r\nConnection: close\r\n\r\n{document}",
- document.len()
- );
- let _ = stream.write_all(response.as_bytes()).await;
- let _ = stream.shutdown().await;
+ while let Ok((mut stream, _)) = listener.accept().await {
+ tokio::spawn(async move {
+ let mut scratch = [0_u8; 2048];
+ let _ = stream.read(&mut scratch).await;
+ let document = format!(
+ "bus{body}"
+ );
+ let response = format!(
+ "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\
+ Content-Length: {}\r\nConnection: close\r\n\r\n{document}",
+ document.len()
+ );
+ let _ = stream.write_all(response.as_bytes()).await;
+ let _ = stream.shutdown().await;
+ });
+ }
});
format!("http://{address}/")
}
+#[tokio::test]
+async fn page_fixture_serves_repeated_document_requests() {
+ let url = serve("Bus
").await;
+ let address = url
+ .strip_prefix("http://")
+ .expect("loopback http URL")
+ .trim_end_matches('/');
+ for _ in 0..2 {
+ let mut stream = tokio::net::TcpStream::connect(address)
+ .await
+ .expect("fixture accepts another connection");
+ stream
+ .write_all(b"GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n")
+ .await
+ .expect("send request");
+ let mut response = String::new();
+ stream
+ .read_to_string(&mut response)
+ .await
+ .expect("read response");
+ assert!(response.contains("200 OK"));
+ assert!(response.contains("Bus
"));
+ }
+}
+
async fn serve_download() -> String {
let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
.await