aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm/topology/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/swarm/topology/tests.rs')
-rw-r--r--src/swarm/topology/tests.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/swarm/topology/tests.rs b/src/swarm/topology/tests.rs
index 1b9c75d..ede3b6b 100644
--- a/src/swarm/topology/tests.rs
+++ b/src/swarm/topology/tests.rs
@@ -489,3 +489,54 @@ fn the_swarms_neighbours_count() {
}
assert!(affects_neighbours(&neighbours_path()));
}
+
+/// The links members recorded: one either end recorded as unreached is out of the
+/// graph, both ways, even where the other end recorded it as reached; one recorded as
+/// reached is in, between members the graph has; the rest stays.
+#[test]
+fn recorded_links_change_the_graph() {
+ use crate::swarm::members::RecordedLinks;
+ let name = |n: &str| n.to_owned();
+ let set = |names: &[&str]| names.iter().map(|n| name(n)).collect::<BTreeSet<String>>();
+ let ring: BTreeMap<String, BTreeSet<String>> = [
+ ("a", set(&["b", "d"])),
+ ("b", set(&["a", "c"])),
+ ("c", set(&["b", "d"])),
+ ("d", set(&["c", "a"])),
+ ]
+ .into_iter()
+ .map(|(member, neighbours)| (name(member), neighbours))
+ .collect();
+ let recorded: BTreeMap<String, RecordedLinks> = [
+ (
+ name("a"),
+ RecordedLinks {
+ unreached: set(&["b"]),
+ reached: set(&["c", "stranger"]),
+ },
+ ),
+ (
+ name("b"),
+ RecordedLinks {
+ unreached: BTreeSet::new(),
+ reached: set(&["d"]),
+ },
+ ),
+ (
+ name("d"),
+ RecordedLinks {
+ unreached: set(&["b"]),
+ reached: BTreeSet::new(),
+ },
+ ),
+ ]
+ .into_iter()
+ .collect();
+ let changed = with_recorded(&ring, &recorded);
+ assert_eq!(changed[&name("a")], set(&["c", "d"]));
+ assert_eq!(changed[&name("b")], set(&["c"]));
+ assert_eq!(changed[&name("c")], set(&["a", "b", "d"]));
+ assert_eq!(changed[&name("d")], set(&["a", "c"]));
+ assert!(!changed.contains_key("stranger"));
+ assert_eq!(with_recorded(&ring, &BTreeMap::new()), ring);
+}