From f58178da13a1a5bfa7ea783ebf7e9a9511dd3f11 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Wed, 8 Mar 2023 16:57:11 +0200 Subject: Start building the test infrastructure to launch this docker ssh daemon --- tests/server_shell.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 tests/server_shell.rs (limited to 'tests') diff --git a/tests/server_shell.rs b/tests/server_shell.rs new file mode 100644 index 0000000..bf3e1d6 --- /dev/null +++ b/tests/server_shell.rs @@ -0,0 +1,67 @@ +use anyhow::{bail, Result}; +use assert_cmd::{cargo::cargo_bin, Command}; +use rexpect::session::{spawn_command, PtySession}; +use tempfile::TempDir; + +struct TestContext { + workdir: TempDir, + ssh_port: u32, + docker_process: PtySession, +} + +fn build_docker_image() -> Result<()> { + let mut command = std::process::Command::new("docker"); + command.args([ + "build", + "-t", + "shackle-server", + "--build-arg", + &format!("SHELL={}", cargo_bin(env!("CARGO_PKG_NAME")).display()), + "./", + ]); + + let status = command.status()?; + if !status.success() { + bail!("Failed to build dockerfile"); + } + + Ok(()) +} + +fn spawn_ssh_server() -> Result { + build_docker_image()?; + + let workdir = tempfile::tempdir()?; + + let mut command = std::process::Command::new("docker"); + // TODO: randomize port? + command.args(["run", "-it", "-p", "2022:22", "shackle-server"]); + command.current_dir(&workdir); + let docker_process = spawn_command(command, Some(3000))?; + Ok(TestContext { + workdir, + ssh_port: 2022, + docker_process, + }) +} + +fn connect_to_ssh_server_interactively(c: &TestContext) -> Result { + let mut command = std::process::Command::new("ssh"); + command.args(["-p", &c.ssh_port.to_string(), "shukkie@localhost"]); + command.current_dir(&c.workdir); + let mut p = spawn_command(command, Some(3000))?; + expect_prompt(&mut p)?; + Ok(p) +} + +fn expect_prompt(p: &mut PtySession) -> Result<()> { + p.exp_string("> ")?; + Ok(()) +} + +#[test] +fn shows_a_prompt() -> Result<()> { + let c = spawn_ssh_server()?; + connect_to_ssh_server_interactively(&c)?; + Ok(()) +} -- cgit v1.2.3