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 --- Dockerfile | 4 +-- tests/server_shell.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 tests/server_shell.rs diff --git a/Dockerfile b/Dockerfile index 96e8186..f89ca10 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,8 @@ RUN sed -i /etc/ssh/sshd_config \ RUN adduser --shell /usr/bin/shackle shukkie && passwd -d shukkie -ARG CHANNEL=debug -COPY target/${CHANNEL}/shackle /usr/bin/shackle +ARG SHELL=target/debug/shackle +COPY ${SHELL} /usr/bin/shackle ENTRYPOINT service ssh start && bash 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