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 one_shot_pty_basic_output() {
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-warm-pty-test-basic"))
.arg("pty")
.arg("definitely-unreachable-peer-12345")
.arg("--")
.arg("echo")
.arg("WARM_PTY_TEST_NONCE")
.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 one_shot_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-warm-pty-test-timeout"))
.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("definitely-unreachable-peer-12345"),
"Expected peer name in stderr, got: {}",
stderr
);
}
#[test]
fn one_shot_pty_stdin_forwarding() {
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-warm-pty-test-stdin"))
.arg("pty")
.arg("definitely-unreachable-peer-12345")
.arg("--")
.arg("cat")
.stdin(std::process::Stdio::piped())
.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
);
}