#[path = "../../../os-virtio-completions/src/lib.rs"] mod virtio_completions; use virtio_completions::{Error, Table}; #[test] fn os_virtqueue_completion_out_of_order() { let mut table = Table::<8>::new(8).unwrap(); let first = table.submit(1, 0x1000, 513).unwrap(); let second = table.submit(4, 0x2000, 513).unwrap(); let later = table.complete(4, 513, 0).unwrap(); assert_eq!(later.handle, second); assert_eq!(later.handle.owner, 0x2000); let earlier = table.complete(1, 1, 1).unwrap(); assert_eq!(earlier.handle, first); assert_eq!(earlier.handle.owner, 0x1000); assert_eq!(table.snapshot().outstanding, 0); let reused = table.submit(1, 0x3000, 513).unwrap(); assert!(reused.generation > first.generation); assert_eq!(reused.owner, 0x3000); } #[test] fn os_virtqueue_completion_rejections_and_reset() { assert!(matches!(Table::<8>::new(3), Err(Error::InvalidQueue))); let mut table = Table::<8>::new(8).unwrap(); let first = table.submit(2, 0x4000, 513).unwrap(); let before = table.snapshot(); assert_eq!(table.submit(2, 0x5000, 513), Err(Error::DuplicateHead)); assert_eq!(table.complete(7, 513, 0), Err(Error::UnknownId)); assert_eq!(table.complete(2, 514, 0), Err(Error::InvalidLength)); assert_eq!(table.complete(2, 513, 3), Err(Error::InvalidStatus)); assert_eq!(table.observe_reset(1, 0), Err(Error::NotReset)); assert_eq!(table.snapshot(), before); assert_eq!(table.complete(2, 513, 0).unwrap().handle, first); assert_eq!(table.complete(2, 513, 0), Err(Error::UnknownId)); table.submit(2, 0x6000, 513).unwrap(); table.observe_reset(0, 0).unwrap(); assert_eq!(table.snapshot().outstanding, 0); }