102 lines
3.6 KiB
Rust
102 lines
3.6 KiB
Rust
mod common;
|
|
|
|
use common::{init_logging, BalanceBeam, EchoServer, Server};
|
|
use std::sync::Arc;
|
|
|
|
async fn setup() -> (BalanceBeam, EchoServer) {
|
|
init_logging();
|
|
let upstream = EchoServer::new().await;
|
|
let balancebeam = BalanceBeam::new(&[&upstream.address], None, None).await;
|
|
(balancebeam, upstream)
|
|
}
|
|
|
|
/// Test the simple case: open a few connections, each with only a single request, and make sure
|
|
/// things are delivered correctly.
|
|
#[tokio::test]
|
|
async fn test_simple_connections() {
|
|
let (balancebeam, upstream) = setup().await;
|
|
|
|
log::info!("Sending a GET request");
|
|
let response_text = balancebeam
|
|
.get("/first_url")
|
|
.await
|
|
.expect("Error sending request to balancebeam");
|
|
assert!(response_text.contains("GET /first_url HTTP/1.1"));
|
|
assert!(response_text.contains("x-sent-by: balancebeam-tests"));
|
|
assert!(response_text.contains("x-forwarded-for: 127.0.0.1"));
|
|
|
|
log::info!("Sending a POST request");
|
|
let response_text = balancebeam
|
|
.post("/first_url", "Hello world!")
|
|
.await
|
|
.expect("Error sending request to balancebeam");
|
|
assert!(response_text.contains("POST /first_url HTTP/1.1"));
|
|
assert!(response_text.contains("x-sent-by: balancebeam-tests"));
|
|
assert!(response_text.contains("x-forwarded-for: 127.0.0.1"));
|
|
assert!(response_text.contains("\n\nHello world!"));
|
|
|
|
log::info!("Checking that the origin server received 2 requests");
|
|
let num_requests_received = Box::new(upstream).stop().await;
|
|
assert_eq!(
|
|
num_requests_received, 2,
|
|
"Upstream server did not receive the expected number of requests"
|
|
);
|
|
|
|
log::info!("All done :)");
|
|
}
|
|
|
|
/// Test handling of multiple HTTP requests per connection to the server. Open three concurrent
|
|
/// connections, and send four requests on each.
|
|
#[tokio::test]
|
|
async fn test_multiple_requests_per_connection() {
|
|
let num_connections = 3;
|
|
let requests_per_connection = 4;
|
|
|
|
let (balancebeam, upstream) = setup().await;
|
|
let balancebeam_shared = Arc::new(balancebeam);
|
|
|
|
let mut tasks = Vec::new();
|
|
for task_num in 0..num_connections {
|
|
let balancebeam_shared = balancebeam_shared.clone();
|
|
tasks.push(tokio::task::spawn(async move {
|
|
let client = reqwest::Client::new();
|
|
for req_num in 0..requests_per_connection {
|
|
log::info!(
|
|
"Task {} sending request {} (connection {})",
|
|
task_num,
|
|
req_num,
|
|
task_num
|
|
);
|
|
let path = format!("/conn-{}/req-{}", task_num, req_num);
|
|
let response_text = client
|
|
.get(&format!("http://{}{}", balancebeam_shared.address, path))
|
|
.header("x-sent-by", "balancebeam-tests")
|
|
.send()
|
|
.await
|
|
.expect("Failed to connect to balancebeam")
|
|
.text()
|
|
.await
|
|
.expect("Balancebeam replied with a malformed response");
|
|
assert!(response_text.contains(&format!("GET {} HTTP/1.1", path)));
|
|
}
|
|
}));
|
|
}
|
|
|
|
for join_handle in tasks {
|
|
join_handle.await.expect("Task panicked");
|
|
}
|
|
|
|
log::info!(
|
|
"Checking that the origin server received {} requests",
|
|
num_connections * requests_per_connection
|
|
);
|
|
let num_requests_received = Box::new(upstream).stop().await;
|
|
assert_eq!(
|
|
num_requests_received,
|
|
num_connections * requests_per_connection,
|
|
"Upstream server did not receive the expected number of requests"
|
|
);
|
|
|
|
log::info!("All done :)");
|
|
}
|