From 4931a300f2eb071453fabf32bc4caa88c1d0c4a7 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Thu, 14 Apr 2016 18:22:31 +0300 Subject: [PATCH] first tests --- ipc/nano/src/lib.rs | 12 ++++----- parity/hypervisor/mod.rs | 44 +++++++++++++++++++++++++++++---- parity/hypervisor/service.rs.in | 12 ++++++++- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs index b7d271c47..be9cee393 100644 --- a/ipc/nano/src/lib.rs +++ b/ipc/nano/src/lib.rs @@ -80,7 +80,7 @@ pub enum SocketError { impl Worker where S: IpcInterface { /// New worker over specified `service` - pub fn new(service: Arc) -> Worker { + pub fn new(service: &Arc) -> Worker { Worker:: { service: service.clone(), sockets: Vec::new(), @@ -226,13 +226,13 @@ mod service_tests { #[test] fn can_create_worker() { - let worker = Worker::::new(Arc::new(DummyService::new())); + let worker = Worker::::new(&Arc::new(DummyService::new())); assert_eq!(0, worker.sockets.len()); } #[test] fn can_add_duplex_socket_to_worker() { - let mut worker = Worker::::new(Arc::new(DummyService::new())); + let mut worker = Worker::::new(&Arc::new(DummyService::new())); worker.add_duplex("ipc:///tmp/parity-test10.ipc").unwrap(); assert_eq!(1, worker.sockets.len()); } @@ -240,7 +240,7 @@ mod service_tests { #[test] fn worker_can_poll_empty() { let service = Arc::new(DummyService::new()); - let mut worker = Worker::::new(service.clone()); + let mut worker = Worker::::new(&service); worker.add_duplex("ipc:///tmp/parity-test20.ipc").unwrap(); worker.poll(); assert_eq!(0, service.methods_stack.read().unwrap().len()); @@ -250,7 +250,7 @@ mod service_tests { fn worker_can_poll() { let url = "ipc:///tmp/parity-test30.ipc"; - let mut worker = Worker::::new(Arc::new(DummyService::new())); + let mut worker = Worker::::new(&Arc::new(DummyService::new())); worker.add_duplex(url).unwrap(); let (_socket, _endpoint) = dummy_write(url, &vec![0, 0, 7, 7, 6, 6]); @@ -265,7 +265,7 @@ mod service_tests { fn worker_can_poll_long() { let url = "ipc:///tmp/parity-test40.ipc"; - let mut worker = Worker::::new(Arc::new(DummyService::new())); + let mut worker = Worker::::new(&Arc::new(DummyService::new())); worker.add_duplex(url).unwrap(); let message = [0u8; 1024*1024]; diff --git a/parity/hypervisor/mod.rs b/parity/hypervisor/mod.rs index 18cbd4f34..33206d364 100644 --- a/parity/hypervisor/mod.rs +++ b/parity/hypervisor/mod.rs @@ -21,24 +21,58 @@ pub mod service; pub const HYPERVISOR_IPC_URL: &'static str = "ipc:///tmp/parity-internal-hyper-status.ipc"; use nanoipc; +use std::sync::{Arc,RwLock}; +use hypervisor::service::*; +use ipc::IpcInterface; pub struct Hypervisor { + service: Arc, ipc_worker: RwLock>, } impl Hypervisor { /// initializes the Hypervisor service with the open ipc socket for incoming clients pub fn init() -> Arc{ - let mut worker = nanoipc::Worker::::new(Arc::new(Service::new())); - worker.add_reqrep(HYPERVISOR_IPC_URL); + Hypervisor::with_url(HYPERVISOR_IPC_URL) + } + + fn with_url(addr: &str) -> Arc{ + let service = HypervisorService::new(); + let mut worker = nanoipc::Worker::new(&service); + worker.add_reqrep(addr); Arc::new(Hypervisor{ - ipc_worker: worker + service: service, + ipc_worker: RwLock::new(worker), }) } - /// Waits for every required module to check in - pub fn wait_for_startup() { + pub fn modules_ready(&self) -> bool { + self.service.unchecked_count() == 0 + } + /// Waits for every required module to check in + pub fn wait_for_startup(&self) { + let mut worker = self.ipc_worker.write().unwrap(); + while !self.modules_ready() { + worker.poll() + } + } +} + +mod tests { + use super::*; + + #[test] + fn can_init() { + let hypervisor = Hypervisor::with_url("ipc:///tmp/test-parity-hypervisor-10"); + assert_eq!(false, hypervisor.modules_ready()); + } + + #[test] + fn can_wait_for_startup() { + let hypervisor = Hypervisor::with_url("ipc:///tmp/test-parity-hypervisor-10"); + hypervisor.wait_for_startup(); + assert_eq!(false, hypervisor.modules_ready()); } } diff --git a/parity/hypervisor/service.rs.in b/parity/hypervisor/service.rs.in index d0ae5fdb1..e355373ac 100644 --- a/parity/hypervisor/service.rs.in +++ b/parity/hypervisor/service.rs.in @@ -39,12 +39,22 @@ impl HypervisorService { impl HypervisorService { pub fn new() -> Arc { + HypervisorService::with_modules(vec![DATABASE_MODULE_ID]); + } + + pub fn with_modules(module_ids: Vec) -> Arc { let mut check_list = HashMap::new(); - check_list.insert(DATABASE_MODULE_ID, false); + for module_id in module_ids { + check_list.insert(module_id, false); + } Arc::new(HypervisorService { check_list: RwLock::new(check_list), }) } + + pub fn unchecked_count(&self) -> usize { + self.check_list.read().unwrap().iter().filter(|&(_, status)| !status).count() + } } impl ::ipc::IpcConfig for HypervisorService {}