#[path = "../../../os-virtio-indices/src/lib.rs"] mod virtio_indices; use virtio_indices::{Error, Queue}; #[test] fn os_virtqueue_indices_positive_wrap() { let mut queue = Queue::<8>::new(8).unwrap(); for sequence in 1..=u16::MAX { let ticket = queue.publish(0).unwrap(); assert_eq!(ticket.avail_index, sequence); assert_eq!(queue.observe_used(sequence, 0), Ok(ticket)); } let old = queue.snapshot(); let wrapped = queue.publish(0).unwrap(); assert_eq!(wrapped.avail_index, 0); assert!(wrapped.generation > u64::from(u16::MAX)); assert_eq!(queue.observe_used(old.used_index, 0), Err(Error::StaleObservation)); assert_eq!(queue.observe_used(0, 0), Ok(wrapped)); assert_eq!(queue.snapshot().outstanding, 0); } #[test] fn os_virtqueue_indices_negative_and_reset() { assert!(matches!(Queue::<8>::new(3), Err(Error::InvalidQueue))); let mut full = Queue::<8>::new(8).unwrap(); for head in 0..8 { full.publish(head).unwrap(); } let full_snapshot = full.snapshot(); assert_eq!(full.publish(0), Err(Error::Full)); assert_eq!(full.observe_used(9, 0), Err(Error::DeviceJump)); assert_eq!(full.snapshot(), full_snapshot); let mut queue = Queue::<8>::new(8).unwrap(); let first = queue.publish(2).unwrap(); let before = queue.snapshot(); assert_eq!(queue.publish(2), Err(Error::DuplicateHead)); assert_eq!(queue.publish(8), Err(Error::InvalidHead)); assert_eq!(queue.observe_used(2, 2), Err(Error::DeviceJump)); assert_eq!(queue.observe_used(1, 7), Err(Error::UnknownHead)); assert_eq!(queue.observe_used(1, 8), Err(Error::UnknownHead)); assert_eq!(queue.observe_reset(1, 0, 0, 0), Err(Error::NotReset)); assert_eq!(queue.snapshot(), before); assert_eq!(queue.observe_used(1, 2), Ok(first)); assert_eq!(queue.observe_used(1, 2), Err(Error::StaleObservation)); let second = queue.publish(2).unwrap(); assert!(second.generation > first.generation); queue.observe_reset(0, 0, 0, 0).unwrap(); assert_eq!(queue.snapshot().outstanding, 0); assert!(queue.publish(2).unwrap().generation > second.generation); }