Skip to content
This repository was archived by the owner on Oct 24, 2022. It is now read-only.

Commit 6b68592

Browse files
committed
Add more unit test cases
Add more unit test cases to improve code coverage. Signed-off-by: Liu Jiang <[email protected]>
1 parent f6b7e49 commit 6b68592

File tree

5 files changed

+156
-3
lines changed

5 files changed

+156
-3
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,6 @@ virtio-bindings = "0.1"
1616
virtio-queue = { git = "https://github.com/rust-vmm/vm-virtio" }
1717
vm-memory = {version = "0.6", features = ["backend-mmap", "backend-atomic"]}
1818
vmm-sys-util = "0.8"
19+
20+
[dev-dependencies]
21+
vm-memory = {version = "0.6", features = ["backend-mmap", "backend-atomic", "backend-bitmap"]}

src/backend.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,21 +377,21 @@ impl<T: VhostUserBackendMut<B>, B: Bitmap + 'static> VhostUserBackend<B> for RwL
377377
}
378378

379379
#[cfg(test)]
380-
mod tests {
380+
pub mod tests {
381381
use super::*;
382382
use epoll::Events;
383383
use std::io::Error;
384384
use std::sync::Mutex;
385385
use vm_memory::{GuestMemoryAtomic, GuestMemoryMmap};
386386

387-
struct MockVhostBackend {
387+
pub struct MockVhostBackend {
388388
events: u64,
389389
event_idx: bool,
390390
acked_features: u64,
391391
}
392392

393393
impl MockVhostBackend {
394-
fn new() -> Self {
394+
pub fn new() -> Self {
395395
MockVhostBackend {
396396
events: 0,
397397
event_idx: false,

src/event_loop.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,3 +220,41 @@ impl<S: VhostUserBackend<B>, B: Bitmap + 'static> VringEpollHandler<S, B> {
220220
.map_err(VringEpollError::HandleEventBackendHandling)
221221
}
222222
}
223+
224+
#[cfg(test)]
225+
mod tests {
226+
use super::super::backend::tests::MockVhostBackend;
227+
use super::*;
228+
use std::sync::{Arc, Mutex};
229+
use vm_memory::{GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
230+
use vmm_sys_util::eventfd::EventFd;
231+
232+
#[test]
233+
fn test_vring_epoll_handler() {
234+
let mem = GuestMemoryAtomic::new(
235+
GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0x100000), 0x10000)]).unwrap(),
236+
);
237+
let vring = Vring::new(mem, 0x1000);
238+
let backend = Arc::new(Mutex::new(MockVhostBackend::new()));
239+
240+
let handler = VringEpollHandler::new(backend, vec![vring], 0x1).unwrap();
241+
assert!(handler.exit_event_id.is_some());
242+
243+
let eventfd = EventFd::new(0).unwrap();
244+
handler
245+
.register_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
246+
.unwrap();
247+
// Register an already registered fd.
248+
handler
249+
.register_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
250+
.unwrap_err();
251+
252+
handler
253+
.unregister_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
254+
.unwrap();
255+
// unregister an already unregistered fd.
256+
handler
257+
.unregister_listener(eventfd.as_raw_fd(), epoll::Events::EPOLLIN, 1)
258+
.unwrap_err();
259+
}
260+
}

src/lib.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,22 @@ impl<S: VhostUserBackend<B> + Clone, B: NewBitmap + Clone + Send + Sync> VhostUs
150150
self.handler.lock().unwrap().get_epoll_handlers()
151151
}
152152
}
153+
154+
#[cfg(test)]
155+
mod tests {
156+
use super::backend::tests::MockVhostBackend;
157+
use super::*;
158+
use vm_memory::{GuestAddress, GuestMemoryAtomic, GuestMemoryMmap};
159+
160+
#[test]
161+
fn test_new_daemon() {
162+
let mem = GuestMemoryAtomic::new(
163+
GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0x100000), 0x10000)]).unwrap(),
164+
);
165+
let backend = Arc::new(Mutex::new(MockVhostBackend::new()));
166+
let daemon = VhostUserDaemon::new("test".to_owned(), backend, mem).unwrap();
167+
168+
assert_eq!(daemon.get_epoll_handlers().len(), 2);
169+
//daemon.start(Listener::new()).unwrap();
170+
}
171+
}

