diff --git a/src/message.rs b/src/message.rs index 64b6628..e1dc5ea 100644 --- a/src/message.rs +++ b/src/message.rs @@ -7,7 +7,7 @@ use std::{ mpsc::{channel, Receiver, Sender}, Arc, RwLock, }, - thread::spawn, + thread::{sleep, spawn}, time::Duration, }; use uuid::Uuid; @@ -5736,3 +5736,75 @@ mod createdocs { ); } } + +struct Clock { + queue: Queue, +} + +impl Clock { + fn new(queue: Queue) -> Self { + Self { queue: queue } + } + + fn start(mut queue: Queue) { + let clock = Clock::new(queue.clone()); + let (tx, rx) = channel(); + let id = queue.add_sender(tx); + let reg_msg = Register::new(id, RegMsg::AddDocName(Name::english("clock"))); + let msg = Message::new(NameType::None, reg_msg.clone()); + queue.send(msg).unwrap(); + rx.recv().unwrap(); + spawn(move || { + clock.listen(); + }); + } + + fn listen(&self) { + loop { + self.queue + .send(Message::new(Name::english("clock"), RecordIter::new())); + sleep(Duration::from_secs(1)); + } + } +} + +#[cfg(test)] +mod clocks { + use super::*; + + static TIMEOUT: Duration = Duration::from_millis(1500); + + #[test] + fn does_clock_send_reply_every_second() { + let mut queue = Queue::new(); + let (tx, rx) = channel(); + let id = queue.add_sender(tx); + let request = Register::new( + id, + RegMsg::AddRoute(Path::new(Include::All, Include::All, Include::All)), + ); + queue.send(Message::new(NameType::None, request)).unwrap(); + rx.recv_timeout(TIMEOUT).unwrap(); + let mut holder: Vec = Vec::new(); + let start = Utc::now(); + Clock::start(queue.clone()); + while holder.len() < 2 { + holder.push(rx.recv_timeout(TIMEOUT).unwrap()); + } + let end = Utc::now(); + assert!((end - start) > chrono::TimeDelta::seconds(1)); + assert!((end - start) < chrono::TimeDelta::seconds(2)); + for msg in holder.iter() { + let name_id = msg.get_document_id(); + match name_id { + NameType::Name(data) => assert_eq!(data, &Name::english("clock")), + _ => unreachable!("got {:?}, should have been clock", name_id), + } + let action = msg.get_action(); + match action { + MsgAction::Records(result) => assert_eq!(result.len(), 0), + _ => unreachable!("got {:?}, should have been empty record", action), + } + } + } +}