From 99d127bb34fb02d4b99c70cec62f06ab3a078f12 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Mon, 4 Apr 2016 00:33:30 +0300 Subject: [PATCH] duplex & tests --- ipc/nano/src/lib.rs | 52 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs index e92542d03..1b0d0ca7b 100644 --- a/ipc/nano/src/lib.rs +++ b/ipc/nano/src/lib.rs @@ -32,6 +32,10 @@ pub struct Worker where S: IpcInterface { method_buf: [u8;2], } +pub enum SocketError { + DuplexLink +} + impl Worker where S: IpcInterface { pub fn new(service: Arc) -> Worker { Worker:: { @@ -43,8 +47,9 @@ impl Worker where S: IpcInterface { pub fn poll(&mut self) { for socket in self.sockets.iter_mut() { - if let Ok(method_sig_len) = socket.nb_read(&mut self.method_buf) { - if method_sig_len == 2 { + // non-blocking read only ok if there is something to read from socket + if let Ok(method_sign_len) = socket.nb_read(&mut self.method_buf) { + if method_sign_len == 2 { let result = self.service.dispatch_buf( self.method_buf[1] as u16 * 256 + self.method_buf[0] as u16, socket); @@ -52,7 +57,50 @@ impl Worker where S: IpcInterface { warn!(target: "ipc", "Failed to write response: {:?}", e); } } + else { + warn!(target: "ipc", "Failed to read method signature from socket: unexpected message length({})", method_sign_len); + } } } } + + pub fn add_duplex(&mut self, addr: &str) -> Result<(), SocketError> { + let mut socket = try!(Socket::new(Protocol::Pair).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::DuplexLink + })); + + try!(socket.bind(addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", addr, e); + SocketError::DuplexLink + })); + + self.sockets.push(socket); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + + use super::Worker; + use ipc::*; + use std::io::Read; + use std::sync::Arc; + + struct DummyService; + + impl IpcInterface for DummyService { + fn dispatch(&self, r: &mut R) -> Vec where R: Read { + vec![] + } + fn dispatch_buf(&self, method_num: u16, r: &mut R) -> Vec where R: Read { + vec![] + } + } + + fn can_create_worker() { + let worker = Worker::::new(Arc::new(DummyService)); + assert_eq!(0, worker.sockets.len()); + } }