#[path = "../../../os-vfs-ro-cache/src/lib.rs"] mod cache; fn key(inode: u64, block: u64, mount_generation: u64) -> cache::Key { cache::Key {volume: 1, mount_generation, media_generation: 3, inode, block} } #[test] fn os_vfs_ro_cache_positive() { let mut blocks = cache::Cache::new(); let first = key(2, 0, 7); let second = key(2, 1, 7); let third = key(3, 0, 7); let fourth = key(4, 0, 7); assert_eq!(blocks.insert(first, [b'A'; 16]), Ok(None)); assert_eq!(blocks.insert(second, [b'B'; 16]), Ok(None)); assert_eq!(blocks.entries().iter().flatten().count(), 2); assert_eq!(blocks.get(first), Ok(Some([b'A'; 16]))); assert_eq!(blocks.insert(third, [b'C'; 16]), Ok(Some(second))); assert_eq!(blocks.get(second), Ok(None)); assert_eq!(blocks.get(first), Ok(Some([b'A'; 16]))); assert_eq!(blocks.pin(first), Ok(())); assert_eq!(blocks.pin(third), Ok(())); let before_full = blocks; assert_eq!(blocks.insert(fourth, [b'D'; 16]), Err(cache::Error::Busy)); assert_eq!(blocks, before_full); assert_eq!(blocks.unpin(third), Ok(())); assert_eq!(blocks.insert(fourth, [b'D'; 16]), Ok(Some(third))); assert_eq!(blocks.get(first), Ok(Some([b'A'; 16]))); assert_eq!(blocks.get(fourth), Ok(Some([b'D'; 16]))); assert_eq!(blocks.unpin(first), Ok(())); assert_eq!(blocks.invalidate_mount(1, 7), Ok(2)); assert_eq!(blocks.get(first), Ok(None)); assert_eq!(blocks.get(fourth), Ok(None)); } #[test] fn os_vfs_ro_cache_negative() { let mut blocks = cache::Cache::new(); let original = key(2, 0, 7); assert_eq!(blocks.insert(original, [b'A'; 16]), Ok(None)); let stale_mount = key(2, 0, 8); let changed_media = cache::Key {media_generation: 4, ..original}; assert_eq!(blocks.get(stale_mount), Ok(None)); assert_eq!(blocks.get(changed_media), Ok(None)); assert_eq!(blocks.get(cache::Key {volume: 0, ..original}), Err(cache::Error::InvalidKey)); assert_eq!(blocks.pin(original), Ok(())); let before_pinned = blocks; assert_eq!(blocks.invalidate_mount(1, 7), Err(cache::Error::Busy)); assert_eq!(blocks, before_pinned); assert_eq!(blocks.insert(original, [b'X'; 16]), Err(cache::Error::Busy)); assert_eq!(blocks, before_pinned); assert_eq!(blocks.unpin(original), Ok(())); assert_eq!(blocks.unpin(original), Err(cache::Error::NotFound)); assert_eq!(blocks.get(original), Ok(Some([b'A'; 16]))); }