|
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
|
|
use std::sync::Arc;
|
|
|
|
use std::thread;
|
|
|
|
use std::time::Duration;
|
|
|
|
use vented::event::Event;
|
|
|
|
use vented::server::data::Node;
|
|
|
|
use vented::server::VentedServer;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_server_communication() {
|
|
|
|
let ping_count = Arc::new(AtomicUsize::new(0));
|
|
|
|
let pong_count = Arc::new(AtomicUsize::new(0));
|
|
|
|
let nodes = vec![
|
|
|
|
Node {
|
|
|
|
id: "A".to_string(),
|
|
|
|
address: Some("localhost:22222".to_string()),
|
|
|
|
},
|
|
|
|
Node {
|
|
|
|
id: "B".to_string(),
|
|
|
|
address: None,
|
|
|
|
},
|
|
|
|
];
|
|
|
|
let mut server_a = VentedServer::new("A".to_string(), nodes.clone(), 2);
|
|
|
|
let mut server_b = VentedServer::new("B".to_string(), nodes, 2);
|
|
|
|
server_a.listen("localhost:22222".to_string());
|
|
|
|
thread::sleep(Duration::from_millis(10));
|
|
|
|
|
|
|
|
server_a.on("ping", {
|
|
|
|
let ping_count = Arc::clone(&ping_count);
|
|
|
|
move |_| {
|
|
|
|
ping_count.fetch_add(1, Ordering::Relaxed);
|
|
|
|
|
|
|
|
Some(Event::new("pong".to_string()))
|
|
|
|
}
|
|
|
|
});
|
|
|
|
server_b.on("pong", {
|
|
|
|
let pong_count = Arc::clone(&pong_count);
|
|
|
|
move |_| {
|
|
|
|
pong_count.fetch_add(1, Ordering::Relaxed);
|
|
|
|
None
|
|
|
|
}
|
|
|
|
});
|
|
|
|
for _ in 0..10 {
|
|
|
|
server_b
|
|
|
|
.emit("A".to_string(), Event::new("ping".to_string()))
|
|
|
|
.unwrap();
|
|
|
|
}
|
|
|
|
server_a
|
|
|
|
.emit("B".to_string(), Event::new("pong".to_string()))
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
// wait one second to make sure the servers were able to process the events
|
|
|
|
thread::sleep(Duration::from_secs(1));
|
|
|
|
|
|
|
|
assert_eq!(ping_count.load(Ordering::Relaxed), 10);
|
|
|
|
assert_eq!(pong_count.load(Ordering::Relaxed), 11);
|
|
|
|
}
|