src/vring.rs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,96 @@ impl<M: GuestAddressSpace> Vring<M> {
158158
self.get_mut().err = file.map(|f| unsafe { EventFd::from_raw_fd(f.into_raw_fd()) });
159159
}
160160
}
161+
162+
#[cfg(test)]
163+
mod tests {
164+
use super::*;
165+
use std::os::unix::io::AsRawFd;
166+
use vm_memory::bitmap::AtomicBitmap;
167+
use vmm_sys_util::eventfd::EventFd;
168+
169+
#[test]
170+
fn test_new_vring() {
171+
let mem = GuestMemoryAtomic::new(
172+
GuestMemoryMmap::<AtomicBitmap>::from_ranges(&[(GuestAddress(0x100000), 0x10000)])
173+
.unwrap(),
174+
);
175+
let vring = Vring::new(mem, 0x1000);
176+
177+
assert!(vring.get_ref().get_kick().is_none());
178+
assert_eq!(vring.get_ref().enabled, false);
179+
assert_eq!(vring.get_mut().get_queue_mut().ready, false);
180+
assert_eq!(vring.get_mut().get_queue_mut().event_idx_enabled, false);
181+
182+
vring.set_enabled(true);
183+
assert_eq!(vring.get_ref().enabled, true);
184+
185+
vring.set_queue_info(0x100100, 0x100200, 0x100300);
186+
assert_eq!(
187+
vring.get_mut().get_queue_mut().desc_table,
188+
GuestAddress(0x100100)
189+
);
190+
assert_eq!(
191+
vring.get_mut().get_queue_mut().avail_ring,
192+
GuestAddress(0x100200)
193+
);
194+
assert_eq!(
195+
vring.get_mut().get_queue_mut().used_ring,
196+
GuestAddress(0x100300)
197+
);
198+
199+
assert_eq!(vring.queue_next_avail(), 0);
200+
vring.set_queue_next_avail(0x20);
201+
assert_eq!(vring.queue_next_avail(), 0x20);
202+
203+
vring.set_queue_size(0x200);
204+
assert_eq!(vring.get_mut().get_queue_mut().size, 0x200);
205+
206+
vring.set_queue_event_idx(true);
207+
assert_eq!(vring.get_mut().get_queue_mut().event_idx_enabled, true);
208+
209+
vring.set_queue_ready(true);
210+
assert_eq!(vring.get_mut().get_queue_mut().ready, true);
211+
}
212+
213+
#[test]
214+
fn test_vring_set_fd() {
215+
let mem = GuestMemoryAtomic::new(
216+
GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0x100000), 0x10000)]).unwrap(),
217+
);
218+
let vring = Vring::new(mem, 0x1000);
219+
220+
vring.set_enabled(true);
221+
assert_eq!(vring.get_ref().enabled, true);
222+
223+
let eventfd = EventFd::new(0).unwrap();
224+
let file = unsafe { File::from_raw_fd(eventfd.as_raw_fd()) };
225+
assert!(vring.get_ref().kick.is_none());
226+
assert_eq!(vring.read_kick().unwrap(), true);
227+
vring.set_kick(Some(file));
228+
eventfd.write(1).unwrap();
229+
assert_eq!(vring.read_kick().unwrap(), true);
230+
assert!(vring.get_ref().kick.is_some());
231+
vring.set_kick(None);
232+
assert!(vring.get_ref().kick.is_none());
233+
std::mem::forget(eventfd);
234+
235+
let eventfd = EventFd::new(0).unwrap();
236+
let file = unsafe { File::from_raw_fd(eventfd.as_raw_fd()) };
237+
assert!(vring.get_ref().call.is_none());
238+
vring.set_call(Some(file));
239+
assert!(vring.get_ref().call.is_some());
240+
vring.set_call(None);
241+
assert!(vring.get_ref().call.is_none());
242+
std::mem::forget(eventfd);
243+
244+
let eventfd = EventFd::new(0).unwrap();
245+
let file = unsafe { File::from_raw_fd(eventfd.as_raw_fd()) };
246+
assert!(vring.get_ref().err.is_none());
247+
vring.set_err(Some(file));
248+
assert!(vring.get_ref().err.is_some());
249+
vring.set_err(None);
250+
assert!(vring.get_ref().err.is_none());
251+
std::mem::forget(eventfd);
252+
}
253+
}

0 commit comments

Comments
 (0)