diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/model_validation.rs | 85 | ||||
| -rw-r--r-- | tests/profile.rs | 16 |
2 files changed, 85 insertions, 16 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")); +} diff --git a/tests/profile.rs b/tests/profile.rs deleted file mode 100644 index 8fa0a24..0000000 --- a/tests/profile.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::path::Path; - -use alt_controller_image::Profile; - -#[test] -fn profile_expands_vendored_package_lists_and_discards_comments() { - let profile = Profile::load(Path::new("profiles/alt-controller.profile")) - .expect("target profile must parse"); - - assert!(profile.packages.contains(&"fakeroot".to_owned())); - assert!(profile.packages.contains(&"openssh-server".to_owned())); - assert!(profile.packages.contains(&"systemd-sysvinit".to_owned())); - assert!(profile.packages.contains(&"libiec61850".to_owned())); - assert!(!profile.packages.iter().any(|entry| entry.starts_with('#'))); - assert!(profile.regex_packages.contains(&"^kernel-(image|modules-())-(rt)$".to_owned())); -} |