Skip to content

Commit f7f53b8

Browse files
committed
Add a test ensuring blocking endpoints don't block each other
1 parent 16a21b5 commit f7f53b8

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

src/tests.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ fn build_headers(msg: &str) -> HashMap<String, Vec<String>> {
8585

8686
fn make_service<H: Handler>(
8787
handler: H,
88+
max_thread_count: usize,
8889
) -> impl Service<
8990
hyper::Request<hyper::Body>,
9091
Response = hyper::Response<hyper::Body>,
@@ -93,7 +94,7 @@ fn make_service<H: Handler>(
9394
> {
9495
use hyper::service::service_fn;
9596

96-
let handler = std::sync::Arc::new(BlockingHandler::new(handler, 1));
97+
let handler = std::sync::Arc::new(BlockingHandler::new(handler, max_thread_count));
9798

9899
service_fn(move |request: hyper::Request<hyper::Body>| {
99100
let remote_addr = ([0, 0, 0, 0], 0).into();
@@ -102,7 +103,7 @@ fn make_service<H: Handler>(
102103
}
103104

104105
async fn simulate_request<H: Handler>(handler: H) -> hyper::Response<hyper::Body> {
105-
let mut service = make_service(handler);
106+
let mut service = make_service(handler, 1);
106107
service.call(hyper::Request::default()).await.unwrap()
107108
}
108109

@@ -141,7 +142,7 @@ async fn recover_from_panic() {
141142

142143
#[tokio::test]
143144
async fn normalize_path() {
144-
let mut service = make_service(AssertPathNormalized);
145+
let mut service = make_service(AssertPathNormalized, 1);
145146
let req = hyper::Request::put("//removed/.././.././normalized")
146147
.body(hyper::Body::default())
147148
.unwrap();
@@ -159,7 +160,7 @@ async fn normalize_path() {
159160

160161
#[tokio::test]
161162
async fn limits_thread_count() {
162-
let mut service = make_service(Sleep);
163+
let mut service = make_service(Sleep, 1);
163164
let first = service.call(hyper::Request::default());
164165
let second = service.call(hyper::Request::default());
165166

@@ -173,3 +174,22 @@ async fn limits_thread_count() {
173174

174175
assert_eq!(first_completed.status(), 503)
175176
}
177+
178+
#[tokio::test]
179+
async fn sleeping_doesnt_block_another_request() {
180+
let mut service = make_service(Sleep, 2);
181+
182+
let first = service.call(hyper::Request::default());
183+
let second = service.call(hyper::Request::default());
184+
185+
let start = std::time::Instant::now();
186+
187+
// Spawn 2 requests that each sleeps for 100ms
188+
let (first, second) = futures::join!(first, second);
189+
190+
// Elapsed time should be closer to 100ms than 200ms
191+
assert!(start.elapsed().as_millis() < 150);
192+
193+
assert_eq!(first.unwrap().status(), 200);
194+
assert_eq!(second.unwrap().status(), 200);
195+
}

0 commit comments

Comments
 (0)