Codex Handbook
cli/tests/sandbox_network_proxy.rs 70 lines
#![cfg(target_os = "linux")]use std::net::TcpListener;use anyhow::Result;use tempfile::TempDir;const BWRAP_UNAVAILABLE_ERR: &str = "bubblewrap is unavailable";#[test]fn sandbox_with_network_proxy_blocks_direct_loopback_access() -> Result<()> {    let codex_home = TempDir::new()?;    let listener = TcpListener::bind("127.0.0.2:0")?;    let port = listener.local_addr()?.port();    std::fs::write(        codex_home.path().join("config.toml"),        r#"default_permissions = "network-test"[features]network_proxy = trueuse_legacy_landlock = true[permissions.network-test]extends = ":workspace"[permissions.network-test.network]enabled = truemode = "full""#,    )?;    let url = format!("http://127.0.0.2:{port}/");    let output = std::process::Command::new(codex_utils_cargo_bin::cargo_bin("codex")?)        .env("CODEX_HOME", codex_home.path())        .args([            "sandbox",            "--permissions-profile",            "network-test",            "--",            "curl",            "--noproxy",            "*",            "--silent",            "--show-error",            "--connect-timeout",            "1",            "--max-time",            "2",            url.as_str(),        ])        .output()?;    let stderr = String::from_utf8_lossy(&output.stderr);    if stderr.contains(BWRAP_UNAVAILABLE_ERR) {        eprintln!("skipping network proxy sandbox test: bubblewrap is unavailable");        return Ok(());    }    assert_eq!(        output.status.code(),        Some(7),        "expected direct loopback access to be blocked; status={:?}; stdout={}; stderr={}",        output.status.code(),        String::from_utf8_lossy(&output.stdout),        stderr,    );    Ok(())}