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 pty_unreachable_peer_exits_with_timeout() {
let bin = filament_bin();
let connect_secs = 5;
let output = Command::new(&bin)
.env("FILAMENT_CONNECT_SECS", connect_secs.to_string())
.env("FILAMENT_CONFIG_DIR", std::env::temp_dir().join("filament-timeout-test-pty"))
.arg("pty")
.arg("definitely-unreachable-peer-12345")
.arg("--")
.arg("echo")
.arg("hi")
.output()
.expect("failed to execute filament");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!output.status.success(),
"Expected nonzero exit code, got: {:?}\nstderr: {}",
output.status,
stderr
);
assert!(
stderr.contains("can't reach"),
"Expected 'can't reach' in stderr, got: {}",
stderr
);
assert!(
stderr.contains("definitely-unreachable-peer-12345"),
"Expected peer name in stderr, got: {}",
stderr
);
}
#[test]
fn netcat_unreachable_peer_exits_with_error() {
let bin = filament_bin();
let connect_secs = 5;
let output = Command::new(&bin)
.env("FILAMENT_CONNECT_SECS", connect_secs.to_string())
.env("FILAMENT_CONFIG_DIR", std::env::temp_dir().join("filament-timeout-test-netcat"))
.arg("netcat")
.arg("definitely-unreachable-peer-12345")
.arg("8080")
.output()
.expect("failed to execute filament");
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!output.status.success(),
"Expected nonzero exit code, got: {:?}\nstderr: {}",
output.status,
stderr
);
assert!(
stderr.contains("definitely-unreachable-peer-12345"),
"Expected peer name in stderr, got: {}",
stderr
);
}
#[test]
fn pty_timeout_respects_env_var() {
let bin = filament_bin();
let connect_secs = 1;
let start = std::time::Instant::now();
let output = Command::new(&bin)
.env("FILAMENT_CONNECT_SECS", connect_secs.to_string())
.env("FILAMENT_CONFIG_DIR", std::env::temp_dir().join("filament-timeout-test-env"))
.arg("pty")
.arg("definitely-unreachable-peer-12345")
.arg("--")
.arg("echo")
.arg("hi")
.output()
.expect("failed to execute filament");
let elapsed = start.elapsed();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
elapsed.as_secs() <= connect_secs + 5,
"Expected exit within {}s, took {:?}",
connect_secs + 5,
elapsed
);
assert!(
stderr.contains("can't reach"),
"Expected 'can't reach' in stderr, got: {}",
stderr
);
}