summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock7
-rw-r--r--Cargo.toml1
-rw-r--r--Dockerfile2
-rw-r--r--tests/server_shell.rs60
4 files changed, 62 insertions, 8 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 59f908d..8c56a5a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index e9a1547..5e76338 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/Dockerfile b/Dockerfile
index f89ca10..72daa5a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -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(())
+}