#[path = "../../../os-turkfs-allocation/src/lib.rs"] mod allocation; use allocation::{Bitmap, Error, TruncateFile}; fn fixture() -> (TruncateFile, Bitmap) { let bitmap = Bitmap::validate(64, 3, 3 | (1 << 10) | (1 << 20) | (1 << 30)).unwrap(); let mut bytes = [0x5a; 1536]; bytes[512..1024].fill(0x6b); bytes[1024..].fill(0x7c); (TruncateFile::new([10, 20, 30], 1025, bytes, &bitmap).unwrap(), bitmap) } #[test] fn os_turkfs_allocation_truncate_positive() { let (file, mut bitmap) = fixture(); let before = bitmap.counts(); assert_eq!(file.reader().unwrap().byte(1024), Some(0x7c)); file.truncate(100, &mut bitmap).unwrap(); assert_eq!((file.length(), file.block_count()), (100, 1)); assert_eq!(bitmap.allocated_bits(), 3 | (1 << 10)); assert_eq!(bitmap.counts().free, before.free + 2); let reader = file.reader().unwrap(); assert_eq!(reader.byte(0), Some(0x5a)); assert_eq!(reader.byte(99), Some(0x5a)); assert_eq!(reader.byte(100), None); assert_eq!(reader.byte(1024), None); assert_eq!(reader.byte(usize::MAX), None); drop(reader); file.truncate(100, &mut bitmap).unwrap(); file.truncate(0, &mut bitmap).unwrap(); assert_eq!((file.length(), file.block_count()), (0, 0)); assert_eq!(bitmap.allocated_bits(), 3); assert_eq!(file.reader().unwrap().byte(0), None); } #[test] fn os_turkfs_allocation_truncate_negative() { let (file, mut bitmap) = fixture(); let first = file.reader().unwrap(); let second = file.reader().unwrap(); let before = bitmap; assert_eq!(file.truncate(100, &mut bitmap), Err(Error::Busy)); assert_eq!(bitmap, before); assert_eq!((file.length(), file.block_count(), file.active_readers()), (1025, 3, 2)); assert_eq!(first.byte(1024), Some(0x7c)); drop(first); assert_eq!(file.truncate(0, &mut bitmap), Err(Error::Busy)); assert_eq!(second.byte(1024), Some(0x7c)); drop(second); assert_eq!(file.active_readers(), 0); assert_eq!(file.truncate(1537, &mut bitmap), Err(Error::InvalidLength)); assert_eq!(bitmap, before); let mut corrupt = bitmap; corrupt.release(30).unwrap(); let corrupt_before = corrupt; assert_eq!(file.truncate(100, &mut corrupt), Err(Error::UnownedFirstBlock)); assert_eq!(corrupt, corrupt_before); assert_eq!(file.length(), 1025); file.truncate(100, &mut bitmap).unwrap(); assert_eq!(bitmap.allocated_bits(), 3 | (1 << 10)); assert_eq!(file.reader().unwrap().byte(100), None); }