diff options
| author | Hermes Agent <hermes@localhost> | 2026-08-12 01:16:54 +0000 |
|---|---|---|
| committer | Hermes Agent <hermes@localhost> | 2026-08-12 01:16:54 +0000 |
| commit | 9a07a0e20b88838d22bb04fae80b2353d41b2cd0 (patch) | |
| tree | e01de934f6c14a3bd5efc1fa37d92b0a1ab86be7 /tests/initramfs.rs | |
| parent | 915fcc5efbf45d8adee870cfbe2a25e466454a2f (diff) | |
Add native initramfs stage adapter
Diffstat (limited to 'tests/initramfs.rs')
| -rw-r--r-- | tests/initramfs.rs | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/initramfs.rs b/tests/initramfs.rs new file mode 100644 index 0000000..b15c54f --- /dev/null +++ b/tests/initramfs.rs @@ -0,0 +1,83 @@ +use std::fs; +use std::path::Path; + +use alt_controller_image::initramfs::{ + CommandRunner, InitramfsBuilder, InitramfsRecipe, InitramfsRequest, Invocation, KernelVersion, + MakeInitrdBuilder, +}; +use tempfile::tempdir; + +#[test] +fn discovers_the_single_rt_kernel_and_renders_a_sorted_oem_recipe() { + let rootfs = tempdir().expect("rootfs directory"); + fs::create_dir(rootfs.path().join("boot")).expect("boot directory"); + fs::write(rootfs.path().join("boot/vmlinuz-6.12.8-alt1.rt1"), "kernel") + .expect("RT kernel"); + fs::write(rootfs.path().join("boot/vmlinuz-6.12.8-alt1.std"), "kernel") + .expect("non-RT kernel"); + + let kernel = KernelVersion::discover_rt(rootfs.path()).expect("discover RT kernel"); + assert_eq!(kernel.as_str(), "6.12.8-alt1.rt1"); + assert_eq!( + InitramfsRecipe::new(["rootfs", "compress"], ["virtio_blk.ko", "ext4"]) + .expect("valid recipe") + .render(), + "FEATURES += compress rootfs\nMODULES += ext4 virtio_blk.ko\n" + ); +} + +#[test] +fn diagnoses_missing_or_ambiguous_rt_kernels() { + let rootfs = tempdir().expect("rootfs directory"); + fs::create_dir(rootfs.path().join("boot")).expect("boot directory"); + let missing = KernelVersion::discover_rt(rootfs.path()).expect_err("missing RT kernel"); + assert!(missing.to_string().contains("no RT kernel image")); + + fs::write(rootfs.path().join("boot/vmlinuz-6.12-rt1"), "kernel").expect("first RT kernel"); + fs::write(rootfs.path().join("boot/vmlinuz-6.11-rt1"), "kernel").expect("second RT kernel"); + let ambiguous = KernelVersion::discover_rt(rootfs.path()).expect_err("ambiguous RT kernel"); + assert!(ambiguous.to_string().contains("multiple RT kernel images")); +} + +#[test] +fn make_initrd_adapter_uses_typed_chroot_arguments_and_records_output_digest() { + let rootfs = tempdir().expect("rootfs directory"); + fs::create_dir(rootfs.path().join("boot")).expect("boot directory"); + fs::write(rootfs.path().join("boot/vmlinuz-6.12-rt1"), "kernel").expect("RT kernel"); + fs::write(rootfs.path().join("boot/initrd-6.12-rt1.img"), b"generated initrd") + .expect("generated initrd"); + let request = InitramfsRequest::discover(rootfs.path()).expect("initramfs request"); + let mut builder = MakeInitrdBuilder::new(RecordingRunner::default()); + + let result = builder.build(&request).expect("build initramfs"); + + assert_eq!( + builder.runner().invocations, + vec![Invocation::new( + "chroot", + [ + rootfs.path().as_os_str().to_owned(), + "make-initrd".into(), + "-k".into(), + "6.12-rt1".into(), + ], + )] + ); + assert_eq!(result.initrd_path(), Path::new("boot/initrd-6.12-rt1.img")); + assert_eq!( + result.sha256(), + "aec42bc86f526931d7c7f01ecba8d643dbb748f9102539a99db5d4855ee4435f" + ); +} + +#[derive(Debug, Default)] +struct RecordingRunner { + invocations: Vec<Invocation>, +} + +impl CommandRunner for RecordingRunner { + fn run(&mut self, invocation: Invocation) -> anyhow::Result<()> { + self.invocations.push(invocation); + Ok(()) + } +} |