main
John Lauer Add pre-UAC toast guidance and verify completed Windows setup c5a1b54 1mo ago
use serde_json::{json, Value};
use std::{
    net::TcpListener,
    process::{Child, Command, Stdio},
    thread,
    time::{Duration, Instant},
};

struct Server(Child);
impl Drop for Server {
    fn drop(&mut self) {
        let _ = self.0.kill();
        let _ = self.0.wait();
    }
}

#[test]
fn loopback_health_identity_origin_and_catalog_contract() {
    let listener = TcpListener::bind("127.0.0.1:0").unwrap();
    let port = listener.local_addr().unwrap().port();
    drop(listener);
    let _server = Server(
        Command::new(env!("CARGO_BIN_EXE_codex-bridge"))
            .args(["--port", &port.to_string()])
            .env("ADOM_BIND_HOST", "127.0.0.1")
            .stdout(Stdio::null())
            .stderr(Stdio::null())
            .spawn()
            .unwrap(),
    );
    let base = format!("http://127.0.0.1:{port}");
    let agent = ureq::AgentBuilder::new()
        .timeout(Duration::from_secs(2))
        .build();
    let deadline = Instant::now() + Duration::from_secs(5);
    loop {
        if agent.get(&format!("{base}/health")).call().is_ok() {
            break;
        }
        assert!(Instant::now() < deadline);
        thread::sleep(Duration::from_millis(20));
    }
    let url = format!("{base}/command");
    let body = json!({"command":"codex_describe","args":{}});
    assert!(matches!(
        agent.post(&url).send_json(body.clone()),
        Err(ureq::Error::Status(400, _))
    ));
    assert!(matches!(
        agent
            .post(&url)
            .set("X-Adom-Caller-Thread", "test")
            .set("Origin", "https://example.com")
            .send_json(body.clone()),
        Err(ureq::Error::Status(403, _))
    ));
    let catalog: Value = agent
        .post(&url)
        .set("X-Adom-Caller-Thread", "test")
        .send_json(body)
        .unwrap()
        .into_json()
        .unwrap();
    assert_eq!(catalog["success"], true);
    assert_eq!(catalog["_beforeUac"]["command"], "notify_user");
    assert!(catalog["_setupHint"].as_str().unwrap().contains("BEFORE"));
    assert_eq!(catalog["verbs"].as_array().unwrap().len(), 40);
    let unknown: Value = agent
        .post(&url)
        .set("X-Adom-Caller-Thread", "test")
        .send_json(json!({"command":"codex_arbitrary_shell","args":{}}))
        .unwrap()
        .into_json()
        .unwrap();
    assert_eq!(unknown["success"], false);
    assert_eq!(unknown["errorCode"], "unknown_command");
}