diff --git a/src/message.rs b/src/message.rs index bf9f5ca..df1495b 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1238,6 +1238,10 @@ impl Router { id } + fn remove_sender(&mut self, id: &Uuid) { + self.senders.remove(id); + } + fn forward(&self, id: &Uuid, msg: Message) { self.senders.get(id).unwrap().send(msg).unwrap(); } @@ -1285,6 +1289,25 @@ mod routers { } assert_eq!(holder.len(), count, "had duplicate keys"); } + + #[test] + fn can_remove_sender() { + let (tx, _) = channel(); + let mut router = Router::new(tx); + let (data, _) = channel(); + let id = router.add_sender(data); + assert_eq!(router.senders.len(), 1, "should have only one sender"); + router.remove_sender(&id); + assert_eq!(router.senders.len(), 0, "should have no senders."); + } + + #[test] + fn ignores_bad_id_removals() { + let (tx, _) = channel(); + let mut router = Router::new(tx); + router.remove_sender(&Uuid::new_v4()); + assert_eq!(router.senders.len(), 0, "should have no senders."); + } } #[derive(Clone)] @@ -1307,6 +1330,11 @@ impl Queue { router.add_sender(sender) } + fn remove_sender(&mut self, id: &Uuid) { + let mut router = self.router.write().unwrap(); + router.remove_sender(id); + } + fn forward(&self, id: &Uuid, msg: Message) { let router = self.router.read().unwrap(); router.forward(id, msg); @@ -1398,6 +1426,22 @@ mod queues { holder.insert(queue.add_sender(tx)); } assert_eq!(holder.len(), count, "had duplicate keys"); + let router = queue.router.read().unwrap(); + assert_eq!( + router.senders.len(), + count, + "should contain all of the senders" + ); + } + + #[test] + fn senders_can_be_removed() { + let mut queue = Queue::new(); + let (tx, _) = channel(); + let id = queue.add_sender(tx); + queue.remove_sender(&id); + let router = queue.router.read().unwrap(); + assert_eq!(router.senders.len(), 0, "should contain no senders"); } #[test] @@ -3826,7 +3870,10 @@ impl DocumentFile { let name_result = rx.recv().unwrap(); match name_result.get_action() { MsgAction::Register(data) => match data.get_msg() { - RegMsg::Error(err) => queue.send(msg.response(err.clone())).unwrap(), + RegMsg::Error(err) => { + queue.remove_sender(&id); + queue.send(msg.response(err.clone())).unwrap(); + } _ => {} }, _ => unreachable!("should return registration"), @@ -5341,5 +5388,12 @@ mod createdocs { }, _ => unreachable!("got {:?}: should have been a reply.", result.get_action()), } + let mut router = queue.router.read().unwrap(); + assert_eq!( + router.senders.len(), + 3, + "there should only be 3 registered senders: createdoc, testing rx, and {:?}", + name + ); } }