From 003207f94830fed0def25b49a7e6fc61655ec934 Mon Sep 17 00:00:00 2001 From: tv Date: Fri, 6 Nov 2026 05:33:42 +0100 Subject: trees over working links --- src/swarm/topology/tests.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/swarm/topology/tests.rs') 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::>(); + let ring: BTreeMap> = [ + ("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 = [ + ( + 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); +} -- cgit v1.3.1