#[path = "../../../os-turkfs-journal/src/lib.rs"] mod journal; use journal::{Error, Kind, parse}; const GOOD: &[u8; 128] = include_bytes!("fixtures/turkfs-journal-v1.bin"); #[test] fn os_turkfs_journal_format_positive() { let transaction = parse(GOOD, 2048, 7).unwrap(); assert_eq!(transaction.sequence, 7); assert_eq!(transaction.records.map(|record| record.kind), [Kind::Inode, Kind::Bitmap, Kind::Directory]); assert_eq!(transaction.records.map(|record| record.block), [120, 128, 136]); assert_eq!(transaction.records.map(|record| record.payload), [[0x11; 16], [0x22; 16], [0x33; 16]]); } #[test] fn os_turkfs_journal_format_negative() { for length in [0, 8, 31, 32, 127] { assert_eq!(parse(&GOOD[..length], 2048, 7), Err(Error::Truncated)); } let mut extended = [0; 129]; extended[..128].copy_from_slice(GOOD); assert_eq!(parse(&extended, 2048, 7), Err(Error::Trailing)); let mut old = *GOOD; old[8] = 2; assert_eq!(parse(&old, 2048, 7), Err(Error::Version)); let mut corrupt = *GOOD; corrupt[127] ^= 1; assert_eq!(parse(&corrupt, 2048, 7), Err(Error::Checksum)); assert_eq!(parse(GOOD, 2048, 8), Err(Error::Sequence)); assert_eq!(parse(GOOD, 128, 7), Err(Error::BlockRange)); assert_eq!(parse(include_bytes!("fixtures/turkfs-journal-bad-order.bin"), 2048, 7), Err(Error::RecordOrder)); assert_eq!(parse(include_bytes!("fixtures/turkfs-journal-duplicate-block.bin"), 2048, 7), Err(Error::DuplicateBlock)); assert_eq!(parse(include_bytes!("fixtures/turkfs-journal-duplicate-kind.bin"), 2048, 7), Err(Error::DuplicateKind)); }