use std::cmp;
use std::sync::mpsc;
use core::Core;
use event::Event;
use kademlia_routing_table::GROUP_SIZE;
use maidsafe_utilities::log;
use mock_crust::{self, Config, Endpoint, Network, ServiceHandle};
struct TestNode {
handle: ServiceHandle,
core: Core,
event_rx: mpsc::Receiver<Event>,
}
impl TestNode {
fn new(network: &Network,
client_restriction: bool,
config: Option<Config>,
endpoint: Option<Endpoint>)
-> Self {
let handle = network.new_service_handle(config, endpoint);
let (event_tx, event_rx) = mpsc::channel();
let (_, core) = mock_crust::make_current(&handle, || {
Core::new(event_tx, client_restriction, None)
});
TestNode {
handle: handle,
core: core,
event_rx: event_rx,
}
}
fn poll(&mut self) -> bool {
let mut result = false;
while self.core.poll() {
result = true;
}
result
}
}
macro_rules! expect_event {
($node:expr, $pattern:pat) => {
match $node.event_rx.try_recv() {
Ok($pattern) => (),
other => panic!("Expected Ok({}), got {:?}", stringify!($pattern), other),
}
}
}
fn poll_all(nodes: &mut [TestNode]) {
while nodes.iter_mut().any(TestNode::poll) {}
}
fn create_connected_nodes(network: &Network, size: usize) -> Vec<TestNode> {
let mut nodes = Vec::new();
nodes.push(TestNode::new(network, false, None, None));
nodes[0].poll();
let config = Config::with_contacts(&[nodes[0].handle.endpoint()]);
for _ in 1..size {
nodes.push(TestNode::new(network, false, Some(config.clone()), None));
poll_all(&mut nodes);
}
let n = cmp::min(nodes.len(), GROUP_SIZE) - 1;
for node in nodes.iter() {
for _ in 0..n {
expect_event!(node, Event::NodeAdded(..))
}
}
nodes
}
#[test]
fn two_nodes() {
let network = Network::new();
let _ = create_connected_nodes(&network, 2);
}
#[test]
fn few_nodes() {
log::init(true);
let network = Network::new();
let _ = create_connected_nodes(&network, 3);
}
#[test]
fn group_size_nodes() {
let network = Network::new();
let _ = create_connected_nodes(&network, GROUP_SIZE);
}
#[test]
fn more_than_group_size_nodes() {
let network = Network::new();
let _ = create_connected_nodes(&network, GROUP_SIZE + 2);
}
#[test]
fn client_connects_to_nodes() {
let network = Network::new();
let mut nodes = create_connected_nodes(&network, GROUP_SIZE + 1);
let client = TestNode::new(&network,
true,
Some(Config::with_contacts(&[nodes[0].handle.endpoint()])),
None);
nodes.push(client);
poll_all(&mut nodes);
expect_event!(nodes.iter().last().unwrap(), Event::Connected);
}