diff options
-rw-r--r-- | Cargo.lock | 7 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | Dockerfile | 2 | ||||
-rw-r--r-- | tests/server_shell.rs | 60 |
4 files changed, 62 insertions, 8 deletions
@@ -134,6 +134,12 @@ dependencies = [ ] [[package]] +name = "get-port" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888123007db34fbff15b5a347d46364dfbad531d6cb43de52cc0b62558f570e2" + +[[package]] name = "git2" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -423,6 +429,7 @@ version = "0.1.0" dependencies = [ "anyhow", "assert_cmd", + "get-port", "git2", "nom", "rexpect", @@ -14,4 +14,5 @@ thiserror = "1.0.38" [dev-dependencies] anyhow = "1.0.69" assert_cmd = "2.0.8" +get-port = "4.0.0" tempfile = "3.4.0" @@ -16,7 +16,7 @@ RUN adduser --shell /usr/bin/shackle shukkie && passwd -d shukkie ARG SHELL=target/debug/shackle COPY ${SHELL} /usr/bin/shackle -ENTRYPOINT service ssh start && bash +ENTRYPOINT service ssh start && echo "Ready" && bash # docker build -t shackle-server --build-arg CHANNEL=release ./ # docker run -it -p 2022:22 shackle-server 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<TestContext> { 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<PtySession> { 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(()) +} |