#[path = "../../../os-shared-memory/src/seal.rs"] mod seal; use seal::{Error, Permission, SealedPages}; #[test] fn os_shared_memory_seal_positive() { let mut pages = SealedPages::new(1u64, [0x1000, 0x2000]).unwrap(); for page in 0..2 { assert_eq!(pages.map(1, page, true), Ok(([0x1000, 0x2000][page], Permission::ReadWrite))); } pages.write(1, 0, 0xa5).unwrap(); pages.write(1, 1, 0x5a).unwrap(); pages.seal(1).unwrap(); let grant = pages.grant(1, 2).unwrap(); pages.acquire(2, grant).unwrap(); for page in 0..2 { assert_eq!(pages.map(2, page, false), Ok(([0x1000, 0x2000][page], Permission::ReadOnly))); } assert_eq!(pages.read(2, 0), Ok(0xa5)); assert_eq!(pages.read(2, 1), Ok(0x5a)); assert_eq!(pages.write(1, 0, 0), Err(Error::Access)); let snapshot = pages.snapshot(); assert!(snapshot.sealed); assert_eq!(snapshot.owner_maps, [Permission::ReadOnly; 2]); assert_eq!(snapshot.recipient_maps, [Permission::ReadOnly; 2]); assert_eq!(snapshot.contents, [0xa5, 0x5a]); for page in 0..2 { pages.unmap(2, page).unwrap(); pages.unmap(1, page).unwrap(); } assert_eq!(pages.snapshot().owner_maps, [Permission::Unmapped; 2]); assert_eq!(pages.snapshot().recipient_maps, [Permission::Unmapped; 2]); } #[test] fn os_shared_memory_seal_negative() { let mut pages = SealedPages::new(1u64, [0x1000, 0x2000]).unwrap(); pages.map(1, 0, true).unwrap(); pages.write(1, 0, 0x71).unwrap(); pages.seal(1).unwrap(); let before = pages.snapshot(); assert_eq!(pages.map(1, 1, true), Err(Error::Access)); assert_eq!(pages.write(1, 0, 0x72), Err(Error::Access)); assert_eq!(pages.seal(1), Err(Error::Busy)); assert_eq!(pages.snapshot(), before); assert_eq!(pages.read(1, 0), Ok(0x71)); } #[test] fn seal_unauthorized_and_invalid_requests_are_atomic() { let mut pages = SealedPages::new(1u64, [0x1000, 0x2000]).unwrap(); let before = pages.snapshot(); assert_eq!(pages.seal(3), Err(Error::Access)); assert_eq!(pages.map(3, 0, false), Err(Error::Access)); assert_eq!(pages.map(1, 2, false), Err(Error::Invalid)); assert_eq!(pages.snapshot(), before); let grant = pages.grant(1, 2).unwrap(); let before = pages.snapshot(); assert_eq!(pages.acquire(3, grant), Err(Error::Access)); assert_eq!(pages.acquire(2, seal::Grant::forge(0, 2)), Err(Error::Stale)); assert_eq!(pages.snapshot(), before); }