#[path = "../../../os-vfs-superblock/src/lib.rs"] mod superblock; fn reseal(bytes: &mut [u8; superblock::SUPERBLOCK_BYTES]) { let checksum = superblock::checksum(bytes); bytes[60..64].copy_from_slice(&checksum.to_le_bytes()); } #[test] fn os_vfs_superblock_positive() { let encoded = superblock::encode_v1(2048, 7).unwrap(); assert_eq!(&encoded[..4], b"TKFS"); assert_eq!(superblock::decode(&encoded, 2048), Ok(superblock::Superblock { version: 1, total_blocks: 2048, root_inode: 1, generation: 7 })); assert_eq!(superblock::decode(&encoded, 4096).unwrap().total_blocks, 2048); assert_eq!(superblock::decode(&encoded, 2047), Err(superblock::Error::BadGeometry)); } #[test] fn os_vfs_superblock_negative() { let valid = superblock::encode_v1(2048, 7).unwrap(); let mut wrong_version = valid; wrong_version[4..6].copy_from_slice(&2u16.to_le_bytes()); reseal(&mut wrong_version); assert_eq!(superblock::decode(&wrong_version, 4096), Err(superblock::Error::UnsupportedVersion)); let mut wrong_features = valid; wrong_features[6..8].copy_from_slice(&1u16.to_le_bytes()); reseal(&mut wrong_features); assert_eq!(superblock::decode(&wrong_features, 4096), Err(superblock::Error::UnsupportedFeatures)); let mut wrong_root = valid; wrong_root[20..28].copy_from_slice(&2u64.to_le_bytes()); reseal(&mut wrong_root); assert_eq!(superblock::decode(&wrong_root, 4096), Err(superblock::Error::BadRoot)); let mut wrong_reserved = valid; wrong_reserved[40] = 1; reseal(&mut wrong_reserved); assert_eq!(superblock::decode(&wrong_reserved, 4096), Err(superblock::Error::BadReserved)); let mut wrong_checksum = valid; wrong_checksum[60] ^= 1; assert_eq!(superblock::decode(&wrong_checksum, 4096), Err(superblock::Error::BadChecksum)); let mut wrong_magic = valid; wrong_magic[0] ^= 1; assert_eq!(superblock::decode(&wrong_magic, 4096), Err(superblock::Error::BadMagic)); assert_eq!(superblock::encode_v1(15, 7), Err(superblock::Error::BadGeometry)); assert_eq!(superblock::encode_v1(2048, 0), Err(superblock::Error::BadGeneration)); }