actaeon/
router.rs

1//! # Router
2//!
3//! The router is responsible for storing and sorting nodes as well as
4//! providing callers with the information required to send messages
5//! through the system.
6
7use crate::bucket::Bucket;
8use crate::error::Error;
9use crate::node::{Address, Center, Node};
10use std::sync::{Arc, Mutex};
11
12/// The entry and interaction point for the binary routing tree. It
13/// holds the root of the tree and is mainly a nice interface for the
14/// internals of the tree. Currently the tree is stored directly in
15/// the struct, in the future this might have to get replaced by a
16/// Mutex and Arc, once a dedicated processing thread has been added.
17pub struct Table {
18    /// The first element of the routing tree. It is the only one that
19    /// does not have to be heap allocated, since it can be accessed
20    /// directly.
21    root: Element,
22    /// Since many of the distance calculations require the Center, it
23    /// is stored here and will be passed to the functions internally.
24    center: Center,
25}
26
27/// Thread safe wrapper around the core Table struct.
28/// TODO: Refactor out / remove requirement.
29#[derive(Clone)]
30pub struct Safe {
31    table: Arc<Mutex<Table>>,
32    center: Center,
33}
34
35/// In order to simplify and modularize the binary tree the Elements
36/// don't store the necessary metadata themselves. Instead in each
37/// Element the Properties will be stored separately. The Properties
38/// describe the range of each Element, as expressed through the lower
39/// and upper limit index. The limits determine which Nodes can be
40/// stored in a specific element, meaning the first byte of the
41/// distance of any Node for a given Element must be between the lower
42/// and upper limit. The root Element will always have limits of 0 and
43/// 255 since it covers the entire range. When the root element gets
44/// split the Properties will also be split automatically, meaning the
45/// two lower Elements will have limits of 0, 127 and 128, 255. If the
46/// lower limit is zero the Element is "near", if it is anything but
47/// zero it is "far". This simply describes what side of the tree any
48/// element is on. Any element that would contain the center is
49/// considered "near", all other elements are "far". Only "near"
50/// Elements can get split, Nodes in "far" Elements will get replaced.
51#[derive(Clone, Debug)]
52struct Property {
53    /// The lower limit of the Element, zero means the Element is "near"
54    lower: u8,
55    /// The upper limit of the Element maximum is 255, only the root
56    /// and the first "far" split can have that.
57    upper: u8,
58}
59
60/// The mail component of the binary routing tree. Each /node/ (binary
61/// tree node not remote Nodes) is either a Split or a Leaf and both
62/// are combined with properties. The two variants of the Enum
63/// correspond to two different structs and the properties. Most
64/// methods use recursive calculations to iterate through the entire
65/// Split structure.
66#[derive(Clone, Debug)]
67enum Element {
68    /// Element that represents a Split in the binary tree, meaning
69    /// there are two more Elements below it. It holds the dedicated
70    /// Split struct and properties.
71    Split(Split, Property),
72    /// Represents a /node/ (=Element) of the binary tree that has no
73    /// more child Elements, meaning it is a Leaf. It holds a bucket
74    /// for the actual nodes as well as the properties.
75    Leaf(Bucket, Property),
76}
77
78/// Struct representing a Node in the routing table (binary tree) that
79/// has two child nodes. Since the struct holds "recursive
80/// definitions" of the Element struct the two subelements need to be
81/// heap allocated (boxed). The "far" Element would not have to be
82/// boxed or even an Element, since it can always only be a Leaf
83/// (following the Kademlia rules). But in order to make the functions
84/// more unified both sides are represented equally.
85#[derive(Clone, Debug)]
86struct Split {
87    /// The Element containing the Center, here called "near".
88    near: Box<Element>,
89    /// The Element not containing the Center, here called "far". This
90    /// always is a Leaf / Bucket.
91    far: Box<Element>,
92}
93
94impl Table {
95    /// Creates a new routing table and populates the root Element
96    /// with an empty Leaf / Bucket covering the entire range limit (0
97    /// to 255).
98    pub fn new(limit: usize, center: Center) -> Self {
99        Table {
100            root: Element::Leaf(
101                Bucket::new(limit),
102                Property {
103                    lower: 0,
104                    upper: 255,
105                },
106            ),
107            center,
108        }
109    }
110
111    /// Attempts to add a node to the routing table. It will fail if
112    /// the bucket it should go into is full and it won't change the
113    /// structure of the table, meaning it won't split any Elements.
114    /// But if the target Leaf is "far", meaning splitting the Element
115    /// wouldn't have been an option anyways, it will replace the
116    /// oldest, non reachable Node in the Table or disregard the new
117    /// Node. There is no guarantee a new Node will actually get
118    /// added. This follows the Kademlia rules of preferring old,
119    /// available Nodes over new ones.
120    pub fn try_add(&mut self, node: Node) -> Result<(), Error> {
121        self.root.try_add(node, &self.center)
122    }
123
124    /// The main function for adding new Nodes two the Table. Like
125    /// "try_add" it also doesn't guarantee a Node will be added for
126    /// Nodes on the "far" side, but the structure of the Table will
127    /// get changed for "near" nodes. If the new Node belongs into an
128    /// Element at maximum capacity it will get split into two new
129    /// Leaves. If the Node already exists in the table nothing will
130    /// change except for the Link details.
131    pub fn add(&mut self, node: Node) {
132        if &node.address != &self.center.public {
133            match self.find_mut(&node.address) {
134                Some(found) => {
135                    found.link = node.link;
136                }
137                None => {
138                    self.root.add(node, &self.center);
139                }
140            }
141        }
142    }
143
144    /// Opposite of "try_add", will remove a Node with the matching
145    /// Address from the table. Since that might make parts of the
146    /// tree under used, the shape can get updated after removal.
147    /// Should the Address not be in the Table this function will
148    /// fail.
149    pub fn remove(&mut self, address: &Address) -> Result<(), Error> {
150        self.root.remove(address, &self.center)
151    }
152
153    /// Takes an Address and returns an optional Node if a Node with
154    /// exactly that Address exists. This is not meant as a way of
155    /// finding new targets for messages but for checking if a Node
156    /// exists in the Table or fetching specific connection data.
157    pub fn find(&self, address: &Address) -> Option<&Node> {
158        self.root.find(address, &self.center)
159    }
160
161    /// Takes an Address and returns an optional Node if a Node with
162    /// exactly that Address exists. This is not meant as a way of
163    /// finding new targets for messages but for checking if a Node
164    /// exists in the Table or fetching specific connection data.
165    pub fn find_mut(&mut self, address: &Address) -> Option<&mut Node> {
166        self.root.find_mut(address, &self.center)
167    }
168
169    /// Returns the closest nodes to the search address, no matter the
170    /// shape of the binary tree. If there are less than the requested
171    /// number of nodes in the tree only that amount will be returned,
172    /// the function can't fail. The Nodes are not guaranteed to be
173    /// ordered by size since each bucket internally is ordered by
174    /// age. Overall the nodes should roughly be ordered, but that is
175    /// not reliable. This function will be used for sending the
176    /// actual messages to the k-closest Nodes.
177    pub fn get(&self, address: &Address, limit: usize) -> Vec<&Node> {
178        self.root.get(address, &self.center, limit)
179    }
180
181    /// Mostly the same as get but copies the found nodes instead of
182    /// returning a pointer to them. Since the Node at some point will
183    /// have to be copied for the TCP handler, this function makes the
184    /// copy earlier.
185    pub fn get_copy(&self, address: &Address, limit: usize) -> Vec<Node> {
186        let mut nodes = Vec::new();
187        let refs = self.get(address, limit);
188        for n in refs {
189            nodes.push(n.clone());
190        }
191        return nodes;
192    }
193
194    /// Returns the current maximum capacity of the tree. The capacity
195    /// is the sum of all maximum sizes of all Leaves / Buckets. The
196    /// absolute limit is 255 times the size of each bucket, since
197    /// there are a maximum of 255 Buckets in the Table.
198    pub fn capacity(&self) -> usize {
199        self.root.capacity()
200    }
201
202    /// Change the link state of a Node in the Table. This function
203    /// can both be used to change the state of the link and also to
204    /// update the state after no change was found. This will update
205    /// the internal counter for how many times attempts have been
206    /// made to reach a Node.
207    pub fn status(&mut self, address: &Address, status: bool) {
208        match self.root.find_mut(address, &self.center) {
209            Some(node) => node.update(status),
210            None => (),
211        }
212    }
213
214    /// Returns the total number of Nodes in the entire Table.
215    pub fn len(&self) -> usize {
216        self.root.len()
217    }
218
219    /// Creates a Vec of bytes of all addresses in the table.
220    /// Currently not the most efficient method is used, since all the
221    /// Link data is not transmitted, this needs to be fixed in the
222    /// future.
223    pub fn export(&self) -> Vec<u8> {
224        let mut data = Vec::new();
225        let nodes = self.get(&self.center.public, self.len());
226        for n in nodes {
227            data.append(&mut n.as_bytes().to_vec());
228        }
229        let center = Node::new(self.center.public.clone(), Some(self.center.link.clone()));
230        data.append(&mut center.as_bytes());
231        return data;
232    }
233
234    /// Tries to determine whether a given Address is local or not.
235    /// This is not a lookup or exact operation, since closer nodes
236    /// might be unknown to this node. It returns true if no closer
237    /// node than Center is found. (This has to be expanded to
238    /// multiple nodes based on the replication factor of the system).
239    ///
240    /// It works by getting the five closest nodes to the address.
241    /// Then the distances get calculated. The function returns true
242    /// if the distance between the address and the Center is smaller
243    /// than atleast one of the fetched Nodes.
244    pub fn should_be_local(&self, address: &Address) -> bool {
245        if address == &self.center.public {
246            return true;
247        }
248        // 1. Find the closest known node to the target.
249        let nodes = self.get(address, 1);
250
251        if let Some(node) = nodes.first() {
252            // 2. Compute the distance between the target and the found node.
253            let d1 = address ^ &node.address;
254            // 3. Compute the distance between local and the target.
255            let d2 = address ^ &self.center.public;
256            // 4. Check which one is larger.
257            d1 >= d2
258        } else {
259            // Edge case: if no node exists everything should be local.
260            true
261        }
262    }
263
264    /// Return the Address of the Center. Shorthand for the public
265    /// field.
266    pub fn center(&self) -> Address {
267        self.center.public.clone()
268    }
269}
270
271impl Safe {
272    pub fn new(limit: usize, center: Center) -> Self {
273        Self {
274            table: Arc::new(Mutex::new(Table::new(limit, center.clone()))),
275            center: center,
276        }
277    }
278
279    pub fn try_add(&self, node: Node) -> Result<(), Error> {
280        let mut table = self.table.lock().unwrap();
281        (*table).try_add(node)
282    }
283
284    pub fn add(&self, node: Node) {
285        let mut table = self.table.lock().unwrap();
286        (*table).add(node);
287    }
288
289    pub fn remove(&self, address: &Address) -> Result<(), Error> {
290        let mut table = self.table.lock().unwrap();
291        (*table).remove(address)
292    }
293
294    pub fn get_copy(&self, address: &Address, limit: usize) -> Vec<Node> {
295        let table = self.table.lock().unwrap();
296        (*table).get_copy(address, limit)
297    }
298
299    pub fn capacity(&self) -> usize {
300        let table = self.table.lock().unwrap();
301        (*table).capacity()
302    }
303
304    pub fn status(&self, address: &Address, status: bool) {
305        let mut table = self.table.lock().unwrap();
306        (*table).status(address, status);
307    }
308
309    pub fn len(&self) -> usize {
310        let table = self.table.lock().unwrap();
311        (*table).len()
312    }
313
314    pub fn export(&self) -> Vec<u8> {
315        let table = self.table.lock().unwrap();
316        (*table).export()
317    }
318
319    pub fn should_be_local(&self, address: &Address) -> bool {
320        let table = self.table.lock().unwrap();
321        (*table).should_be_local(address)
322    }
323
324    pub fn center(&self) -> Address {
325        self.center.public.clone()
326    }
327}
328
329impl Element {
330    /// Add to an element if possible. If the far bucket is full a
331    /// node will get replaced following kademlia rules. This function
332    /// does not handle refreshing and validating.
333    fn try_add(&mut self, node: Node, center: &Center) -> Result<(), Error> {
334        match self {
335            Self::Split(s, p) => {
336                if !p.in_range(&node.address, &center) {
337                    return Err(Error::Invalid(String::from("not in range")));
338                }
339                if p.is_near() {
340                    s.try_add(node, center)
341                } else {
342                    s.add(node, center);
343                    Ok(())
344                }
345            }
346            Self::Leaf(b, p) => {
347                if !p.in_range(&node.address, &center) {
348                    return Err(Error::Invalid(String::from("not in range")));
349                }
350                b.try_add(node)
351            }
352        }
353    }
354
355    /// Adds the Node to the Element. If the "near" Element is already
356    /// full it gets split and the Element gets added to the new
357    /// Split.
358    fn add(&mut self, node: Node, center: &Center) {
359        match self {
360            Self::Split(s, _) => s.add(node, center),
361            Self::Leaf(b, p) => {
362                if p.is_near() {
363                    match b.try_add(node.clone()) {
364                        Ok(()) => return,
365                        Err(_) => {
366                            // bucket is full => split it. unwrap is
367                            // not an issue, the split only fails if
368                            // the element is not near.
369                            *self = self.clone().split(center).unwrap();
370                            self.add(node, center);
371                        }
372                    }
373                } else {
374                    b.add(node)
375                }
376            }
377        }
378    }
379
380    /// Removes a node from the Element. Currently the function can
381    /// panic, should the split fail. Split gets called once always,
382    /// but the shape of the tree will only change if required. If a
383    /// split is required a new Element is generated and this current
384    /// object is replaced with the new one.
385    fn remove(&mut self, address: &Address, center: &Center) -> Result<(), Error> {
386        if let None = self.find(address, center) {
387            return Err(Error::Unknown);
388        }
389        match self {
390            Self::Split(s, _) => {
391                if s.is_final() {
392                    let _ = s.remove(address, center);
393                    // collaps gets only called if half the capacity
394                    // if less than the length.
395                    if (s.capacity() / 2) > s.len() {
396                        if let Ok(e) = s.collapse() {
397                            // the actual Element (self) gets replaced.
398                            *self = e;
399                        } else {
400                            return Err(Error::Unknown);
401                        }
402                    }
403                } else {
404                    s.remove(address, center)?;
405                }
406            }
407            Self::Leaf(b, _) => {
408                b.remove(address)?;
409            }
410        }
411        Ok(())
412    }
413
414    /// Takes ownership of an Element (Leaf) and splits into two new
415    /// ones, which gets returned as a new Split Element. The center
416    /// is required to calculate the distance. The new Elements will
417    /// all have their properties calculated automatically.
418    fn split(self, center: &Center) -> Option<Self> {
419        match self {
420            Self::Split(_, _) => return None,
421            Self::Leaf(b, p) => {
422                // Only "near" elements can be split.
423                if p.lower != 0 {
424                    return None;
425                }
426                let (near, far) = b.split(center, p.upper);
427                let (near_p, far_p) = p.split();
428                let split = Split {
429                    near: Box::new(Self::Leaf(near, near_p)),
430                    far: Box::new(Self::Leaf(far, far_p)),
431                };
432                Some(Self::Split(split, p))
433            }
434        }
435    }
436
437    /// Returns a pointer to a Node if the provided Address exists in
438    /// the Table.
439    fn find(&self, search: &Address, center: &Center) -> Option<&Node> {
440        if !self.in_range(search, center) {
441            return None;
442        }
443        match self {
444            Self::Split(s, _) => s.find(search, center),
445            Self::Leaf(b, _) => b.find(search),
446        }
447    }
448
449    /// Returns a pointer to a Node if the provided Address exists in
450    /// the Table.
451    fn find_mut(&mut self, search: &Address, center: &Center) -> Option<&mut Node> {
452        if !self.in_range(search, center) {
453            return None;
454        }
455        match self {
456            Self::Split(s, _) => s.find_mut(search, center),
457            Self::Leaf(b, _) => b.find_mut(search),
458        }
459    }
460
461    /// Gets upto the "limit" number of nodes closest to the target
462    /// address. => bottom up recursion
463    fn get(&self, target: &Address, center: &Center, limit: usize) -> Vec<&Node> {
464        match self {
465            Self::Split(s, _) => s.get(target, center, limit),
466            Self::Leaf(b, _) => b.get(limit),
467        }
468    }
469
470    /// Calculates the count of all Nodes under this Element.
471    fn len(&self) -> usize {
472        match self {
473            Self::Split(s, _) => s.len(),
474            Self::Leaf(b, _) => b.len(),
475        }
476    }
477
478    /// Returns the maximum size of all buckets under an element.
479    fn capacity(&self) -> usize {
480        let mut sum = 0;
481        match self {
482            Self::Split(s, _) => sum += s.capacity(),
483            Self::Leaf(b, _) => sum += b.capacity(),
484        }
485        return sum;
486    }
487
488    /// Uses the properties of an Element to determine if an Address
489    /// can be stored in this Element (or below it).
490    fn in_range(&self, address: &Address, center: &Center) -> bool {
491        match self {
492            Self::Split(_, p) => p.in_range(&address, center),
493            Self::Leaf(_, p) => p.in_range(&address, center),
494        }
495    }
496
497    /// Returns true if the Element is a Leaf. This will be used by
498    /// the collaps / remove functions to verify they are operating on
499    /// the bottom most elements.
500    fn is_leaf(&self) -> bool {
501        match self {
502            Self::Split(_, _) => false,
503            Self::Leaf(_, _) => true,
504        }
505    }
506}
507
508impl Split {
509    /// Recursive function that calls try_add on the "near" or "far"
510    /// side the Node belongs to.
511    fn try_add(&mut self, node: Node, center: &Center) -> Result<(), Error> {
512        if self.near.in_range(&node.address, center) {
513            self.near.try_add(node, center)
514        } else {
515            self.far.try_add(node, center)
516        }
517    }
518
519    /// Recursive function that calls add on the "near" or "far" side
520    /// the Node belongs to.
521    fn add(&mut self, node: Node, center: &Center) {
522        if self.near.in_range(&node.address, center) {
523            self.near.add(node, center)
524        } else {
525            self.far.add(node, center)
526        }
527    }
528
529    /// Recursive function that calls find on the correct side for the
530    /// Address.
531    fn find(&self, search: &Address, center: &Center) -> Option<&Node> {
532        if self.near.in_range(search, center) {
533            self.near.find(search, center)
534        } else {
535            self.far.find(search, center)
536        }
537    }
538
539    /// Recursive function that calls find on the correct side for the
540    /// Address.
541    fn find_mut(&mut self, search: &Address, center: &Center) -> Option<&mut Node> {
542        if self.near.in_range(search, center) {
543            self.near.find_mut(search, center)
544        } else {
545            self.far.find_mut(search, center)
546        }
547    }
548
549    /// Recursive function that finds the "limit" number of closest
550    /// nodes to a given Address. It tries get all of them from the
551    /// element the target is in but will use both sides if no target
552    /// is available.
553    fn get(&self, target: &Address, center: &Center, limit: usize) -> Vec<&Node> {
554        let mut nodes = Vec::new();
555        if self.near.in_range(&target, &center) {
556            nodes.append(&mut self.near.get(target, center, limit));
557            if nodes.len() >= limit {
558                nodes.truncate(limit);
559                return nodes;
560            } else {
561                nodes.append(&mut self.far.get(target, center, limit));
562                nodes.truncate(limit);
563                return nodes;
564            }
565        } else {
566            nodes.append(&mut self.far.get(target, center, limit));
567            if nodes.len() >= limit {
568                nodes.truncate(limit);
569                return nodes;
570            } else {
571                nodes.append(&mut self.near.get(target, center, limit));
572                nodes.truncate(limit);
573                return nodes;
574            }
575        }
576    }
577
578    /// Designated the remove call to the correct Element (near / far).
579    fn remove(&mut self, address: &Address, center: &Center) -> Result<(), Error> {
580        if self.near.in_range(address, center) {
581            self.near.remove(address, center)
582        } else {
583            self.far.remove(address, center)
584        }
585    }
586
587    /// Core method for updating the shape of the tree after removing
588    /// Elements. It will allocate two new arrays, get all the
589    /// Elements from the two Leaf Buckets and then create a new
590    /// Bucket & Element with the combined array. It will check if the
591    /// total length is exceeded and only fail not both of the
592    /// Elements are Leafs.
593    fn collapse(&self) -> Result<Element, Error> {
594        let mut nodes = Vec::new();
595        let lower;
596        let upper;
597        let limit;
598        if let Element::Leaf(b, p) = &*self.near {
599            nodes.append(&mut b.get(b.capacity()));
600            lower = p.lower;
601            limit = b.capacity();
602        } else {
603            return Err(Error::Unknown);
604        }
605        if let Element::Leaf(b, p) = &*self.far {
606            nodes.append(&mut b.get(b.capacity()));
607            upper = p.upper;
608        } else {
609            return Err(Error::Unknown);
610        }
611        if nodes.len() > limit {
612            return Err(Error::Unknown);
613        }
614        let mut bucket = Bucket::new(limit);
615        for i in nodes.into_iter() {
616            bucket.add(i.clone());
617        }
618        let prop = Property { lower, upper };
619        Ok(Element::Leaf(bucket, prop))
620    }
621
622    /// Sums up the length of all Elements below the Split recursivly.
623    fn len(&self) -> usize {
624        let mut length = self.far.len();
625        match &*self.near {
626            Element::Leaf(b, _) => length += b.len(),
627            Element::Split(s, _) => length += s.len(),
628        }
629        return length;
630    }
631
632    /// Sums up the capacity of all Elements below the Split
633    /// recursivly.
634    fn capacity(&self) -> usize {
635        let mut sum = self.near.capacity();
636        sum += self.far.capacity();
637        return sum;
638    }
639
640    fn is_final(&self) -> bool {
641        self.near.is_leaf() && self.far.is_leaf()
642    }
643}
644
645impl Property {
646    /// Determines whether an address is within range of the given
647    /// Property. It does this by calculating the XOR Distance between
648    /// the Node and the Center. If the first significant byte falls
649    /// within the range it will return true.
650    fn in_range(&self, address: &Address, center: &Center) -> bool {
651        let index = (address.clone() ^ center.public.clone())[0];
652        self.lower <= index && self.upper > index
653    }
654
655    /// Splits the Property of an Element. Unlike the similar function
656    /// for Elements this will not return one object or modify an
657    /// existing one, instead it will return two dedicated properties
658    /// as a tuple with the first one being the "near" Property and
659    /// the last one being the "far" Property.
660    fn split(&self) -> (Self, Self) {
661        let lower = Self {
662            lower: self.lower,
663            upper: self.upper / 2,
664        };
665        let upper = Self {
666            lower: (self.upper / 2) + 1,
667            upper: self.upper,
668        };
669        (lower, upper)
670    }
671
672    /// Simply checks if the lower property is zero, which means the
673    /// Element is "near".
674    fn is_near(&self) -> bool {
675        self.lower == 0
676    }
677}
678
679#[cfg(test)]
680mod tests {
681    use super::*;
682    use sodiumoxide::crypto::box_::curve25519xsalsa20poly1305::SecretKey;
683
684    #[test]
685    fn test_full_duplicate() {
686        let b = gen_bucket();
687        let p = Property {
688            lower: 0,
689            upper: 255,
690        };
691        let mut elem = Element::Leaf(b, p);
692        let center = gen_center();
693
694        for i in 0..40 {
695            elem.add(gen_node(&i.to_string()), &center);
696        }
697
698        assert_eq!(elem.len(), 40);
699
700        for i in 0..40 {
701            let _ = elem.add(gen_node(&i.to_string()), &center);
702        }
703
704        assert_eq!(elem.len(), 40);
705    }
706
707    #[test]
708    fn test_full_stress() {
709        let b = gen_bucket();
710        let p = Property {
711            lower: 0,
712            upper: 255,
713        };
714        let mut elem = Element::Leaf(b, p);
715        let center = gen_center();
716
717        for i in 0..1000 {
718            elem.add(gen_node(&i.to_string()), &center);
719        }
720
721        for i in 100..1100 {
722            let _ = elem.remove(&gen_node(&i.to_string()).address, &center);
723        }
724
725        for i in 0..1000 {
726            elem.add(gen_node(&i.to_string()), &center);
727        }
728
729        for i in 100..1100 {
730            let _ = elem.remove(&gen_node(&i.to_string()).address, &center);
731        }
732
733        let a = elem.len() <= elem.capacity();
734
735        assert_eq!(a, true);
736    }
737
738    #[test]
739    fn test_capacity_get() {
740        let b = gen_bucket();
741        let p = Property {
742            lower: 0,
743            upper: 255,
744        };
745        let mut elem = Element::Leaf(b, p);
746        let center = gen_center();
747
748        for i in 0..1000 {
749            elem.add(gen_node(&i.to_string()), &center);
750        }
751
752        let nodes = elem.get(&center.public, &center, elem.len());
753        assert_eq!(nodes.len(), elem.len());
754    }
755
756    #[test]
757    fn test_property_in_range() {
758        let p = Property {
759            lower: 0,
760            upper: 255,
761        };
762        let node = gen_node_near();
763        let center = gen_center_near();
764        assert_eq!(p.in_range(&node.address, &center), true);
765        assert_eq!((node.address ^ center.public)[0], 0);
766    }
767
768    #[test]
769    fn test_property_split_root() {
770        let p = Property {
771            lower: 0,
772            upper: 255,
773        };
774        let (l, u) = p.split();
775        assert_eq!(l.lower, 0);
776        assert_eq!(l.upper, 127);
777        assert_eq!(u.lower, 128);
778        assert_eq!(u.upper, 255);
779    }
780
781    #[test]
782    fn test_property_split_lower() {
783        let p = Property {
784            lower: 0,
785            upper: 63,
786        };
787        let (l, u) = p.split();
788        assert_eq!(l.lower, 0);
789        assert_eq!(l.upper, 31);
790        assert_eq!(u.lower, 32);
791        assert_eq!(u.upper, 63);
792    }
793
794    #[test]
795    fn test_property_near() {
796        let p = Property {
797            lower: 0,
798            upper: 63,
799        };
800        let (l, u) = p.split();
801        assert_eq!(l.is_near(), true);
802        assert_eq!(u.is_near(), false);
803    }
804
805    #[test]
806    fn test_element_try_add() {
807        let bucket = Bucket::new(1);
808        let prop = Property {
809            lower: 0,
810            upper: 63,
811        };
812        let mut elem = Element::Leaf(bucket, prop);
813        let node = gen_node_near();
814        let center = gen_center_near();
815        elem.add(node, &center);
816
817        let node = gen_node_far();
818        let s = elem.try_add(node, &center);
819        assert_eq!(s.is_err(), true);
820    }
821
822    #[test]
823    fn test_element_split_root() {
824        let prop = Property {
825            lower: 0,
826            upper: 255,
827        };
828        let buck = gen_bucket();
829        let elem = Element::Leaf(buck, prop);
830        let center = gen_center();
831        let split = elem.split(&center).unwrap();
832        match split {
833            Element::Split(s, p) => {
834                assert_eq!(p.upper, 255);
835                assert_eq!(s.len(), 3);
836                assert_eq!(s.near.as_ref().len(), 2);
837            }
838            Element::Leaf(_, _) => assert_eq!("invalid split", ""),
839        }
840    }
841
842    #[test]
843    fn test_element_split_far() {
844        let prop = Property {
845            lower: 128,
846            upper: 255,
847        };
848        let buck = gen_bucket();
849        let elem = Element::Leaf(buck, prop);
850        let center = gen_center();
851        let split = elem.split(&center).is_none();
852        assert_eq!(split, true);
853    }
854
855    #[test]
856    fn test_element_add_to_leaf() {
857        let bucket = gen_bucket();
858        let prop = Property {
859            lower: 0,
860            upper: 255,
861        };
862        let mut elem = Element::Leaf(bucket, prop);
863        let node = gen_node("added");
864        let center = gen_center();
865        elem.add(node, &center);
866        assert_eq!(elem.len(), 4);
867    }
868
869    #[test]
870    fn test_element_split() {
871        let bucket = Bucket::new(1);
872        let prop = Property {
873            lower: 0,
874            upper: 255,
875        };
876        let mut elem = Element::Leaf(bucket, prop);
877        let center = gen_center_near();
878        let node = gen_node_near();
879        elem.add(node, &center);
880
881        let node = gen_node_far();
882        elem.add(node, &center);
883
884        assert_eq!(elem.len(), 2);
885        match elem {
886            Element::Split(s, _) => {
887                assert_eq!(s.len(), 2);
888                assert_eq!(s.near.len(), 1);
889                assert_eq!(s.far.len(), 1);
890            }
891            Element::Leaf(_, _) => assert_eq!("split failed", ""),
892        }
893    }
894
895    #[test]
896    fn test_element_split_near() {
897        let bucket = Bucket::new(1);
898        let prop = Property {
899            lower: 0,
900            upper: 255,
901        };
902        let mut elem = Element::Leaf(bucket, prop);
903        let center = gen_center_near();
904        let node = gen_node_near();
905        elem.add(node, &center);
906
907        let node = gen_node_near();
908        elem.add(node, &center);
909
910        assert_eq!(elem.len(), 1);
911        match elem {
912            Element::Split(s, _) => {
913                assert_eq!(s.len(), 1);
914                assert_eq!(s.near.len(), 1);
915                assert_eq!(s.far.len(), 0);
916            }
917            Element::Leaf(_, _) => assert_eq!("split failed", ""),
918        }
919    }
920
921    #[test]
922    fn test_element_find_top() {
923        let bucket = Bucket::new(20);
924        let prop = Property {
925            lower: 0,
926            upper: 255,
927        };
928        let mut elem = Element::Leaf(bucket, prop);
929        let center = gen_center_near();
930
931        let node = gen_node("searching");
932        let searching = node.address.clone();
933        elem.add(node, &center);
934
935        assert_eq!(elem.len(), 1);
936        let node = elem.find(&searching, &center).unwrap();
937        assert_eq!(node.address, searching);
938    }
939
940    #[test]
941    fn test_element_find_deep() {
942        let split = Split {
943            near: Box::new(Element::Split(
944                Split {
945                    near: Box::new(Element::Leaf(
946                        Bucket::new(20),
947                        Property {
948                            lower: 0,
949                            upper: 63,
950                        },
951                    )),
952                    far: Box::new(Element::Leaf(
953                        Bucket::new(20),
954                        Property {
955                            lower: 64,
956                            upper: 127,
957                        },
958                    )),
959                },
960                Property {
961                    lower: 0,
962                    upper: 127,
963                },
964            )),
965            far: Box::new(Element::Leaf(
966                Bucket::new(20),
967                Property {
968                    lower: 128,
969                    upper: 255,
970                },
971            )),
972        };
973
974        let props = Property {
975            lower: 0,
976            upper: 255,
977        };
978        let mut elem = Element::Split(split, props);
979        let center = gen_center_near();
980
981        let node = gen_node("searching");
982        let searching = node.address.clone();
983        elem.add(node, &center);
984
985        assert_eq!(elem.len(), 1);
986        let node = elem.find(&searching, &center).unwrap();
987        assert_eq!(node.address, searching);
988    }
989
990    #[test]
991    fn test_element_get_top() {
992        let bucket = Bucket::new(20);
993        let prop = Property {
994            lower: 0,
995            upper: 255,
996        };
997        let mut elem = Element::Leaf(bucket, prop);
998        let center = gen_center_near();
999
1000        let node = gen_node("searching");
1001        elem.add(node, &center);
1002        let node = gen_node("random");
1003        elem.add(node, &center);
1004        let node = gen_node("string");
1005        elem.add(node, &center);
1006        let node = gen_node("actaeon");
1007        elem.add(node, &center);
1008        let node = gen_node("data");
1009        elem.add(node, &center);
1010
1011        let target = gen_node("target").address;
1012        let targets = elem.get(&target, &center, 5);
1013        assert_eq!(targets.len(), 5);
1014    }
1015
1016    #[test]
1017    fn test_element_get_empty() {
1018        let bucket = Bucket::new(20);
1019        let prop = Property {
1020            lower: 0,
1021            upper: 255,
1022        };
1023        let elem = Element::Leaf(bucket, prop);
1024        let center = gen_center_near();
1025        let target = gen_node("target").address;
1026        let targets = elem.get(&target, &center, 5);
1027        assert_eq!(targets.len(), 0);
1028    }
1029
1030    #[test]
1031    fn test_element_get_deep() {
1032        let split = Split {
1033            near: Box::new(Element::Split(
1034                Split {
1035                    near: Box::new(Element::Leaf(
1036                        Bucket::new(20),
1037                        Property {
1038                            lower: 0,
1039                            upper: 63,
1040                        },
1041                    )),
1042                    far: Box::new(Element::Leaf(
1043                        Bucket::new(20),
1044                        Property {
1045                            lower: 64,
1046                            upper: 127,
1047                        },
1048                    )),
1049                },
1050                Property {
1051                    lower: 0,
1052                    upper: 127,
1053                },
1054            )),
1055            far: Box::new(Element::Leaf(
1056                Bucket::new(20),
1057                Property {
1058                    lower: 128,
1059                    upper: 255,
1060                },
1061            )),
1062        };
1063
1064        let props = Property {
1065            lower: 0,
1066            upper: 255,
1067        };
1068        let mut elem = Element::Split(split, props);
1069        let center = gen_center_near();
1070
1071        let node = gen_node("searching");
1072        elem.add(node, &center);
1073        let node = gen_node("random");
1074        elem.add(node, &center);
1075        let node = gen_node("string");
1076        elem.add(node, &center);
1077        let node = gen_node("actaeon");
1078        elem.add(node, &center);
1079        let node = gen_node("data");
1080        elem.add(node, &center);
1081
1082        let node = gen_node("searching2");
1083        elem.add(node, &center);
1084        let node = gen_node("random2");
1085        elem.add(node, &center);
1086        let node = gen_node("string2");
1087        elem.add(node, &center);
1088        let node = gen_node("actaeon2");
1089        elem.add(node, &center);
1090        let node = gen_node("maybe use a loop for this?");
1091        elem.add(node, &center);
1092
1093        let target = gen_node("target").address;
1094        let targets = elem.get(&target, &center, 5);
1095        assert_eq!(targets.len(), 5);
1096    }
1097
1098    #[test]
1099    fn test_element_remove_root() {
1100        let bucket = Bucket::new(20);
1101        let prop = Property {
1102            lower: 0,
1103            upper: 255,
1104        };
1105        let mut elem = Element::Leaf(bucket, prop);
1106
1107        let center = gen_center();
1108
1109        let node = gen_node("test");
1110        elem.add(node, &center);
1111
1112        assert_eq!(elem.len(), 1);
1113
1114        let node = gen_node("test");
1115        let _ = elem.remove(&node.address, &center);
1116        assert_eq!(elem.len(), 0);
1117    }
1118
1119    #[test]
1120    fn test_element_remove_deep() {
1121        let split = Split {
1122            near: Box::new(Element::Split(
1123                Split {
1124                    near: Box::new(Element::Leaf(
1125                        Bucket::new(20),
1126                        Property {
1127                            lower: 0,
1128                            upper: 63,
1129                        },
1130                    )),
1131                    far: Box::new(Element::Leaf(
1132                        Bucket::new(20),
1133                        Property {
1134                            lower: 64,
1135                            upper: 127,
1136                        },
1137                    )),
1138                },
1139                Property {
1140                    lower: 0,
1141                    upper: 127,
1142                },
1143            )),
1144            far: Box::new(Element::Leaf(
1145                Bucket::new(20),
1146                Property {
1147                    lower: 128,
1148                    upper: 255,
1149                },
1150            )),
1151        };
1152
1153        let props = Property {
1154            lower: 0,
1155            upper: 255,
1156        };
1157        let mut elem = Element::Split(split, props);
1158        let center = gen_center_near();
1159
1160        let node = gen_node("searching");
1161        elem.add(node, &center);
1162        let node = gen_node("random");
1163        elem.add(node, &center);
1164        let node = gen_node("string");
1165        elem.add(node, &center);
1166        let node = gen_node("actaeon");
1167        elem.add(node, &center);
1168        let node = gen_node("data");
1169        elem.add(node, &center);
1170
1171        let node = gen_node("searching2");
1172        elem.add(node, &center);
1173        let node = gen_node("random2");
1174        elem.add(node, &center);
1175        let node = gen_node("string2");
1176        elem.add(node, &center);
1177        let node = gen_node("actaeon2");
1178        elem.add(node, &center);
1179        let node = gen_node("maybe use a loop for this?");
1180        elem.add(node, &center);
1181
1182        let target = gen_node("random");
1183        assert_eq!(elem.len(), 10);
1184        let _ = elem.remove(&target.address, &center);
1185        assert_eq!(elem.len(), 9);
1186    }
1187
1188    #[test]
1189    fn test_element_remove_collaps() {
1190        let split = Split {
1191            near: Box::new(Element::Split(
1192                Split {
1193                    near: Box::new(Element::Leaf(
1194                        Bucket::new(20),
1195                        Property {
1196                            lower: 0,
1197                            upper: 63,
1198                        },
1199                    )),
1200                    far: Box::new(Element::Leaf(
1201                        Bucket::new(20),
1202                        Property {
1203                            lower: 64,
1204                            upper: 127,
1205                        },
1206                    )),
1207                },
1208                Property {
1209                    lower: 0,
1210                    upper: 127,
1211                },
1212            )),
1213            far: Box::new(Element::Leaf(
1214                Bucket::new(20),
1215                Property {
1216                    lower: 128,
1217                    upper: 255,
1218                },
1219            )),
1220        };
1221
1222        let props = Property {
1223            lower: 0,
1224            upper: 255,
1225        };
1226
1227        let mut elem = Element::Split(split, props);
1228        let center = gen_center_near();
1229
1230        for i in 0..40 {
1231            elem.add(gen_node(&i.to_string()), &center);
1232        }
1233
1234        assert_eq!(elem.len(), 40);
1235
1236        for i in 0..40 {
1237            let _ = elem.remove(&gen_node(&i.to_string()).address, &center);
1238        }
1239
1240        assert_eq!(elem.len(), 0);
1241
1242        if let Element::Leaf(b, _) = elem {
1243            assert_eq!(b.len(), 0);
1244        }
1245    }
1246
1247    #[test]
1248    fn test_split_add_near_top() {
1249        let mut split = gen_split();
1250        let node = gen_node_near();
1251        let center = gen_center_near();
1252        split.add(node, &center);
1253        assert_eq!(split.len(), 1);
1254        assert_eq!(split.near.len(), 1);
1255        assert_eq!(split.far.len(), 0);
1256    }
1257
1258    #[test]
1259    fn test_split_add_far_top() {
1260        let mut split = gen_split();
1261        let node = gen_node_far();
1262        let center = gen_center_near();
1263        let a = (node.address.clone() ^ center.public.clone())[0];
1264        split.add(node, &center);
1265        assert_eq!(split.len(), 1);
1266        assert_eq!(a, 255);
1267        assert_eq!(split.far.len(), 1);
1268    }
1269
1270    #[test]
1271    fn test_split_add_deep() {
1272        let mut split = Split {
1273            near: Box::new(Element::Split(
1274                Split {
1275                    near: Box::new(Element::Leaf(
1276                        Bucket::new(20),
1277                        Property {
1278                            lower: 0,
1279                            upper: 63,
1280                        },
1281                    )),
1282                    far: Box::new(Element::Leaf(
1283                        Bucket::new(20),
1284                        Property {
1285                            lower: 64,
1286                            upper: 127,
1287                        },
1288                    )),
1289                },
1290                Property {
1291                    lower: 0,
1292                    upper: 127,
1293                },
1294            )),
1295            far: Box::new(Element::Leaf(
1296                Bucket::new(20),
1297                Property {
1298                    lower: 128,
1299                    upper: 255,
1300                },
1301            )),
1302        };
1303        assert_eq!(split.len(), 0);
1304
1305        let center = gen_center_near();
1306        let node = gen_node_near();
1307        split.add(node, &center);
1308        assert_eq!(split.len(), 1);
1309        assert_eq!(split.near.as_ref().len(), 1);
1310        assert_eq!(split.far.as_ref().len(), 0);
1311
1312        let node = gen_node_far();
1313        split.add(node, &center);
1314        assert_eq!(split.len(), 2);
1315        assert_eq!(split.near.as_ref().len(), 1);
1316        assert_eq!(split.far.as_ref().len(), 1);
1317    }
1318
1319    #[test]
1320    fn test_split_in_range() {
1321        let split = gen_split();
1322        let center = gen_center_near();
1323        let node = gen_node_near();
1324        assert_eq!(split.near.in_range(&node.address, &center), true);
1325    }
1326
1327    #[test]
1328    fn test_split_collaps_working() {
1329        let mut split = gen_split();
1330        let center = gen_center_near();
1331        let node = gen_node("first");
1332        split.add(node, &center);
1333        let node = gen_node("second");
1334        split.add(node, &center);
1335        let node = gen_node_far();
1336        split.add(node, &center);
1337        let node = gen_node_near();
1338        split.add(node, &center);
1339        assert_eq!(split.len(), 4);
1340        let e = split.collapse().unwrap();
1341        assert_eq!(e.len(), 4);
1342    }
1343
1344    #[test]
1345    fn test_split_in_range_far() {
1346        let split = gen_split();
1347        let center = gen_center_near();
1348        let node = gen_node_far();
1349        assert_eq!(split.near.in_range(&node.address, &center), false);
1350    }
1351
1352    #[test]
1353    fn test_should_be_local_manual() {
1354        let center = gen_center_near();
1355        let address = gen_node_near().address;
1356        let nodes = vec![
1357            gen_node("first"),
1358            gen_node("second"),
1359            gen_node("third"),
1360            gen_node("fourth"),
1361            gen_node("fifth"),
1362        ];
1363        let mut addrs: Vec<Address> = nodes.iter().map(|x| x.address.clone()).collect();
1364        addrs.push(address.clone());
1365        addrs.sort_by(|a, b| {
1366            let left = (a.clone() ^ center.public.clone())[0];
1367            let right = (b.clone() ^ center.public.clone())[0];
1368            left.partial_cmp(&right).unwrap()
1369        });
1370        let index = addrs.iter().position(|e| e == &center.public);
1371        let res = match index {
1372            Some(i) => i <= 3,
1373            None => false,
1374        };
1375        assert_eq!(res, true);
1376    }
1377
1378    #[test]
1379    fn test_safe_multi() {
1380        let center = gen_center();
1381        let safe = Safe::new(10, center);
1382        let inner = safe.clone();
1383        std::thread::spawn(move || {
1384            let node = gen_node("first");
1385            inner.add(node);
1386        });
1387        std::thread::sleep(std::time::Duration::from_millis(42));
1388        assert_eq!(safe.len(), 1);
1389    }
1390
1391    #[test]
1392    fn test_safe_random() {
1393        let center = gen_center();
1394        let safe = Safe::new(100, center);
1395        let inner = safe.clone();
1396        std::thread::spawn(move || {
1397            for i in 0..100 {
1398                inner.add(gen_node(&i.to_string()))
1399            }
1400        });
1401        std::thread::sleep(std::time::Duration::from_millis(42));
1402        assert_eq!(safe.len(), 100);
1403    }
1404
1405    fn gen_split() -> Split {
1406        let near = Bucket::new(20);
1407        let np = Property {
1408            lower: 0,
1409            upper: 127,
1410        };
1411        let near = Element::Leaf(near, np);
1412        let far = Bucket::new(20);
1413        let fp = Property {
1414            lower: 128,
1415            upper: 255,
1416        };
1417        let far = Element::Leaf(far, fp);
1418        Split {
1419            near: Box::new(near),
1420            far: Box::new(far),
1421        }
1422    }
1423
1424    fn gen_bucket() -> Bucket {
1425        let mut root = Bucket::new(20);
1426        root.add(gen_node("first"));
1427        root.add(gen_node("second"));
1428        root.add(gen_node("another"));
1429        root
1430    }
1431
1432    fn gen_node(s: &str) -> Node {
1433        Node::new(Address::generate(s), None)
1434    }
1435
1436    fn gen_node_near() -> Node {
1437        let addr = Address::from_bytes([0; 32]);
1438        Node::new(addr, None)
1439    }
1440
1441    fn gen_node_far() -> Node {
1442        let addr = Address::from_bytes([255; 32]);
1443        Node::new(addr, None)
1444    }
1445
1446    fn gen_center() -> Center {
1447        let mut b = [0; 32];
1448        b[0] = 42;
1449        let s = SecretKey::from_slice(&b).unwrap();
1450        Center::new(s, String::from(""), 8080)
1451    }
1452
1453    fn gen_center_near() -> Center {
1454        let secret = [0; 32];
1455        let secret = SecretKey::from_slice(&secret).unwrap();
1456        let public = [0; 32];
1457
1458        let b = [0; 32];
1459        let s = SecretKey::from_slice(&b).unwrap();
1460        let base = Center::new(s, String::from(""), 8080);
1461
1462        Center {
1463            secret,
1464            public: Address::from_bytes(public),
1465            ..base
1466        }
1467    }
1468}