summaryrefslogtreecommitdiff
path: root/tests/model_validation.rs
diff options
context:
space:
mode:
authorHermes Agent <hermes@localhost>2026-08-12 00:02:26 +0000
committerHermes Agent <hermes@localhost>2026-08-12 00:02:26 +0000
commit25f39c857da591c665865b77483b79495caf5e00 (patch)
tree1e7dd7118fcd1978b13c8bd1aa6cb202bb72a32a /tests/model_validation.rs
parent1860cc5beb8df6e85d0f9690e5852709a534ebd7 (diff)
Replace legacy profile parser with typed image spec
Diffstat (limited to 'tests/model_validation.rs')
-rw-r--r--tests/model_validation.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/model_validation.rs b/tests/model_validation.rs
new file mode 100644
index 0000000..5134a6f
--- /dev/null
+++ b/tests/model_validation.rs
@@ -0,0 +1,85 @@
+use std::fs;
+
+use alt_controller_image::{BuildPlan, ImageSpec, OutputFormat};
+
+fn write_spec(contents: &str) -> tempfile::TempDir {
+ let directory = tempfile::tempdir().expect("temporary spec directory");
+ fs::write(directory.path().join("image.toml"), contents).expect("write spec");
+ directory
+}
+
+fn load(contents: &str) -> anyhow::Result<ImageSpec> {
+ let directory = write_spec(contents);
+ ImageSpec::load(&directory.path().join("image.toml"))
+}
+
+const VALID_SPEC: &str = r#"
+[target]
+name = "alt-controller"
+architecture = "x86_64"
+format = "tar"
+
+[kernel]
+flavour = "rt"
+
+[boot]
+initrd_features = ["rootfs"]
+initrd_modules = ["ext4", "virtio_blk.ko"]
+
+[packages]
+base = ["basesystem"]
+selectors = ["^kernel-image-rt$"]
+"#;
+
+#[test]
+fn parses_a_typed_image_spec() {
+ let spec = load(VALID_SPEC).expect("valid spec");
+
+ assert_eq!(spec.target.name, "alt-controller");
+ assert_eq!(spec.target.architecture.as_str(), "x86_64");
+ assert_eq!(spec.target.format, OutputFormat::Tar);
+ assert_eq!(spec.packages.selectors[0].as_str(), "^kernel-image-rt$");
+}
+
+#[test]
+fn compiles_a_validated_spec_into_an_immutable_build_plan() {
+ let spec = load(VALID_SPEC).expect("valid spec");
+ let plan = BuildPlan::compile(spec).expect("plan compiles");
+
+ assert_eq!(plan.spec().target.name, "alt-controller");
+}
+
+#[test]
+fn rejects_an_unknown_target_format() {
+ let error = load(&VALID_SPEC.replace("format = \"tar\"", "format = \"iso\""))
+ .expect_err("unsupported format must fail");
+
+ assert!(format!("{error:#}").contains("unsupported output format"));
+}
+
+#[test]
+fn rejects_an_unsupported_architecture() {
+ let error = load(&VALID_SPEC.replace("x86_64", "aarch64"))
+ .expect_err("unsupported architecture must fail");
+
+ assert!(format!("{error:#}").contains("unsupported architecture"));
+}
+
+#[test]
+fn rejects_duplicate_package_selectors() {
+ let error = load(&VALID_SPEC.replace(
+ "selectors = [\"^kernel-image-rt$\"]",
+ "selectors = [\"^kernel-image-rt$\", \"^kernel-image-rt$\"]",
+ ))
+ .expect_err("duplicate selector must fail");
+
+ assert!(format!("{error:#}").contains("duplicate package selector"));
+}
+
+#[test]
+fn rejects_an_invalid_initrd_module_name() {
+ let error = load(&VALID_SPEC.replace("\"virtio_blk.ko\"", "\"../virtio_blk.ko\""))
+ .expect_err("unsafe module name must fail");
+
+ assert!(format!("{error:#}").contains("invalid initrd module"));
+}