summaryrefslogtreecommitdiff
path: root/tests/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/build.rs')
-rw-r--r--tests/build.rs91
1 files changed, 91 insertions, 0 deletions
diff --git a/tests/build.rs b/tests/build.rs
new file mode 100644
index 0000000..fd919a0
--- /dev/null
+++ b/tests/build.rs
@@ -0,0 +1,91 @@
+use std::cell::RefCell;
+use std::fs;
+
+use alt_controller_image::build::BuildExecutor;
+use alt_controller_image::initramfs::{InitramfsBuilder, InitramfsRequest, InitramfsResult};
+use alt_controller_image::manifest::ArtifactManifest;
+use alt_controller_image::package_installer::{PackageInstaller, PackageRequest};
+use alt_controller_image::{BuildPlan, ImageSpec};
+use tempfile::tempdir;
+
+#[derive(Default)]
+struct FixtureInstaller {
+ requests: RefCell<Vec<PackageRequest>>,
+}
+
+impl PackageInstaller for FixtureInstaller {
+ fn install(&self, request: &PackageRequest) -> anyhow::Result<()> {
+ self.requests.borrow_mut().push(request.clone());
+ let boot = request.workdir().join("chroot/boot");
+ fs::create_dir_all(&boot)?;
+ fs::write(boot.join("vmlinuz-6.12.0-rt1"), "kernel")?;
+ Ok(())
+ }
+}
+
+#[derive(Default)]
+struct FixtureInitramfsBuilder;
+
+impl InitramfsBuilder for FixtureInitramfsBuilder {
+ fn build(&mut self, request: &InitramfsRequest) -> anyhow::Result<InitramfsResult> {
+ fs::write(
+ request
+ .rootfs()
+ .join(format!("boot/initrd-{}.img", request.kernel().as_str())),
+ "initrd",
+ )?;
+ InitramfsResult::from_rootfs(request.rootfs(), request.kernel())
+ }
+}
+
+#[test]
+fn executes_the_native_build_stages_and_writes_a_companion_manifest() {
+ 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 artifact = fixture.path().join("out/controller.tar");
+
+ let result = executor
+ .execute(&plan, &workspace, "profiles/apt.conf", &artifact)
+ .expect("execute native build");
+
+ assert_eq!(installer.requests.borrow().len(), 1);
+ assert_eq!(result.artifact(), artifact);
+ assert_eq!(
+ fs::read_to_string(workspace.join("chroot/etc/initrd.mk.oem")).expect("read OEM recipe"),
+ "FEATURES += add-modules cleanup compress qemu rdshell rootfs usb\nMODULES += ahci.ko ahci_platform.ko ext4 sd_mod.ko virtio_blk.ko virtio_net.ko virtio_pci.ko\n"
+ );
+ assert!(artifact.is_file());
+ let manifest = ArtifactManifest::load(result.manifest()).expect("load companion manifest");
+ let initrd = result.initrd().expect("initrd result");
+ assert_eq!(
+ manifest.initrd,
+ Some(alt_controller_image::manifest::InitrdRecord::new(
+ initrd.initrd_path().display().to_string(),
+ initrd.sha256(),
+ ))
+ );
+}
+
+#[test]
+fn refuses_to_reuse_an_existing_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("existing-work");
+ fs::create_dir(&workspace).expect("create existing workspace");
+
+ let error = executor
+ .execute(&plan, &workspace, "profiles/apt.conf", fixture.path().join("image.tar"))
+ .expect_err("existing workspace must be rejected");
+
+ assert!(error.to_string().contains("workspace already exists"));
+ assert!(installer.requests.borrow().is_empty());
+}