#[path = "../../../os-virtio-backpressure/src/lib.rs"] mod virtio_backpressure; use virtio_backpressure::{Budget, Error}; #[test] fn os_virtqueue_backpressure_limit_and_retry() { let mut budget = Budget::<8>::new(8).unwrap(); let first = budget.claim(0, 3).unwrap(); let second = budget.claim(3, 3).unwrap(); let before = budget.snapshot(); assert_eq!(budget.claim(6, 3), Err(Error::Again)); assert_eq!(budget.snapshot(), before); assert_eq!(budget.complete(0), Ok(first)); let retried = budget.claim(6, 3).unwrap(); assert_eq!(retried.descriptors, 3); assert_eq!(budget.complete(3), Ok(second)); assert_eq!(budget.complete(6), Ok(retried)); assert_eq!(budget.snapshot().used_descriptors, 0); } #[test] fn os_virtqueue_backpressure_reject_and_reset() { assert!(matches!(Budget::<8>::new(3), Err(Error::InvalidQueue))); let mut budget = Budget::<8>::new(8).unwrap(); let all = budget.claim(0, 8).unwrap(); let before = budget.snapshot(); assert_eq!(budget.claim(1, 1), Err(Error::Again)); assert_eq!(budget.claim(0, 1), Err(Error::DuplicateHead)); assert_eq!(budget.complete(7), Err(Error::UnknownHead)); assert_eq!(budget.observe_reset(1, 0), Err(Error::NotReset)); assert_eq!(budget.snapshot(), before); assert_eq!(budget.complete(0), Ok(all)); assert_eq!(budget.complete(0), Err(Error::UnknownHead)); budget.claim(1, 1).unwrap(); budget.observe_reset(0, 0).unwrap(); assert_eq!(budget.snapshot().used_descriptors, 0); }