use turkos_os_init_manifest::{Budget, Entry, Error, Manifest}; fn entry(id: u16, digest: u8, required_abi: u64, pages: u16, handles: u8) -> Entry { Entry { id, image_sha256: [digest; 32], required_abi, pages, handles } } fn stage(manifest: Manifest, acquisitions: &mut usize) -> Result<(), Error> { let validated = manifest.validate()?; *acquisitions += validated.entries().len(); Ok(()) } #[test] fn os_init_manifest_positive_and_boundary() { let valid = Manifest::new([ entry(1, 0x11, 1, 1, 0), entry(2, 0x22, 2, 2, 1), ], Budget { pages: 3, handles: 1 }).validate().unwrap(); assert_eq!(valid.entries().len(), 2); assert_eq!(valid.budget(), Budget { pages: 3, handles: 1 }); assert_eq!(valid.into_entries()[1].image_sha256, [0x22; 32]); assert!(matches!(Manifest::<0>::new([], Budget {pages: 0, handles: 0}) .validate(), Err(Error::Empty))); assert!(matches!(Manifest::new([entry(1, 1, 1, 1, 0); 9], Budget {pages: 9, handles: 0}).validate(), Err(Error::TooMany))); } #[test] fn os_init_manifest_rejects_identity_image_and_abi_errors() { let budget = Budget {pages: 8, handles: 8}; assert!(matches!(Manifest::new([ entry(1, 1, 1, 1, 0), entry(1, 2, 1, 1, 0)], budget) .validate(), Err(Error::Duplicate {first: 0, second: 1}))); assert!(matches!(Manifest::new([entry(0, 1, 1, 1, 0)], budget) .validate(), Err(Error::InvalidId(0)))); assert!(matches!(Manifest::new([entry(1, 0, 1, 1, 0)], budget) .validate(), Err(Error::MissingImage(0)))); assert!(matches!(Manifest::new([entry(1, 1, 3, 1, 0)], budget) .validate(), Err(Error::UnsupportedAbi(0)))); assert!(matches!(Manifest::new([entry(1, 1, 1, 0, 0)], budget) .validate(), Err(Error::ZeroPages(0)))); } #[test] fn os_init_manifest_budget_failure_keeps_inventory_unchanged() { let mut acquisitions = 0; let budget = Budget {pages: 2, handles: 0}; assert!(matches!(stage(Manifest::new([ entry(1, 1, 1, 1, 0), entry(2, 2, 1, 2, 1)], budget), &mut acquisitions), Err(Error::BudgetExceeded {pages: 3, handles: 1}))); assert_eq!(acquisitions, 0); stage(Manifest::new([entry(3, 3, 1, 1, 0)], Budget {pages: 1, handles: 0}), &mut acquisitions).unwrap(); assert_eq!(acquisitions, 1); }