Skip to content

Commit e5fe941

Browse files
authored
Don't leave multiple threads hanging during testing (#64)
* Don't leave multiple threads hanging during testing Signed-off-by: Ed Snible <snible@us.ibm.com>
1 parent eb33877 commit e5fe941

112 files changed

Lines changed: 2334 additions & 1595 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 20 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/configuration/tests/suite/examples/ai/model_to_header.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ fn model_to_header_routes_by_model_field() {
1717
let proxy_port = free_port();
1818
let yaml = make_yaml(proxy_port, "mistral-large-latest", port_a, port_default);
1919
let config = Config::from_yaml(&yaml).unwrap();
20-
let addr = start_proxy(&config);
21-
let (status, body) = http_post(&addr, "/v1/chat", r#"{"model":"mistral-large-latest","messages":[]}"#);
20+
let proxy = start_proxy(&config);
21+
let (status, body) = http_post(
22+
proxy.addr(),
23+
"/v1/chat",
24+
r#"{"model":"mistral-large-latest","messages":[]}"#,
25+
);
2226
assert_eq!(status, 200, "matching model should return 200");
2327
assert_eq!(
2428
body, "model-a-response",
@@ -33,8 +37,8 @@ fn model_to_header_falls_through_on_unknown_model() {
3337
let proxy_port = free_port();
3438
let yaml = make_yaml(proxy_port, "mistral-large-latest", port_a, port_default);
3539
let config = Config::from_yaml(&yaml).unwrap();
36-
let addr = start_proxy(&config);
37-
let (status, body) = http_post(&addr, "/v1/chat", r#"{"model":"unknown","messages":[]}"#);
40+
let proxy = start_proxy(&config);
41+
let (status, body) = http_post(proxy.addr(), "/v1/chat", r#"{"model":"unknown","messages":[]}"#);
3842
assert_eq!(status, 200, "unknown model should return 200");
3943
assert_eq!(body, "default-response", "unknown model should fall through to default");
4044
}
@@ -46,8 +50,8 @@ fn model_to_header_continues_without_model_field() {
4650
let proxy_port = free_port();
4751
let yaml = make_yaml(proxy_port, "mistral-large-latest", port_a, port_default);
4852
let config = Config::from_yaml(&yaml).unwrap();
49-
let addr = start_proxy(&config);
50-
let (status, body) = http_post(&addr, "/v1/chat", r#"{"messages":[]}"#);
53+
let proxy = start_proxy(&config);
54+
let (status, body) = http_post(proxy.addr(), "/v1/chat", r#"{"messages":[]}"#);
5155
assert_eq!(status, 200, "missing model field should return 200");
5256
assert_eq!(body, "default-response", "missing model should fall through to default");
5357
}

tests/configuration/tests/suite/examples/api_key_filter.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ filter_chains:
4848
registry
4949
.register("api_key", FilterFactory::Http(Arc::new(ApiKeyFilter::from_config)))
5050
.expect("duplicate filter name");
51-
let addr = start_proxy_with_registry(&config, &registry);
51+
let proxy = start_proxy_with_registry(&config, &registry);
5252

5353
let raw = http_send(
54-
&addr,
54+
proxy.addr(),
5555
"GET / HTTP/1.1\r\n\
5656
Host: localhost\r\n\
5757
X-Api-Key: secret-1\r\n\
@@ -61,15 +61,15 @@ filter_chains:
6161
assert_eq!(parse_body(&raw), "protected", "valid API key should reach backend");
6262

6363
let raw = http_send(
64-
&addr,
64+
proxy.addr(),
6565
"GET / HTTP/1.1\r\n\
6666
Host: localhost\r\n\
6767
X-Api-Key: wrong\r\n\
6868
Connection: close\r\n\r\n",
6969
);
7070
assert_eq!(parse_status(&raw), 401, "invalid API key should return 401");
7171

72-
let (status, _) = http_get(&addr, "/", None);
72+
let (status, _) = http_get(proxy.addr(), "/", None);
7373
assert_eq!(status, 401, "missing API key should return 401");
7474
}
7575

tests/configuration/tests/suite/examples/max_body_guard.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ filter_chains:
5252
FilterFactory::Http(Arc::new(MaxBodyGuard::from_config)),
5353
)
5454
.expect("duplicate filter name");
55-
let addr = start_proxy_with_registry(&config, &registry);
55+
let proxy = start_proxy_with_registry(&config, &registry);
5656

5757
let raw = http_send(
58-
&addr,
58+
proxy.addr(),
5959
"POST / HTTP/1.1\r\n\
6060
Host: localhost\r\n\
6161
Content-Length: 5\r\n\
@@ -65,15 +65,15 @@ filter_chains:
6565
assert_eq!(parse_body(&raw), "accepted", "small body response should match backend");
6666

6767
let raw = http_send(
68-
&addr,
68+
proxy.addr(),
6969
"POST / HTTP/1.1\r\n\
7070
Host: localhost\r\n\
7171
Content-Length: 2048\r\n\
7272
Connection: close\r\n\r\n",
7373
);
7474
assert_eq!(parse_status(&raw), 413, "large body should be rejected with 413");
7575

76-
let (status, body) = http_get(&addr, "/", None);
76+
let (status, body) = http_get(proxy.addr(), "/", None);
7777
assert_eq!(status, 200, "GET without content-length should be accepted");
7878
assert_eq!(body, "accepted", "GET response should match backend");
7979
}

tests/configuration/tests/suite/examples/observability/access_logging.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@ fn access_logging() {
2020
proxy_port,
2121
HashMap::from([("127.0.0.1:3000", backend_port)]),
2222
);
23-
let addr = start_proxy(&config);
23+
let proxy = start_proxy(&config);
2424

25-
let raw = http_send(&addr, "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n");
25+
let raw = http_send(
26+
proxy.addr(),
27+
"GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n",
28+
);
2629
assert_eq!(parse_status(&raw), 200, "basic request should return 200");
2730
assert_eq!(parse_body(&raw), "logged", "response body should match backend");
2831

2932
let raw = http_send(
30-
&addr,
33+
proxy.addr(),
3134
"GET / HTTP/1.1\r\n\
3235
Host: localhost\r\n\
3336
X-Request-Id: trace-abc\r\n\

tests/configuration/tests/suite/examples/observability/logging.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@ fn logging() {
2020
proxy_port,
2121
HashMap::from([("127.0.0.1:3000", backend_port)]),
2222
);
23-
let addr = start_proxy(&config);
23+
let proxy = start_proxy(&config);
2424

25-
let raw = http_send(&addr, "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n");
25+
let raw = http_send(
26+
proxy.addr(),
27+
"GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n",
28+
);
2629
assert_eq!(parse_status(&raw), 200, "request without X-Trace-Id should succeed");
2730

2831
let raw = http_send(
29-
&addr,
32+
proxy.addr(),
3033
"GET / HTTP/1.1\r\n\
3134
Host: localhost\r\n\
3235
X-Trace-Id: my-trace-42\r\n\
@@ -40,7 +43,7 @@ fn logging() {
4043
);
4144

4245
let raw = http_send(
43-
&addr,
46+
proxy.addr(),
4447
"GET / HTTP/1.1\r\n\
4548
Host: localhost\r\n\
4649
X-Trace-Id: other-99\r\n\

tests/configuration/tests/suite/examples/payload_processing/stream_buffer.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,49 +10,51 @@ use praxis_core::config::Config;
1010
use praxis_filter::{
1111
BodyAccess, BodyMode, FilterAction, FilterError, FilterFactory, FilterRegistry, HttpFilter, HttpFilterContext,
1212
};
13-
use praxis_test_utils::{free_port, http_post, http_send, parse_status, start_backend, start_proxy_with_registry};
13+
use praxis_test_utils::{
14+
ProxyGuard, free_port, http_post, http_send, parse_status, start_backend, start_proxy_with_registry,
15+
};
1416

1517
// -----------------------------------------------------------------------------
1618
// Tests
1719
// -----------------------------------------------------------------------------
1820

1921
#[test]
2022
fn stream_buffer_within_limit_succeeds() {
21-
let addr = setup(256);
23+
let proxy = setup(256);
2224
let body = "a".repeat(100);
23-
let (status, _) = http_post(&addr, "/", &body);
25+
let (status, _) = http_post(proxy.addr(), "/", &body);
2426
assert_eq!(status, 200, "body within limit should be accepted");
2527
}
2628

2729
#[test]
2830
fn stream_buffer_at_exact_limit_succeeds() {
29-
let addr = setup(64);
31+
let proxy = setup(64);
3032
let body = "b".repeat(64);
31-
let (status, _) = http_post(&addr, "/", &body);
33+
let (status, _) = http_post(proxy.addr(), "/", &body);
3234
assert_eq!(status, 200, "body at exact limit should be accepted");
3335
}
3436

3537
#[test]
3638
fn stream_buffer_exceeding_limit_returns_413() {
37-
let addr = setup(64);
39+
let proxy = setup(64);
3840
let body = "c".repeat(128);
39-
let (status, _) = http_post(&addr, "/", &body);
41+
let (status, _) = http_post(proxy.addr(), "/", &body);
4042
assert_eq!(status, 413, "body exceeding limit should be rejected with 413");
4143
}
4244

4345
#[test]
4446
fn stream_buffer_one_byte_over_returns_413() {
45-
let addr = setup(64);
47+
let proxy = setup(64);
4648
let body = "d".repeat(65);
47-
let (status, _) = http_post(&addr, "/", &body);
49+
let (status, _) = http_post(proxy.addr(), "/", &body);
4850
assert_eq!(status, 413, "body one byte over limit should be rejected with 413");
4951
}
5052

5153
#[test]
5254
fn stream_buffer_empty_body_succeeds() {
53-
let addr = setup(64);
55+
let proxy = setup(64);
5456
let raw = http_send(
55-
&addr,
57+
proxy.addr(),
5658
"POST / HTTP/1.1\r\n\
5759
Host: localhost\r\n\
5860
Content-Length: 0\r\n\
@@ -113,8 +115,8 @@ impl HttpFilter for TinyStreamBufferFilter {
113115
}
114116
}
115117

116-
/// Start a proxy with a tiny stream buffer filter and return the address.
117-
fn setup(max_bytes: usize) -> String {
118+
/// Start a proxy with a tiny stream buffer filter and return the proxy guard.
119+
fn setup(max_bytes: usize) -> ProxyGuard {
118120
let backend_port = start_backend("ok");
119121
let proxy_port = free_port();
120122
let yaml = format!(

tests/configuration/tests/suite/examples/pipeline/conditional_filters.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ fn conditional_filters() {
2020
proxy_port,
2121
HashMap::from([("127.0.0.1:3000", backend_port)]),
2222
);
23-
let addr = start_proxy(&config);
23+
let proxy = start_proxy(&config);
2424
let raw = http_send(
25-
&addr,
25+
proxy.addr(),
2626
"POST /api/items HTTP/1.1\r\n\
2727
Host: localhost\r\n\
2828
Content-Length: 0\r\n\
@@ -35,7 +35,7 @@ fn conditional_filters() {
3535
);
3636
assert_eq!(parse_body(&raw), "ok", "POST response body should match backend");
3737
let raw_get = http_send(
38-
&addr,
38+
proxy.addr(),
3939
"GET /api/items HTTP/1.1\r\n\
4040
Host: localhost\r\n\
4141
Connection: close\r\n\r\n",

tests/configuration/tests/suite/examples/pipeline/default_config.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ fn default_config_root_returns_200() {
2323
let proxy_port = free_port();
2424
let yaml = DEFAULT_CONFIG.replace("0.0.0.0:8080", &format!("127.0.0.1:{proxy_port}"));
2525
let config = Config::from_yaml(&yaml).unwrap();
26-
let addr = start_proxy(&config);
27-
let (status, body) = http_get(&addr, "/", None);
26+
let proxy = start_proxy(&config);
27+
let (status, body) = http_get(proxy.addr(), "/", None);
2828
assert_eq!(status, 200, "default config root should return 200");
2929
let json: Value = serde_json::from_str(&body).expect("response body should be valid JSON");
3030
assert_eq!(json["status"], "ok", "status field should be 'ok'");
@@ -36,8 +36,8 @@ fn default_config_other_path_returns_404() {
3636
let proxy_port = free_port();
3737
let yaml = DEFAULT_CONFIG.replace("0.0.0.0:8080", &format!("127.0.0.1:{proxy_port}"));
3838
let config = Config::from_yaml(&yaml).unwrap();
39-
let addr = start_proxy(&config);
40-
let (status, body) = http_get(&addr, "/anything", None);
39+
let proxy = start_proxy(&config);
40+
let (status, body) = http_get(proxy.addr(), "/anything", None);
4141
assert_eq!(status, 404, "non-root path should return 404");
4242
assert!(body.contains("not found"), "404 body should contain 'not found'");
4343
}

tests/configuration/tests/suite/examples/traffic_management/basic_reverse_proxy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ fn basic_reverse_proxy() {
2020
proxy_port,
2121
HashMap::from([("127.0.0.1:3000", backend_port)]),
2222
);
23-
let addr = praxis_test_utils::start_proxy(&config);
24-
let (status, body) = http_get(&addr, "/", None);
23+
let proxy = praxis_test_utils::start_proxy(&config);
24+
let (status, body) = http_get(proxy.addr(), "/", None);
2525
assert_eq!(status, 200, "basic reverse proxy should return 200");
2626
assert_eq!(body, "hello", "proxy should forward backend response");
2727
}

0 commit comments

Comments
 (0)