#[path = "../../../os-turkfs-open-unlink/src/lib.rs"] mod lifetime; use lifetime::{Error, File}; fn payload() -> [u8; 1300] { let mut data = [0x5a; 1300]; data[512..1024].fill(0x6b); data[1024..].fill(0x7c); data } #[test] fn os_turkfs_namespace_unlink_positive() { let file = File::new(b"file", [10, 20, 30], payload()).unwrap(); let first = file.open(b"file").unwrap(); let second = file.open(b"file").unwrap(); let bits = file.ownership().blocks; let mut before = [0xa5; 1301]; assert_eq!(first.read_all(&mut before), Ok(1300)); file.unlink(b"file").unwrap(); assert!(!file.lookup(b"file")); assert!(matches!(file.open(b"file"), Err(Error::NotFound))); assert_eq!(file.ownership().blocks, bits); assert_eq!(file.ownership().readers, 2); let mut after = [0xa5; 1301]; assert_eq!(first.read_all(&mut after), Ok(1300)); assert_eq!(after, before); drop(first); assert_eq!(file.ownership().blocks, bits); assert_eq!(file.ownership().readers, 1); assert_eq!(second.read_all(&mut after), Ok(1300)); assert_eq!(&after[..1300], &payload()); assert_eq!(after[1300], 0xa5); drop(second); assert_eq!(file.ownership().blocks, 0); assert_eq!(file.ownership().readers, 0); } #[test] fn os_turkfs_namespace_unlink_negative() { let file = File::new(b"file", [10, 20, 30], payload()).unwrap(); let before = file.ownership(); assert_eq!(file.unlink(b"wrong"), Err(Error::NotFound)); assert_eq!(file.ownership(), before); let reader = file.open(b"file").unwrap(); let mut short = [0xa5; 1299]; assert_eq!(reader.read_all(&mut short), Err(Error::BufferTooSmall)); assert_eq!(short, [0xa5; 1299]); file.unlink(b"file").unwrap(); let unlinked = file.ownership(); assert_ne!(unlinked.blocks, 0); assert_eq!(file.unlink(b"file"), Err(Error::NotFound)); assert_eq!(file.ownership(), unlinked); let mut output = [0; 1300]; reader.read_all(&mut output).unwrap(); assert_eq!(output, payload()); drop(reader); assert_eq!(file.ownership().blocks, 0); let closed = File::new(b"file", [10, 20, 30], payload()).unwrap(); drop(closed.open(b"file").unwrap()); assert!(closed.lookup(b"file")); assert_ne!(closed.ownership().blocks, 0); closed.unlink(b"file").unwrap(); assert_eq!(closed.ownership().blocks, 0); assert!(matches!(File::new(b"file", [10, 10, 30], payload()), Err(Error::InvalidBlocks))); }