#[tokio::test]
async fn test_registry_multiple_failures_no_state_leak() {
let app = create_test_app_shared();
let req1 = serde_json::json!({
"model": "fake-model-1",
"messages": [{"role": "user", "content": "Hello"}]
});
let request1 = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req1).expect("JSON serialization failed")))
.expect("test value should be present");
let response1 = app.clone().oneshot(request1).await.expect("test value should be present");
let status1 = response1.status();
let req2 = serde_json::json!({
"model": "fake-model-2",
"messages": [{"role": "user", "content": "World"}]
});
let request2 = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req2).expect("JSON serialization failed")))
.expect("test value should be present");
let response2 = app.clone().oneshot(request2).await.expect("test value should be present");
let status2 = response2.status();
crate::api::test_helpers::assert_no_model_status(status1);
crate::api::test_helpers::assert_no_model_status(status2);
assert_eq!(
status2, status1,
"consecutive failures must be identical; a difference is leaked state"
);
}
#[tokio::test]
async fn test_stream_resource_boundedness() {
use std::time::Duration;
use tokio::time::timeout;
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Generate a very long response"}],
"stream": true,
"max_tokens": 1000 });
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let result = timeout(Duration::from_secs(30), app.oneshot(request)).await;
assert!(
result.is_ok(),
"Stream request must complete within timeout (no zombified connection)"
);
let response = result.expect("test value should be present").expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_stream_memory_boundedness() {
let app = create_test_app_shared();
let mut handles = vec![];
for i in 0..3 {
let app_clone = app.clone();
let handle = tokio::spawn(async move {
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": format!("Request {i}")}],
"stream": true,
"max_tokens": 50
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
app_clone.oneshot(request).await
});
handles.push(handle);
}
for handle in handles {
let result = handle.await;
assert!(result.is_ok(), "Concurrent stream request must complete");
let response = result.expect("test value should be present");
assert!(response.is_ok(), "Concurrent stream must not error");
}
}