#[path = "../../../os-virtio-status/src/lib.rs"] mod virtio_status; use virtio_status::{Error, Lifecycle, Phase}; #[test] fn os_virtio_status_positive() { let mut lifecycle = Lifecycle::new(); let claim = lifecycle.claim_reset(0, 0).unwrap(); lifecycle.advance(claim, 1, 1).unwrap(); lifecycle.advance(claim, 3, 3).unwrap(); lifecycle.advance(claim, 0xb, 0xb).unwrap(); lifecycle.observe_queue_live(claim, 1).unwrap(); lifecycle.advance(claim, 0xf, 0xf).unwrap(); assert_eq!(lifecycle.snapshot().phase, Phase::Live); assert_eq!(lifecycle.release(claim), Err(Error::StillLive)); lifecycle.observe_reset(claim, 0, 0).unwrap(); lifecycle.release(claim).unwrap(); let later = lifecycle.claim_reset(0, 0).unwrap(); assert!(later.generation > claim.generation); assert_eq!(lifecycle.advance(claim, 1, 1), Err(Error::StaleClaim)); lifecycle.release(later).unwrap(); } #[test] fn os_virtio_status_negative_and_recovery() { let mut lifecycle = Lifecycle::new(); assert_eq!(lifecycle.claim_reset(1, 0), Err(Error::NotReset)); let claim = lifecycle.claim_reset(0, 0).unwrap(); assert_eq!(lifecycle.claim_reset(0, 0), Err(Error::Full)); let initial = lifecycle.snapshot(); assert_eq!(lifecycle.advance(claim, 3, 3), Err(Error::InvalidWrite)); assert_eq!(lifecycle.snapshot(), initial); lifecycle.advance(claim, 1, 1).unwrap(); lifecycle.advance(claim, 3, 3).unwrap(); let driver = lifecycle.snapshot(); assert_eq!(lifecycle.advance(claim, 0x8, 0x8), Err(Error::InvalidWrite)); assert_eq!(lifecycle.snapshot(), driver); assert_eq!(lifecycle.advance(claim, 0xb, 3), Err(Error::Rejected)); assert_eq!(lifecycle.snapshot().phase, Phase::NeedsReset); assert_eq!(lifecycle.advance(claim, 0xf, 0xf), Err(Error::WrongPhase)); lifecycle.fail(claim, 0x83, 0x83).unwrap(); assert_eq!(lifecycle.snapshot().phase, Phase::Failed); assert_eq!(lifecycle.release(claim), Err(Error::StillLive)); assert_eq!(lifecycle.observe_reset(claim, 0, 1), Err(Error::NotReset)); assert_eq!(lifecycle.snapshot().phase, Phase::Failed); lifecycle.observe_reset(claim, 0, 0).unwrap(); lifecycle.advance(claim, 1, 1).unwrap(); lifecycle.advance(claim, 3, 3).unwrap(); lifecycle.advance(claim, 0xb, 0xb).unwrap(); assert_eq!(lifecycle.advance(claim, 0xf, 0xf), Err(Error::WrongPhase)); lifecycle.observe_queue_live(claim, 1).unwrap(); lifecycle.advance(claim, 0xf, 0xf).unwrap(); lifecycle.observe_needs_reset(claim, 0x4f).unwrap(); assert_eq!(lifecycle.snapshot().phase, Phase::NeedsReset); assert_eq!(lifecycle.release(claim), Err(Error::StillLive)); lifecycle.observe_reset(claim, 0, 0).unwrap(); lifecycle.release(claim).unwrap(); }