Skip to content

Commit 04b63de

Browse files
test: bound local fetch fixtures
1 parent 0202906 commit 04b63de

1 file changed

Lines changed: 33 additions & 13 deletions

File tree

crates/cli/tests/cli.rs

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,26 @@ fn response(status: &str, headers: &[(&str, &str)], body: &str) -> String {
918918
response
919919
}
920920

921+
fn accept_connection(listener: &TcpListener) -> TcpStream {
922+
const ACCEPT_TIMEOUT: Duration = Duration::from_secs(5);
923+
924+
listener.set_nonblocking(true).unwrap();
925+
let deadline = Instant::now() + ACCEPT_TIMEOUT;
926+
loop {
927+
match listener.accept() {
928+
Ok((stream, _)) => {
929+
stream.set_nonblocking(false).unwrap();
930+
return stream;
931+
}
932+
Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => {
933+
assert!(Instant::now() < deadline, "timed out waiting for local HTTP request");
934+
thread::sleep(Duration::from_millis(5));
935+
}
936+
Err(error) => panic!("failed to accept local HTTP request: {error}"),
937+
}
938+
}
939+
}
940+
921941
fn serve_once(listener: TcpListener, reply: String, delay: Duration) -> Receiver<()> {
922942
let (sender, receiver) = mpsc::channel();
923943
thread::spawn(move || {
@@ -964,7 +984,7 @@ fn fetch_security_rejects_existing_source_map_destination() {
964984
let server = listener.try_clone().unwrap();
965985
let received = thread::spawn(move || {
966986
for body in ["console.log(1);\n//# sourceMappingURL=bundle.js.map", source_map_json()] {
967-
let (mut stream, _) = server.accept().unwrap();
987+
let mut stream = accept_connection(&server);
968988
let _ = read_request(&mut stream);
969989
stream.write_all(response("200 OK", &[], body).as_bytes()).unwrap();
970990
}
@@ -1017,7 +1037,7 @@ fn fetch_security_rejects_symlink_source_map_destination() {
10171037
let server = listener.try_clone().unwrap();
10181038
let received = thread::spawn(move || {
10191039
for body in ["console.log(1);\n//# sourceMappingURL=bundle.js.map", source_map_json()] {
1020-
let (mut stream, _) = server.accept().unwrap();
1040+
let mut stream = accept_connection(&server);
10211041
let _ = read_request(&mut stream);
10221042
stream.write_all(response("200 OK", &[], body).as_bytes()).unwrap();
10231043
}
@@ -1047,7 +1067,7 @@ fn fetch_security_rejects_bundle_and_map_filename_collisions() {
10471067
let expected_bundle = bundle.clone();
10481068
let received = thread::spawn(move || {
10491069
for body in [bundle.as_str(), source_map_json()] {
1050-
let (mut stream, _) = server.accept().unwrap();
1070+
let mut stream = accept_connection(&server);
10511071
let _ = read_request(&mut stream);
10521072
stream.write_all(response("200 OK", &[], body).as_bytes()).unwrap();
10531073
}
@@ -1074,7 +1094,7 @@ fn fetch_conventional_source_map_ignores_not_found() {
10741094
for reply in
10751095
[response("200 OK", &[], "console.log(1)"), response("404 Not Found", &[], "missing")]
10761096
{
1077-
let (mut stream, _) = server.accept().unwrap();
1097+
let mut stream = accept_connection(&server);
10781098
let _ = read_request(&mut stream);
10791099
stream.write_all(reply.as_bytes()).unwrap();
10801100
}
@@ -1102,7 +1122,7 @@ fn fetch_conventional_source_map_propagates_server_error() {
11021122
response("200 OK", &[], "console.log(1)"),
11031123
response("500 Internal Server Error", &[], "failed"),
11041124
] {
1105-
let (mut stream, _) = server.accept().unwrap();
1125+
let mut stream = accept_connection(&server);
11061126
let _ = read_request(&mut stream);
11071127
stream.write_all(reply.as_bytes()).unwrap();
11081128
}
@@ -1125,11 +1145,11 @@ fn fetch_conventional_source_map_propagates_timeout() {
11251145
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
11261146
let server = listener.try_clone().unwrap();
11271147
let received = thread::spawn(move || {
1128-
let (mut bundle_stream, _) = server.accept().unwrap();
1148+
let mut bundle_stream = accept_connection(&server);
11291149
let _ = read_request(&mut bundle_stream);
11301150
bundle_stream.write_all(response("200 OK", &[], "console.log(1)").as_bytes()).unwrap();
11311151

1132-
let (mut map_stream, _) = server.accept().unwrap();
1152+
let mut map_stream = accept_connection(&server);
11331153
let _ = read_request(&mut map_stream);
11341154
thread::sleep(Duration::from_millis(150));
11351155
let _ = map_stream.write_all(response("200 OK", &[], source_map_json()).as_bytes());
@@ -1159,7 +1179,7 @@ fn fetch_conventional_source_map_propagates_cross_origin_redirect() {
11591179
response("200 OK", &[], "console.log(1)"),
11601180
response("302 Found", &[("Location", &target_url)], ""),
11611181
] {
1162-
let (mut stream, _) = server.accept().unwrap();
1182+
let mut stream = accept_connection(&server);
11631183
let _ = read_request(&mut stream);
11641184
stream.write_all(reply.as_bytes()).unwrap();
11651185
}
@@ -1185,11 +1205,11 @@ fn fetch_conventional_source_map_propagates_body_read_error() {
11851205
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
11861206
let server = listener.try_clone().unwrap();
11871207
let received = thread::spawn(move || {
1188-
let (mut bundle_stream, _) = server.accept().unwrap();
1208+
let mut bundle_stream = accept_connection(&server);
11891209
let _ = read_request(&mut bundle_stream);
11901210
bundle_stream.write_all(response("200 OK", &[], "console.log(1)").as_bytes()).unwrap();
11911211

1192-
let (mut map_stream, _) = server.accept().unwrap();
1212+
let mut map_stream = accept_connection(&server);
11931213
let _ = read_request(&mut map_stream);
11941214
map_stream
11951215
.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 100\r\nConnection: close\r\n\r\n{")
@@ -1308,7 +1328,7 @@ fn fetch_security_allows_same_origin_relative_source_map() {
13081328
let server = listener.try_clone().unwrap();
13091329
let received = thread::spawn(move || {
13101330
for body in ["console.log(1);\n//# sourceMappingURL=bundle.js.map", source_map_json()] {
1311-
let (mut stream, _) = server.accept().unwrap();
1331+
let mut stream = accept_connection(&server);
13121332
let _ = read_request(&mut stream);
13131333
stream.write_all(response("200 OK", &[], body).as_bytes()).unwrap();
13141334
}
@@ -1339,7 +1359,7 @@ fn fetch_security_uses_final_redirect_url_for_relative_map_and_filename() {
13391359
let expected_paths = ["/old/bundle.js", "/assets/final.js", "/assets/final.js.map"];
13401360

13411361
for (reply, expected_path) in replies.iter().zip(expected_paths) {
1342-
let (mut stream, _) = server.accept().unwrap();
1362+
let mut stream = accept_connection(&server);
13431363
assert_eq!(read_request(&mut stream), expected_path);
13441364
stream.write_all(reply.as_bytes()).unwrap();
13451365
}
@@ -1367,7 +1387,7 @@ fn fetch_security_bounds_redirects() {
13671387
let server = listener.try_clone().unwrap();
13681388
let received = thread::spawn(move || {
13691389
for _ in 0..EXPECTED_REQUESTS {
1370-
let (mut stream, _) = server.accept().unwrap();
1390+
let mut stream = accept_connection(&server);
13711391
let _ = read_request(&mut stream);
13721392
let reply = response("302 Found", &[("Location", "/loop")], "");
13731393
stream.write_all(reply.as_bytes()).unwrap();

0 commit comments

Comments
 (0)