diff options
| -rw-r--r-- | src/build.rs | 2 | ||||
| -rw-r--r-- | src/package_installer.rs | 3 | ||||
| -rw-r--r-- | tests/build.rs | 20 |
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()); +} |