Skip to content

Commit 0562ce3

Browse files
committed
test: add unit test for SplitQueueRing flag and event accessors
Signed-off-by: Nelson Wong <[email protected]>
1 parent 2cd4bd1 commit 0562ce3

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

virtio-queue/src/mock.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,3 +581,68 @@ impl<'a, M: GuestMemory> MockSplitQueue<'a, M> {
581581
Ok(())
582582
}
583583
}
584+
585+
#[cfg(test)]
586+
mod tests {
587+
use super::*;
588+
use vm_memory::{GuestAddress, GuestMemoryMmap};
589+
590+
// SplitQueueRing load/store API coverage for AvailRing (u16)
591+
#[test]
592+
fn test_avail_ring_load_store() {
593+
let mem = &GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x10000)]).unwrap();
594+
let len = 8u16;
595+
let base = GuestAddress(0x1000);
596+
let ring: AvailRing<_> = AvailRing::new(mem, base, len);
597+
598+
// flags
599+
ring.store_flags(0x55aa);
600+
assert_eq!(ring.load_flags(), 0x55aa);
601+
602+
// idx
603+
ring.store_idx(7);
604+
assert_eq!(ring.load_idx(), 7);
605+
606+
// ring entry
607+
ring.store_ring_entry(3, 0xbeef).unwrap();
608+
assert_eq!(ring.load_ring_entry(3).unwrap(), 0xbeef);
609+
610+
// event field
611+
ring.store_event(0x1234);
612+
assert_eq!(ring.load_event(), 0x1234);
613+
614+
// out-of-bounds must error
615+
assert!(matches!(
616+
ring.store_ring_entry(len as usize, 0).unwrap_err(),
617+
MockError::InvalidIndex
618+
));
619+
}
620+
621+
// SplitQueueRing load/store API coverage for UsedRing (VirtqUsedElem)
622+
#[test]
623+
fn test_used_ring_load_store() {
624+
let mem = &GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x20000)]).unwrap();
625+
let len = 8u16;
626+
let base = GuestAddress(0x3000);
627+
let ring: UsedRing<_> = UsedRing::new(mem, base, len);
628+
629+
// flags
630+
ring.store_flags(0xccdd);
631+
assert_eq!(ring.load_flags(), 0xccdd);
632+
633+
// idx
634+
ring.store_idx(2);
635+
assert_eq!(ring.load_idx(), 2);
636+
637+
// ring entry
638+
let elem = VirtqUsedElem::new(42, 0x1000);
639+
ring.store_ring_entry(0, elem).unwrap();
640+
let read = ring.load_ring_entry(0).unwrap();
641+
assert_eq!(read.id(), 42);
642+
assert_eq!(read.len(), 0x1000);
643+
644+
// event field
645+
ring.store_event(0xdead);
646+
assert_eq!(ring.load_event(), 0xdead);
647+
}
648+
}

0 commit comments

Comments
 (0)