summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/build.rs2
-rw-r--r--src/package_installer.rs3
-rw-r--r--tests/build.rs20
3 files changed, 24 insertions, 1 deletions
diff --git a/src/build.rs b/src/build.rs
index 4439d2f..42c57ef 100644
--- a/src/build.rs
+++ b/src/build.rs
@@ -50,9 +50,9 @@ impl<I: PackageInstaller, B: InitramfsBuilder> BuildExecutor<I, B> {
bail!("artifact parent is not a directory: {}", parent.display());
}
+ let request = plan.package_request(workspace, apt_config)?;
std::fs::create_dir_all(workspace)
.with_context(|| format!("create workspace {}", workspace.display()))?;
- let request = plan.package_request(workspace, apt_config)?;
self.installer.install(&request)?;
let rootfs = workspace.join("chroot");
diff --git a/src/package_installer.rs b/src/package_installer.rs
index c5c6451..03e429f 100644
--- a/src/package_installer.rs
+++ b/src/package_installer.rs
@@ -11,6 +11,9 @@ impl AptConfig {
if path.as_os_str().is_empty() || path.is_dir() {
bail!("APT configuration must be a file path: {}", path.display());
}
+ if !path.is_file() {
+ bail!("APT configuration does not exist or is not a regular file: {}", path.display());
+ }
Ok(Self(path.to_path_buf()))
}
diff --git a/tests/build.rs b/tests/build.rs
index fd919a0..d278bce 100644
--- a/tests/build.rs
+++ b/tests/build.rs
@@ -89,3 +89,23 @@ fn refuses_to_reuse_an_existing_workspace() {
assert!(error.to_string().contains("workspace already exists"));
assert!(installer.requests.borrow().is_empty());
}
+
+#[test]
+fn rejects_a_missing_apt_configuration_before_creating_the_workspace() {
+ let fixture = tempdir().expect("fixture directory");
+ let spec = ImageSpec::load(std::path::Path::new("profiles/alt-controller.toml"))
+ .expect("load controller spec");
+ let plan = BuildPlan::compile(spec).expect("compile build plan");
+ let installer = FixtureInstaller::default();
+ let mut executor = BuildExecutor::new(&installer, FixtureInitramfsBuilder);
+ let workspace = fixture.path().join("work");
+ let missing_apt_config = fixture.path().join("missing-apt.conf");
+
+ let error = executor
+ .execute(&plan, &workspace, &missing_apt_config, fixture.path().join("image.tar"))
+ .expect_err("missing APT configuration must be rejected");
+
+ assert!(error.to_string().contains("APT configuration does not exist"));
+ assert!(!workspace.exists());
+ assert!(installer.requests.borrow().is_empty());
+}