eggress-cli 1.0.3

CLI binary for the eggress multi-protocol proxy
use std::process::Command;

fn eggress_bin() -> Command {
    let mut cmd = Command::new(env!("CARGO_BIN_EXE_eggress"));
    cmd.env("RUST_LOG", "error");
    cmd
}

#[test]
fn test_exit_code_cli_parse_error() {
    let output = eggress_bin()
        .arg("--nonexistent-flag")
        .output()
        .expect("failed to run eggress");
    assert_eq!(
        output.status.code(),
        Some(2),
        "expected exit code 2 (CLI parse error), got {:?}\nstderr: {}",
        output.status.code(),
        String::from_utf8_lossy(&output.stderr),
    );
}

#[test]
fn test_exit_code_config_validation() {
    let output = eggress_bin()
        .args(["--config", "/nonexistent/path.toml"])
        .output()
        .expect("failed to run eggress");
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        output.status.code() != Some(0),
        "expected non-zero exit for missing config, got 0\nstderr: {stderr}",
    );
    assert!(
        stderr.contains("error") || stderr.contains("No such file"),
        "expected error about missing file, got: {stderr}",
    );
}

#[test]
fn test_exit_code_unsupported_legacy_cipher() {
    let output = eggress_bin()
        .args([
            "pproxy",
            "translate",
            "--",
            "-l",
            "ss://aes-256-ctr:secret@proxy:8388",
        ])
        .output()
        .expect("failed to run eggress");
    assert_eq!(
        output.status.code(),
        Some(5),
        "expected exit code 5 (unsupported legacy cipher), got {:?}\nstderr: {}",
        output.status.code(),
        String::from_utf8_lossy(&output.stderr),
    );
    let stderr = String::from_utf8_lossy(&output.stderr);
    assert!(
        stderr.contains("unsupported") || stderr.contains("ssr"),
        "expected unsupported/cipher message in stderr, got: {stderr}",
    );
}

#[test]
fn test_exit_code_success() {
    let output = eggress_bin()
        .args([
            "pproxy",
            "translate",
            "--",
            "-l",
            "socks5://127.0.0.1:1080",
            "-r",
            "http://127.0.0.1:8080",
        ])
        .output()
        .expect("failed to run eggress");
    assert_eq!(
        output.status.code(),
        Some(0),
        "expected exit code 0 (success), got {:?}\nstderr: {}",
        output.status.code(),
        String::from_utf8_lossy(&output.stderr),
    );
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(
        stdout.contains("listeners"),
        "expected TOML output with listeners, got: {stdout}",
    );
}

#[test]
fn test_exit_code_check_bounded_ssr_still_zero() {
    let output = eggress_bin()
        .args([
            "pproxy",
            "check",
            "--",
            "-l",
            "ssr://aes-256-ctr:secret@proxy:8388",
        ])
        .output()
        .expect("failed to run eggress");
    assert_eq!(
        output.status.code(),
        Some(0),
        "expected exit code 0 (check reports, doesn't fail), got {:?}\nstderr: {}",
        output.status.code(),
        String::from_utf8_lossy(&output.stderr),
    );
    let stdout = String::from_utf8_lossy(&output.stdout);
    assert!(
        stdout.contains("Compatible") || stdout.contains("warning"),
        "expected parity report mentioning bounded SSR compatibility, got: {stdout}",
    );
}