fn alba() -> assert_cmd::Command {
assert_cmd::Command::cargo_bin("alba").unwrap()
}
fn project(beamfile: &str) -> tempfile::TempDir {
let dir = tempfile::tempdir().unwrap();
std::fs::write(dir.path().join("Beamfile"), beamfile).unwrap();
dir
}
fn beam_name(suffix: &str) -> String {
format!("cli_docker_it_{suffix}_{}", std::process::id())
}
struct ContainerGuard {
label: String,
}
impl ContainerGuard {
fn new(beam: &str) -> Self {
Self {
label: beam.to_string(),
}
}
}
impl Drop for ContainerGuard {
fn drop(&mut self) {
let Ok(output) = std::process::Command::new("docker")
.args([
"ps",
"-aq",
"--filter",
&format!("label=alba.beam={}", self.label),
])
.output()
else {
return;
};
for id in String::from_utf8_lossy(&output.stdout).split_whitespace() {
let _ = std::process::Command::new("docker")
.args(["rm", "-f", id])
.output();
}
}
}
#[test]
#[ignore = "requires a running docker daemon"]
fn a_docker_beam_runs_its_command_in_the_image() {
let beam = beam_name("hello");
let _guard = ContainerGuard::new(&beam);
let dir = project(&format!(
"beam {beam} {{\n executor docker {{ image \"alpine:3\" }}\n run \"echo hello from a container\"\n}}\n"
));
alba()
.current_dir(&dir)
.args(["run", &beam])
.assert()
.success()
.stdout(predicates::str::contains("hello from a container"));
}
#[test]
#[ignore = "requires a running docker daemon"]
fn the_docker_mount_reaches_the_beamfiles_own_directory() {
let beam = beam_name("project_mount");
let _guard = ContainerGuard::new(&beam);
let dir = project(&format!(
"beam {beam} {{\n executor docker {{ image \"alpine:3\" }}\n run \"cat hello.txt\"\n}}\n"
));
std::fs::write(dir.path().join("hello.txt"), "hi from the host").unwrap();
alba()
.current_dir(&dir)
.args(["run", &beam])
.assert()
.success()
.stdout(predicates::str::contains("hi from the host"));
}
#[test]
#[ignore = "requires a running docker daemon"]
fn a_missing_image_fails_the_beam_not_the_run_machinery() {
let beam = beam_name("missing_image");
let _guard = ContainerGuard::new(&beam);
let dir = project(&format!(
"beam {beam} {{\n executor docker {{ image \"alba-definitely-does-not-exist:latest\" }}\n run \"echo unreachable\"\n}}\n"
));
alba()
.current_dir(&dir)
.args(["run", &beam])
.assert()
.code(1)
.stdout(predicates::str::contains(beam.as_str()))
.stderr(predicates::str::contains("1 failed"));
}