use std::process::Command;
fn filament_bin() -> std::path::PathBuf {
let mut path = std::env::current_exe().unwrap();
path.pop(); path.pop(); path.push("filament");
path
}
#[test]
fn proxy_help_shows_http_port_flag() {
let bin = filament_bin();
let output = Command::new(&bin)
.arg("proxy")
.arg("--help")
.output()
.expect("failed to execute filament");
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("--http-port"),
"Expected --http-port flag in help output, got: {}",
&stdout[..stdout.len().min(500)]
);
}
#[test]
fn proxy_http_port_zero_disables() {
let bin = filament_bin();
let mut child = Command::new(&bin)
.env("FILAMENT_CONFIG_DIR", std::env::temp_dir().join("filament-proxy-test-disabled"))
.arg("proxy")
.arg("--http-port")
.arg("0")
.arg("--port")
.arg("19999")
.stdin(std::process::Stdio::null())
.spawn()
.expect("failed to start filament proxy");
std::thread::sleep(std::time::Duration::from_millis(500));
let _ = child.kill();
let output = child.wait_with_output().expect("failed to wait for child");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!stderr.contains("HTTP CONNECT proxy"),
"Expected no HTTP proxy message when http_port=0, got: {}",
stderr
);
}
#[test]
fn pac_file_returns_correct_socks_port() {
let bin = filament_bin();
let socks_port = 1081; let http_port = 18081;
let config_dir = std::env::temp_dir().join("filament-proxy-pac-test");
let mut child = Command::new(&bin)
.env("FILAMENT_CONFIG_DIR", &config_dir)
.arg("proxy")
.arg("--port")
.arg(socks_port.to_string())
.arg("--http-port")
.arg(http_port.to_string())
.stdin(std::process::Stdio::null())
.spawn()
.expect("failed to start filament proxy");
std::thread::sleep(std::time::Duration::from_millis(500));
let pac_url = format!("http://127.0.0.1:{http_port}/proxy.pac");
let output = std::process::Command::new("curl")
.arg("-s")
.arg(&pac_url)
.output()
.expect("failed to run curl");
let _ = child.kill();
let _ = child.wait();
let pac_content = String::from_utf8_lossy(&output.stdout);
assert!(
pac_content.contains(&format!("SOCKS5 127.0.0.1:{socks_port}")),
"PAC should contain 'SOCKS5 127.0.0.1:{socks_port}' (configured port), got: {}",
pac_content
);
assert!(
!pac_content.contains("SOCKS5 127.0.0.1:1080"),
"PAC should NOT contain hardcoded port 1080, got: {}",
pac_content
);
assert!(pac_content.contains("FindProxyForURL"), "PAC should contain FindProxyForURL");
assert!(pac_content.contains(".mesh"), "PAC should handle .mesh domains");
}