From 5b52ed7ed242ce40cfd331a2fdb78e106413e138 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Sat, 11 Mar 2023 21:04:18 +0200 Subject: Fixed several small issues preventing ssh tests from running correctly in parallel --- tests/server_shell.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'tests') diff --git a/tests/server_shell.rs b/tests/server_shell.rs index e727044..323fe5f 100644 --- a/tests/server_shell.rs +++ b/tests/server_shell.rs @@ -1,5 +1,6 @@ use anyhow::Result; -use assert_cmd::cargo::cargo_bin; +use assert_cmd::{cargo::cargo_bin, Command}; +use get_port::{tcp::TcpPort, Ops}; use rexpect::session::{spawn_command, PtySession}; use std::{io, path, sync::Once}; use tempfile::TempDir; @@ -10,10 +11,16 @@ static mut BUILD_DOCKER_RESULT: Result<(), DockerBuildError> = Ok(()); struct TestContext { workdir: TempDir, - ssh_port: u32, + ssh_port: u16, docker_process: PtySession, } +impl Drop for TestContext { + fn drop(&mut self) { + self.docker_process.send_line("exit").unwrap(); + } +} + #[derive(Error, Debug, Clone)] pub enum DockerBuildError { #[error(transparent)] @@ -69,21 +76,35 @@ fn spawn_ssh_server() -> Result { let workdir = tempfile::tempdir()?; + let ssh_port = TcpPort::any("127.0.0.1").unwrap(); + let mut command = std::process::Command::new("docker"); - // TODO: randomize port? - command.args(["run", "-it", "-p", "2022:22", "shackle-server"]); + command.args([ + "run", + "-it", + "-p", + &format!("{}:22", ssh_port), + "shackle-server", + ]); command.current_dir(&workdir); - let docker_process = spawn_command(command, Some(3000))?; + let mut docker_process = spawn_command(command, Some(3000))?; + docker_process.exp_string("Ready")?; Ok(TestContext { workdir, - ssh_port: 2022, + ssh_port, 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.args([ + "-p", + &c.ssh_port.to_string(), + "shukkie@localhost", + "-o", + "StrictHostKeyChecking=false", + ]); command.current_dir(&c.workdir); let mut p = spawn_command(command, Some(3000))?; expect_prompt(&mut p)?; @@ -95,9 +116,34 @@ fn expect_prompt(p: &mut PtySession) -> Result<()> { Ok(()) } +fn make_new_repo(c: &TestContext, repo_name: &str) -> Result<()> { + let mut p = connect_to_ssh_server_interactively(&c)?; + p.send_line(&format!("git-init {}", repo_name))?; + expect_prompt(&mut p)?; + p.send_line("exit")?; + p.exp_eof()?; + Ok(()) +} + #[test] fn shows_a_prompt() -> Result<()> { let c = spawn_ssh_server()?; connect_to_ssh_server_interactively(&c)?; Ok(()) } + +#[test] +fn git_clone_works_with_an_empty_repo() -> Result<()> { + let c = spawn_ssh_server()?; + let repo_name = "my-new-repo"; + make_new_repo(&c, repo_name)?; + + Command::new("git") + .arg("clone") + .arg(&format!("shukkie@localhost:2022:{}.git", repo_name)) + .current_dir(&c.workdir) + .assert() + .success(); + + Ok(()) +} -- cgit v1.2.3