#![cfg(target_os = "windows")]
use assert_cmd::Command;
use predicates::prelude::*;
#[test]
fn test_windows_localhost_trace() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["--max-hops", "1", "127.0.0.1"]);
cmd.assert()
.success()
.stdout(predicate::str::contains("127.0.0.1"));
}
#[test]
fn test_windows_icmp_mode() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["-v", "--max-hops", "1", "127.0.0.1"]);
cmd.assert()
.success()
.stderr(predicate::str::contains("Using Windows ICMP API"));
}
#[test]
fn test_windows_gateway_detection() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["--max-hops", "1", "8.8.8.8"]);
let output = cmd.output().unwrap();
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(
stdout.contains(" 1"), "Expected hop 1 in output: {}",
stdout
);
} else {
let stderr = String::from_utf8_lossy(&output.stderr);
println!("Command failed with stderr: {}", stderr);
assert!(
stderr.contains("Error") || stderr.contains("Failed"),
"Expected error message in stderr: {}",
stderr
);
}
}
#[test]
fn test_windows_json_output() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["--json", "--max-hops", "1", "127.0.0.1"]);
let output = cmd.output().unwrap();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
let json: serde_json::Value =
serde_json::from_str(&stdout).expect("Failed to parse JSON output");
assert_eq!(json["target"], "127.0.0.1");
assert_eq!(json["target_ip"], "127.0.0.1");
assert!(json["hops"].is_array());
}
#[test]
fn test_windows_dns_resolution() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["--max-hops", "1", "localhost"]);
let output = cmd.output().unwrap();
assert!(
output.status.success() || !output.stderr.is_empty(),
"Expected either success or an error message"
);
}
#[test]
fn test_windows_invalid_host() {
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.arg("invalid.host.that.does.not.exist.example");
cmd.assert()
.failure()
.stderr(predicate::str::contains("Error resolving host"));
}
#[test]
fn test_windows_timeout_handling() {
if std::env::var("GITHUB_ACTIONS").is_ok() {
eprintln!("Skipping test on GitHub Actions Windows (Azure blocks ICMP)");
return;
}
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args([
"--probe-timeout-ms",
"1", "--max-hops",
"3",
"8.8.8.8",
]);
let output = cmd.output().unwrap();
assert!(
output.status.success() || !output.stderr.is_empty(),
"Command should either succeed or fail with an error message"
);
}
#[test]
fn test_windows_asn_lookup() {
if std::env::var("GITHUB_ACTIONS").is_ok() {
eprintln!("Skipping test on GitHub Actions Windows (Azure blocks ICMP)");
return;
}
let mut cmd = Command::cargo_bin("ftr").unwrap();
cmd.args(["--max-hops", "18", "8.8.8.8"]);
let output = cmd.output().unwrap();
if output.status.success() {
let stdout = String::from_utf8_lossy(&output.stdout);
if stdout.contains("Detected ISP:") {
assert!(stdout.contains("AS"));
}
if stdout.contains("dns.google (8.8.8.8)") {
assert!(stdout.contains("AS15169") || stdout.contains("GOOGLE"));
}
} else {
let stderr = String::from_utf8_lossy(&output.stderr);
println!("ASN lookup test failed with stderr: {}", stderr);
}
}