diff --git a/wg-event-gen/src/gen.rs b/wg-event-gen/src/gen.rs index da43ff2..218aff4 100644 --- a/wg-event-gen/src/gen.rs +++ b/wg-event-gen/src/gen.rs @@ -73,3 +73,104 @@ pub(crate) fn gen_events( } } } + + +#[cfg(test)] +mod test { + use super::*; + use crate::listener::*; + use crate::*; + use std::cell::RefCell; + use std::collections::{HashMap, HashSet}; + use std::env; + use std::fmt; + use std::io::prelude::*; + use std::io::{BufRead, BufReader, Error, ErrorKind, Result}; + use std::net::SocketAddr; + use std::os::unix::net::UnixStream; + use std::path::PathBuf; + use std::{thread, time}; + + struct TestListener { + calls: RefCell>, + } + impl TestListener { + fn new() -> TestListener { + Self::from(RefCell::new(vec![])) + } + + fn from(calls: RefCell>) -> TestListener { + TestListener { calls: calls } + } + } + impl EventListener for TestListener { + fn added<'a>(&self, peer: &'a Peer) { + self.calls + .borrow_mut() + .push(format!("add {}", peer.public_key)); + } + + fn connected<'a>(&self, peer: &'a Peer) { + self.calls + .borrow_mut() + .push(format!("con {}", peer.public_key)); + } + + fn disconnected<'a>(&self, peer: &'a Peer) { + self.calls + .borrow_mut() + .push(format!("dis {}", peer.public_key)); + } + + fn removed<'a>(&self, peer: &'a Peer) { + self.calls + .borrow_mut() + .push(format!("rem {}", peer.public_key)); + } + + fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) { + self.calls + .borrow_mut() + .push(format!("rom {}", peer.public_key)); + } + } + + fn listeners() -> (Vec>, RefCell>) { + let calls: RefCell> = RefCell::new(vec![]); + ( + vec![ + Box::new(TestListener::from(calls.clone())), + Box::new(LogListener), + ], + calls.clone(), + ) + } + + fn b2h(b: &str) -> String { + hex::encode(base64::decode(b).unwrap()) + } + + #[test] + fn connected() { + let bkey = "HhRgEL2xsnEIqThSTUKLGaTXusorM1MFdjSSYvzBynY="; + let key = b2h(bkey); + let prev: HashMap = HashMap::new(); + let mut cur: HashMap = HashMap::new(); + cur.insert( + key.clone(), + Peer::from_kv(&vec![ + ("public_key".to_string(), key.clone()), + ( + "last_handshake_time_nsec".to_string(), + (1000 * 1000 * 1).to_string(), + ), + ("endpoint".to_string(), "1.1.1.1:22222".to_string()), + ]) + .unwrap(), + ); + let (listeners, calls) = listeners(); + gen_events(&cur, &prev, &listeners, time::Duration::from_secs(3)); + assert_eq!(vec![["con", bkey].join(" ")], calls.borrow().clone()); + } + +}