mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
vm-virtio: checked_descriptor: Introduce unit_tests module
Add a unit_tests module with the first test for CheckedDescriptorIter, covering the happy path where a valid single descriptor is yielded and the iterator reports no failure. Wire up the virtio-bindings dev dependency and local test helpers needed by the test. Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
This commit is contained in:
committed by
Rob Bradford
parent
2bf5464f92
commit
d24e2fd140
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -2693,6 +2693,7 @@ name = "vm-virtio"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
|
"virtio-bindings",
|
||||||
"virtio-queue",
|
"virtio-queue",
|
||||||
"vm-memory",
|
"vm-memory",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -19,3 +19,6 @@ vm-memory = { workspace = true, features = [
|
|||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
virtio-bindings = { workspace = true }
|
||||||
|
|||||||
@@ -176,3 +176,56 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod unit_tests {
|
||||||
|
use virtio_bindings::virtio_ring::VRING_DESC_F_WRITE;
|
||||||
|
use virtio_queue::{Queue, QueueT};
|
||||||
|
use vm_memory::bitmap::AtomicBitmap;
|
||||||
|
use vm_memory::{GuestAddress, GuestAddressSpace, GuestMemoryAtomic, GuestMemoryMmap};
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use crate::queue::testing::VirtQueue as GuestQ;
|
||||||
|
|
||||||
|
type TestMmap = GuestMemoryMmap<AtomicBitmap>;
|
||||||
|
|
||||||
|
/// Set up a single descriptor in a virtqueue backed by `mem_size` bytes
|
||||||
|
/// of guest RAM. Returns the guest memory, an atomic wrapper around it,
|
||||||
|
/// and the ready queue.
|
||||||
|
fn setup_vq(
|
||||||
|
mem_size: usize,
|
||||||
|
desc_addr: u64,
|
||||||
|
desc_len: u32,
|
||||||
|
desc_flags: u16,
|
||||||
|
) -> (TestMmap, GuestMemoryAtomic<TestMmap>, Queue) {
|
||||||
|
const QSIZE: u16 = 2;
|
||||||
|
|
||||||
|
let mem = TestMmap::from_ranges(&[(GuestAddress(0), mem_size)]).unwrap();
|
||||||
|
let guest_vq = GuestQ::new(GuestAddress(0x1_0000), &mem, QSIZE);
|
||||||
|
let queue = guest_vq.create_queue();
|
||||||
|
|
||||||
|
guest_vq.dtable[0].set(desc_addr, desc_len, desc_flags, 0);
|
||||||
|
guest_vq.avail.ring[0].set(0);
|
||||||
|
guest_vq.avail.idx.set(1);
|
||||||
|
|
||||||
|
let mem_atomic = GuestMemoryAtomic::new(mem.clone());
|
||||||
|
(mem, mem_atomic, queue)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn yields_valid_single_descriptor() {
|
||||||
|
let (_mem, mem_atomic, mut queue) =
|
||||||
|
setup_vq(128 * 1024, 0x4000, 256, VRING_DESC_F_WRITE as u16);
|
||||||
|
let mem_guard = mem_atomic.memory();
|
||||||
|
let mut chain = queue.pop_descriptor_chain(mem_guard).unwrap();
|
||||||
|
let mut it = chain.checked_iter(None);
|
||||||
|
let desc = it
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.expect("valid descriptor must be yielded");
|
||||||
|
assert_eq!(desc.addr().0, 0x4000);
|
||||||
|
assert_eq!(desc.len(), 256);
|
||||||
|
assert!(desc.is_write_only());
|
||||||
|
assert!(it.next().is_none());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user