fn ff_rdp_bin() -> std::path::PathBuf {
std::path::PathBuf::from(env!("CARGO_BIN_EXE_ff-rdp"))
}
#[test]
fn launch_help_exits_zero() {
let output = std::process::Command::new(ff_rdp_bin())
.args(["launch", "--help"])
.output()
.expect("failed to spawn ff-rdp");
assert!(
output.status.success(),
"expected zero exit for --help, stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("headless") || stdout.contains("Launch"),
"help output should mention launch flags: {stdout}"
);
}
#[test]
fn launch_detects_port_collision() {
let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("bind");
let port = listener.local_addr().expect("local_addr").port();
let output = std::process::Command::new(ff_rdp_bin())
.args([
"launch",
"--debug-port",
&port.to_string(),
"--temp-profile",
])
.output()
.expect("failed to spawn ff-rdp");
drop(listener);
assert!(
!output.status.success(),
"expected non-zero exit when port is in use; stderr: {}",
String::from_utf8_lossy(&output.stderr)
);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("already in use"),
"stderr must mention 'already in use'; got: {stderr}"
);
assert!(
stderr.contains("ff-rdp doctor") || stderr.contains("`ff-rdp doctor`"),
"stderr must reference `ff-rdp doctor`; got: {stderr}"
);
}
#[test]
fn help_mentions_doctor() {
let output = std::process::Command::new(ff_rdp_bin())
.arg("--help")
.output()
.expect("spawn");
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains("doctor"),
"top-level --help must mention `doctor`; got:\n{stdout}"
);
}