use std::time::Duration;
use aa_core::config::RemoteModeConfig;
use axum_server::Handle;
#[tokio::test]
async fn start_remote_serves_healthz_over_http() {
let cfg = RemoteModeConfig {
listen_addr: "127.0.0.1:0".parse().expect("listen_addr"),
tls: None,
..Default::default()
};
let handle = Handle::new();
let probe_handle = handle.clone();
let shutdown_handle = handle.clone();
let server = tokio::spawn(async move { aa_gateway::remote_mode::start_remote_with_handle(&cfg, handle).await });
let addr = probe_handle.listening().await.expect("server bound");
let body: serde_json::Value = reqwest::get(format!("http://{addr}/healthz"))
.await
.expect("GET /healthz")
.json()
.await
.expect("parse JSON body");
assert_eq!(body["mode"], "remote", "mode label");
assert_eq!(body["storage"], "memory", "storage label");
shutdown_handle.graceful_shutdown(Some(Duration::from_secs(5)));
server.await.expect("server task").expect("server result");
}
#[tokio::test]
async fn graceful_shutdown_drains_cleanly() {
let cfg = RemoteModeConfig {
listen_addr: "127.0.0.1:0".parse().expect("listen_addr"),
tls: None,
..Default::default()
};
let handle = Handle::new();
let ready_handle = handle.clone();
let shutdown_handle = handle.clone();
let server = tokio::spawn(async move { aa_gateway::remote_mode::start_remote_with_handle(&cfg, handle).await });
let _addr = ready_handle.listening().await.expect("server bound");
shutdown_handle.graceful_shutdown(Some(Duration::from_secs(5)));
tokio::time::timeout(Duration::from_secs(10), server)
.await
.expect("server exited within timeout budget")
.expect("server task joined")
.expect("serve returned Ok");
}