pub mod poll;
pub mod test_client;
pub mod test_node;
use itertools::Itertools;
use kademlia_routing_table::RoutingTable;
use mock_crust_detail::test_node::TestNode;
use personas::data_manager::IdAndVersion;
use routing::{self, Data, GROUP_SIZE, XorName};
use std::collections::{HashMap, HashSet};
pub fn check_deleted_data(deleted_data: &[Data], nodes: &[TestNode]) {
let deleted_data_ids: HashSet<_> = deleted_data.iter()
.map(Data::identifier)
.collect();
let mut data_count = HashMap::new();
nodes.iter()
.flat_map(TestNode::get_stored_names)
.foreach(|data_idv| {
if deleted_data_ids.contains(&data_idv.0) {
*data_count.entry(data_idv).or_insert(0) += 1;
}
});
for (data_id, count) in data_count {
assert!(count < 5,
"Found deleted data: {:?}. count: {}",
data_id,
count);
}
}
pub fn check_data(all_data: Vec<Data>, nodes: &[TestNode]) {
let mut data_holders_map: HashMap<IdAndVersion, Vec<XorName>> = HashMap::new();
for node in nodes {
for data_idv in node.get_stored_names() {
data_holders_map.entry(data_idv).or_insert_with(Vec::new).push(node.name());
}
}
for data in all_data {
let (data_id, data_version) = match data {
Data::Immutable(data) => (data.identifier(), 0),
Data::Structured(data) => (data.identifier(), data.get_version()),
_ => unreachable!(),
};
let data_holders = data_holders_map.get(&(data_id, data_version))
.cloned()
.unwrap_or_else(Vec::new)
.into_iter()
.sorted_by(|left, right| data_id.name().cmp_distance(left, right));
let mut expected_data_holders = nodes.iter()
.map(TestNode::name)
.sorted_by(|left, right| data_id.name().cmp_distance(left, right));
expected_data_holders.truncate(GROUP_SIZE);
assert!(expected_data_holders == data_holders,
"Data: {:?}. expected = {:?}, actual = {:?}",
data_id,
expected_data_holders,
data_holders);
}
}
pub fn verify_kademlia_invariant_for_all_nodes(nodes: &[TestNode]) {
let routing_tables: Vec<RoutingTable<XorName>> =
nodes.iter().map(TestNode::routing_table).collect();
for node_index in 0..nodes.len() {
routing::verify_kademlia_invariant(&routing_tables, node_index);
}
}