1use crate::bucket::Bucket;
8use crate::error::Error;
9use crate::node::{Address, Center, Node};
10use std::sync::{Arc, Mutex};
11
12pub struct Table {
18 root: Element,
22 center: Center,
25}
26
27#[derive(Clone)]
30pub struct Safe {
31 table: Arc<Mutex<Table>>,
32 center: Center,
33}
34
35#[derive(Clone, Debug)]
52struct Property {
53 lower: u8,
55 upper: u8,
58}
59
60#[derive(Clone, Debug)]
67enum Element {
68 Split(Split, Property),
72 Leaf(Bucket, Property),
76}
77
78#[derive(Clone, Debug)]
86struct Split {
87 near: Box<Element>,
89 far: Box<Element>,
92}
93
94impl Table {
95 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 pub fn try_add(&mut self, node: Node) -> Result<(), Error> {
121 self.root.try_add(node, &self.center)
122 }
123
124 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 pub fn remove(&mut self, address: &Address) -> Result<(), Error> {
150 self.root.remove(address, &self.center)
151 }
152
153 pub fn find(&self, address: &Address) -> Option<&Node> {
158 self.root.find(address, &self.center)
159 }
160
161 pub fn find_mut(&mut self, address: &Address) -> Option<&mut Node> {
166 self.root.find_mut(address, &self.center)
167 }
168
169 pub fn get(&self, address: &Address, limit: usize) -> Vec<&Node> {
178 self.root.get(address, &self.center, limit)
179 }
180
181 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 pub fn capacity(&self) -> usize {
199 self.root.capacity()
200 }
201
202 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 pub fn len(&self) -> usize {
216 self.root.len()
217 }
218
219 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 pub fn should_be_local(&self, address: &Address) -> bool {
245 if address == &self.center.public {
246 return true;
247 }
248 let nodes = self.get(address, 1);
250
251 if let Some(node) = nodes.first() {
252 let d1 = address ^ &node.address;
254 let d2 = address ^ &self.center.public;
256 d1 >= d2
258 } else {
259 true
261 }
262 }
263
264 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 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, ¢er) {
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, ¢er) {
348 return Err(Error::Invalid(String::from("not in range")));
349 }
350 b.try_add(node)
351 }
352 }
353 }
354
355 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 *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 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 if (s.capacity() / 2) > s.len() {
396 if let Ok(e) = s.collapse() {
397 *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 fn split(self, center: &Center) -> Option<Self> {
419 match self {
420 Self::Split(_, _) => return None,
421 Self::Leaf(b, p) => {
422 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 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 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 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 fn len(&self) -> usize {
472 match self {
473 Self::Split(s, _) => s.len(),
474 Self::Leaf(b, _) => b.len(),
475 }
476 }
477
478 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 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 fn is_leaf(&self) -> bool {
501 match self {
502 Self::Split(_, _) => false,
503 Self::Leaf(_, _) => true,
504 }
505 }
506}
507
508impl Split {
509 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 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 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 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 fn get(&self, target: &Address, center: &Center, limit: usize) -> Vec<&Node> {
554 let mut nodes = Vec::new();
555 if self.near.in_range(&target, ¢er) {
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 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 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 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 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 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 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 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()), ¢er);
696 }
697
698 assert_eq!(elem.len(), 40);
699
700 for i in 0..40 {
701 let _ = elem.add(gen_node(&i.to_string()), ¢er);
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()), ¢er);
719 }
720
721 for i in 100..1100 {
722 let _ = elem.remove(&gen_node(&i.to_string()).address, ¢er);
723 }
724
725 for i in 0..1000 {
726 elem.add(gen_node(&i.to_string()), ¢er);
727 }
728
729 for i in 100..1100 {
730 let _ = elem.remove(&gen_node(&i.to_string()).address, ¢er);
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()), ¢er);
750 }
751
752 let nodes = elem.get(¢er.public, ¢er, 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, ¢er), 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, ¢er);
816
817 let node = gen_node_far();
818 let s = elem.try_add(node, ¢er);
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(¢er).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(¢er).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, ¢er);
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, ¢er);
880
881 let node = gen_node_far();
882 elem.add(node, ¢er);
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, ¢er);
906
907 let node = gen_node_near();
908 elem.add(node, ¢er);
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, ¢er);
934
935 assert_eq!(elem.len(), 1);
936 let node = elem.find(&searching, ¢er).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, ¢er);
984
985 assert_eq!(elem.len(), 1);
986 let node = elem.find(&searching, ¢er).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, ¢er);
1002 let node = gen_node("random");
1003 elem.add(node, ¢er);
1004 let node = gen_node("string");
1005 elem.add(node, ¢er);
1006 let node = gen_node("actaeon");
1007 elem.add(node, ¢er);
1008 let node = gen_node("data");
1009 elem.add(node, ¢er);
1010
1011 let target = gen_node("target").address;
1012 let targets = elem.get(&target, ¢er, 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, ¢er, 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, ¢er);
1073 let node = gen_node("random");
1074 elem.add(node, ¢er);
1075 let node = gen_node("string");
1076 elem.add(node, ¢er);
1077 let node = gen_node("actaeon");
1078 elem.add(node, ¢er);
1079 let node = gen_node("data");
1080 elem.add(node, ¢er);
1081
1082 let node = gen_node("searching2");
1083 elem.add(node, ¢er);
1084 let node = gen_node("random2");
1085 elem.add(node, ¢er);
1086 let node = gen_node("string2");
1087 elem.add(node, ¢er);
1088 let node = gen_node("actaeon2");
1089 elem.add(node, ¢er);
1090 let node = gen_node("maybe use a loop for this?");
1091 elem.add(node, ¢er);
1092
1093 let target = gen_node("target").address;
1094 let targets = elem.get(&target, ¢er, 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, ¢er);
1111
1112 assert_eq!(elem.len(), 1);
1113
1114 let node = gen_node("test");
1115 let _ = elem.remove(&node.address, ¢er);
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, ¢er);
1162 let node = gen_node("random");
1163 elem.add(node, ¢er);
1164 let node = gen_node("string");
1165 elem.add(node, ¢er);
1166 let node = gen_node("actaeon");
1167 elem.add(node, ¢er);
1168 let node = gen_node("data");
1169 elem.add(node, ¢er);
1170
1171 let node = gen_node("searching2");
1172 elem.add(node, ¢er);
1173 let node = gen_node("random2");
1174 elem.add(node, ¢er);
1175 let node = gen_node("string2");
1176 elem.add(node, ¢er);
1177 let node = gen_node("actaeon2");
1178 elem.add(node, ¢er);
1179 let node = gen_node("maybe use a loop for this?");
1180 elem.add(node, ¢er);
1181
1182 let target = gen_node("random");
1183 assert_eq!(elem.len(), 10);
1184 let _ = elem.remove(&target.address, ¢er);
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()), ¢er);
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, ¢er);
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, ¢er);
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, ¢er);
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, ¢er);
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, ¢er);
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, ¢er), 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, ¢er);
1333 let node = gen_node("second");
1334 split.add(node, ¢er);
1335 let node = gen_node_far();
1336 split.add(node, ¢er);
1337 let node = gen_node_near();
1338 split.add(node, ¢er);
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, ¢er), 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 == ¢er.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}