#[path = "../../../os-shared-memory/src/object.rs"] mod object; use object::{Error, Handle, SharedPages}; #[test] fn os_shared_memory_create_positive() { let mut pages = SharedPages::new(1u64, [0x1000, 0x2000]).unwrap(); let a = pages.owner_handle(1).unwrap(); let b = pages.grant(1, 2).unwrap(); pages.acquire(2, b).unwrap(); assert_eq!(a.generation(), b.generation()); for page in 0..2 { assert_eq!(pages.map(1, a, page), pages.map(2, b, page)); } let snapshot = pages.snapshot(); assert_eq!(snapshot.owner_maps, [true; 2]); assert_eq!(snapshot.recipient_maps, [true; 2]); assert_eq!(snapshot.mapped_count, 4); pages.revoke(1).unwrap(); assert_eq!(pages.snapshot().recipient_maps, [false; 2]); assert_eq!(pages.snapshot().mapped_count, 2); pages.close(1).unwrap(); assert_eq!(pages.snapshot().mapped_count, 0); assert!(pages.snapshot().closed); } #[test] fn os_shared_memory_create_negative() { let mut pages = SharedPages::new(1u64, [0x1000, 0x2000]).unwrap(); let b = pages.grant(1, 2).unwrap(); let before = pages.snapshot(); assert_eq!(pages.acquire(3, b), Err(Error::Access)); assert_eq!(pages.acquire(3, Handle::forge(1, 3)), Err(Error::Access)); assert_eq!(pages.map(3, Handle::forge(1, 3), 0), Err(Error::Access)); assert_eq!(pages.map(2, b, 0), Err(Error::Access)); assert_eq!(pages.snapshot(), before); pages.acquire(2, b).unwrap(); let before = pages.snapshot(); assert_eq!(pages.map(2, b, 2), Err(Error::Invalid)); assert_eq!(pages.map(2, Handle::forge(0, 2), 0), Err(Error::Stale)); assert_eq!(pages.snapshot(), before); assert_eq!(pages.map(2, b, 0), Ok(0x1000)); } #[test] fn invalid_backing_and_foreign_grant_are_atomic() { assert!(matches!(SharedPages::new(1u64, [0x1000, 0x1000]), Err(Error::Invalid))); let mut pages = SharedPages::new(1u64, [0x1000, 0x2000]).unwrap(); let before = pages.snapshot(); assert_eq!(pages.grant(3, 2), Err(Error::Access)); assert_eq!(pages.owner_handle(3), Err(Error::Access)); assert_eq!(pages.snapshot(), before); let b = pages.grant(1, 2).unwrap(); let before = pages.snapshot(); assert_eq!(pages.grant(1, 3), Err(Error::Busy)); assert_eq!(pages.snapshot(), before); pages.acquire(2, b).unwrap(); pages.close(1).unwrap(); assert_eq!(pages.map(2, b, 0), Err(Error::Stale)); }