#[path = "../../../os-turkfs-journal/src/ordering.rs"] mod ordering; use ordering::{Block, Device, Error, State, Writer}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum Event { Write(u64, u8), Flush } struct Disk { events: Vec, fail_at: Option } impl Disk { fn push(&mut self, event: Event) -> Result<(), ()> { let index = self.events.len(); self.events.push(event); if self.fail_at == Some(index) { Err(()) } else { Ok(()) } } } impl Device for Disk { fn write(&mut self, lba: u64, bytes: &Block) -> Result<(), ()> { self.push(Event::Write(lba, bytes[0])) } fn flush(&mut self) -> Result<(), ()> { self.push(Event::Flush) } } #[test] fn os_turkfs_journal_ordering_positive() { let mut disk = Disk {events: Vec::new(), fail_at: None}; let mut writer = Writer::new(); writer.execute(&mut disk, &[0x44; 512], &[0x55; 512], &[0x66; 512]).unwrap(); assert_eq!(disk.events, [Event::Write(120, 0x44), Event::Flush, Event::Write(112, 0x55), Event::Flush, Event::Write(113, 0x66), Event::Flush]); assert_eq!(writer.state(), State::Published); assert!(writer.published()); assert_eq!(writer.execute(&mut disk, &[0; 512], &[0; 512], &[0; 512]), Err(Error::Order)); assert_eq!(disk.events.len(), 6); } #[test] fn os_turkfs_journal_ordering_negative() { let mut fresh = Writer::new(); let before = fresh; assert_eq!(fresh.publish(), Err(Error::Order)); assert_eq!(fresh, before); for failure in 0..6 { let mut disk = Disk {events: Vec::new(), fail_at: Some(failure)}; let mut writer = Writer::new(); assert_eq!(writer.execute(&mut disk, &[0x44; 512], &[0x55; 512], &[0x66; 512]), Err(Error::Io)); assert_eq!(disk.events.len(), failure + 1); assert_eq!(writer.state(), State::Failed); assert!(!writer.published()); assert_eq!(writer.publish(), Err(Error::Order)); assert_eq!(writer.execute(&mut disk, &[0; 512], &[0; 512], &[0; 512]), Err(Error::Order)); assert_eq!(disk.events.len(), failure + 1); } }