summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2023-03-11 21:04:18 +0200
committerJustin Wernick <justin@worthe-it.co.za>2023-03-11 21:04:18 +0200
commit5b52ed7ed242ce40cfd331a2fdb78e106413e138 (patch)
treea532b2f2698248a12d56739c52904db6d3fd7a3f /tests
parentf00b442e0ef0bcf409b4698c1bc4f48a0887eba6 (diff)
Fixed several small issues preventing ssh tests from running correctly in parallel
Diffstat (limited to 'tests')
-rw-r--r--tests/server_shell.rs60
1 files changed, 53 insertions, 7 deletions
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(())
+}