diff options
Diffstat (limited to 'src/vhost_user/slave.rs')
-rw-r--r-- | src/vhost_user/slave.rs | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/vhost_user/slave.rs b/src/vhost_user/slave.rs index 5ac99af..fb65c41 100644 --- a/src/vhost_user/slave.rs +++ b/src/vhost_user/slave.rs @@ -3,7 +3,7 @@ //! Traits and Structs for vhost-user slave. -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use super::connection::{Endpoint, Listener}; use super::message::*; @@ -12,14 +12,14 @@ use super::{Result, SlaveReqHandler, VhostUserSlaveReqHandler}; /// Vhost-user slave side connection listener. pub struct SlaveListener<S: VhostUserSlaveReqHandler> { listener: Listener, - backend: Option<Arc<Mutex<S>>>, + backend: Option<Arc<S>>, } /// Sets up a listener for incoming master connections, and handles construction /// of a Slave on success. impl<S: VhostUserSlaveReqHandler> SlaveListener<S> { /// Create a unix domain socket for incoming master connections. - pub fn new(listener: Listener, backend: Arc<Mutex<S>>) -> Result<Self> { + pub fn new(listener: Listener, backend: Arc<S>) -> Result<Self> { Ok(SlaveListener { listener, backend: Some(backend), @@ -44,3 +44,43 @@ impl<S: VhostUserSlaveReqHandler> SlaveListener<S> { self.listener.set_nonblocking(block) } } + +#[cfg(test)] +mod tests { + use std::sync::Mutex; + + use super::*; + use crate::vhost_user::dummy_slave::DummySlaveReqHandler; + + #[test] + fn test_slave_listener_set_nonblocking() { + let backend = Arc::new(Mutex::new(DummySlaveReqHandler::new())); + let listener = + Listener::new("/tmp/vhost_user_lib_unit_test_slave_nonblocking", true).unwrap(); + let slave_listener = SlaveListener::new(listener, backend).unwrap(); + + slave_listener.set_nonblocking(true).unwrap(); + slave_listener.set_nonblocking(false).unwrap(); + slave_listener.set_nonblocking(false).unwrap(); + slave_listener.set_nonblocking(true).unwrap(); + slave_listener.set_nonblocking(true).unwrap(); + } + + #[cfg(feature = "vhost-user-master")] + #[test] + fn test_slave_listener_accept() { + use super::super::Master; + + let path = "/tmp/vhost_user_lib_unit_test_slave_accept"; + let backend = Arc::new(Mutex::new(DummySlaveReqHandler::new())); + let listener = Listener::new(path, true).unwrap(); + let mut slave_listener = SlaveListener::new(listener, backend).unwrap(); + + slave_listener.set_nonblocking(true).unwrap(); + assert!(slave_listener.accept().unwrap().is_none()); + assert!(slave_listener.accept().unwrap().is_none()); + + let _master = Master::connect(path, 1).unwrap(); + let _slave = slave_listener.accept().unwrap().unwrap(); + } +} |