CS110L-Lab/proj-2/balancebeam/tests/01_single_upstream_tests.rs
2020-10-07 15:58:20 -07:00

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 :)");
}