diff --git a/src/cortex-cli/src/debug_cmd/handlers/wait.rs b/src/cortex-cli/src/debug_cmd/handlers/wait.rs index 799e2d755..6950e99c7 100644 --- a/src/cortex-cli/src/debug_cmd/handlers/wait.rs +++ b/src/cortex-cli/src/debug_cmd/handlers/wait.rs @@ -54,10 +54,8 @@ pub async fn run_wait(args: WaitArgs) -> Result<()> { while start.elapsed() < timeout { match client.get(&args.server_url).send().await { - Ok(response) - if response.status().is_success() || response.status().is_client_error() => - { - // Server is responding (even 4xx means it's up) + Ok(response) if is_server_ready_status(response.status()) => { + // The readiness endpoint must respond successfully. success = true; break; } @@ -150,3 +148,7 @@ pub async fn run_wait(args: WaitArgs) -> Result<()> { Ok(()) } + +fn is_server_ready_status(status: reqwest::StatusCode) -> bool { + status.is_success() +} diff --git a/src/cortex-cli/tests/debug_wait.rs b/src/cortex-cli/tests/debug_wait.rs new file mode 100644 index 000000000..6f5fa7c39 --- /dev/null +++ b/src/cortex-cli/tests/debug_wait.rs @@ -0,0 +1,58 @@ +use std::io::{Read, Write}; +use std::net::TcpListener; +use std::process::Command; +use std::thread; + +fn serve_once(status_line: &'static str) -> String { + let listener = TcpListener::bind("127.0.0.1:0").expect("bind test server"); + let addr = listener.local_addr().expect("read local addr"); + + thread::spawn(move || { + if let Ok((mut stream, _)) = listener.accept() { + let mut request = [0; 1024]; + let _ = stream.read(&mut request); + let body = b"test"; + let response = format!( + "{status_line}\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body.len() + ); + let _ = stream.write_all(response.as_bytes()); + let _ = stream.write_all(body); + } + }); + + format!("http://{addr}") +} + +#[test] +fn debug_wait_server_ready_rejects_404() { + let server_url = serve_once("HTTP/1.1 404 Not Found"); + + let output = Command::new(env!("CARGO_BIN_EXE_Cortex")) + .args([ + "debug", + "wait", + "--server-ready", + "--server-url", + &server_url, + "--timeout", + "1", + "--interval", + "100", + "--json", + ]) + .output() + .expect("run Cortex debug wait"); + + assert!( + !output.status.success(), + "404 readiness response should fail; stdout={}, stderr={}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + assert!( + String::from_utf8_lossy(&output.stdout).contains("\"success\": false"), + "stdout should report failure JSON: {}", + String::from_utf8_lossy(&output.stdout) + ); +}