Hex Artifact Content
Not logged in

Artifact 9a82dcd862262fd3afa671c2279c5a67bc95c36d:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 36 20 4d 61 69 64 53 61 66 65 2e 6e 65 74 20 6c  6 MaidSafe.net l
0020: 69 6d 69 74 65 64 2e 0a 2f 2f 0a 2f 2f 20 54 68  imited..//.// Th
0030: 69 73 20 53 41 46 45 20 4e 65 74 77 6f 72 6b 20  is SAFE Network 
0040: 53 6f 66 74 77 61 72 65 20 69 73 20 6c 69 63 65  Software is lice
0050: 6e 73 65 64 20 74 6f 20 79 6f 75 20 75 6e 64 65  nsed to you unde
0060: 72 20 28 31 29 20 74 68 65 20 4d 61 69 64 53 61  r (1) the MaidSa
0070: 66 65 2e 6e 65 74 20 43 6f 6d 6d 65 72 63 69 61  fe.net Commercia
0080: 6c 20 4c 69 63 65 6e 73 65 2c 0a 2f 2f 20 76 65  l License,.// ve
0090: 72 73 69 6f 6e 20 31 2e 30 20 6f 72 20 6c 61 74  rsion 1.0 or lat
00a0: 65 72 2c 20 6f 72 20 28 32 29 20 54 68 65 20 47  er, or (2) The G
00b0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
00c0: 63 65 6e 73 65 20 28 47 50 4c 29 2c 20 76 65 72  cense (GPL), ver
00d0: 73 69 6f 6e 20 33 2c 20 64 65 70 65 6e 64 69 6e  sion 3, dependin
00e0: 67 20 6f 6e 20 77 68 69 63 68 0a 2f 2f 20 6c 69  g on which.// li
00f0: 63 65 6e 63 65 20 79 6f 75 20 61 63 63 65 70 74  cence you accept
0100: 65 64 20 6f 6e 20 69 6e 69 74 69 61 6c 20 61 63  ed on initial ac
0110: 63 65 73 73 20 74 6f 20 74 68 65 20 53 6f 66 74  cess to the Soft
0120: 77 61 72 65 20 28 74 68 65 20 22 4c 69 63 65 6e  ware (the "Licen
0130: 63 65 73 22 29 2e 0a 2f 2f 0a 2f 2f 20 42 79 20  ces")..//.// By 
0140: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 63 6f 64  contributing cod
0150: 65 20 74 6f 20 74 68 65 20 53 41 46 45 20 4e 65  e to the SAFE Ne
0160: 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 2c 20  twork Software, 
0170: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 6a 65  or to this proje
0180: 63 74 20 67 65 6e 65 72 61 6c 6c 79 2c 20 79 6f  ct generally, yo
0190: 75 20 61 67 72 65 65 20 74 6f 20 62 65 0a 2f 2f  u agree to be.//
01a0: 20 62 6f 75 6e 64 20 62 79 20 74 68 65 20 74 65   bound by the te
01b0: 72 6d 73 20 6f 66 20 74 68 65 20 4d 61 69 64 53  rms of the MaidS
01c0: 61 66 65 20 43 6f 6e 74 72 69 62 75 74 6f 72 20  afe Contributor 
01d0: 41 67 72 65 65 6d 65 6e 74 2e 20 20 54 68 69 73  Agreement.  This
01e0: 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  , along with the
01f0: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0200: 0a 2f 2f 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  .// found in the
0210: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   root directory 
0220: 6f 66 20 74 68 69 73 20 70 72 6f 6a 65 63 74 20  of this project 
0230: 61 74 20 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59  at LICENSE, COPY
0240: 49 4e 47 20 61 6e 64 20 43 4f 4e 54 52 49 42 55  ING and CONTRIBU
0250: 54 4f 52 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73  TOR..//.// Unles
0260: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70  s required by ap
0270: 70 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20  plicable law or 
0280: 61 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69  agreed to in wri
0290: 74 69 6e 67 2c 20 74 68 65 20 53 41 46 45 20 4e  ting, the SAFE N
02a0: 65 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 20  etwork Software 
02b0: 64 69 73 74 72 69 62 75 74 65 64 0a 2f 2f 20 75  distributed.// u
02c0: 6e 64 65 72 20 74 68 65 20 47 50 4c 20 4c 69 63  nder the GPL Lic
02d0: 65 6e 63 65 20 69 73 20 64 69 73 74 72 69 62 75  ence is distribu
02e0: 74 65 64 20 6f 6e 20 61 6e 20 22 41 53 20 49 53  ted on an "AS IS
02f0: 22 20 42 41 53 49 53 2c 20 57 49 54 48 4f 55 54  " BASIS, WITHOUT
0300: 20 57 41 52 52 41 4e 54 49 45 53 20 4f 52 20 43   WARRANTIES OR C
0310: 4f 4e 44 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59  ONDITIONS OF ANY
0320: 0a 2f 2f 20 4b 49 4e 44 2c 20 65 69 74 68 65 72  .// KIND, either
0330: 20 65 78 70 72 65 73 73 20 6f 72 20 69 6d 70 6c   express or impl
0340: 69 65 64 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73  ied..//.// Pleas
0350: 65 20 72 65 76 69 65 77 20 74 68 65 20 4c 69 63  e review the Lic
0360: 65 6e 63 65 73 20 66 6f 72 20 74 68 65 20 73 70  ences for the sp
0370: 65 63 69 66 69 63 20 6c 61 6e 67 75 61 67 65 20  ecific language 
0380: 67 6f 76 65 72 6e 69 6e 67 20 70 65 72 6d 69 73  governing permis
0390: 73 69 6f 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61  sions and limita
03a0: 74 69 6f 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e  tions.// relatin
03b0: 67 20 74 6f 20 75 73 65 20 6f 66 20 74 68 65 20  g to use of the 
03c0: 53 41 46 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66  SAFE Network Sof
03d0: 74 77 61 72 65 2e 0a 0a 2f 2f 2f 20 50 6f 6c 6c  tware.../// Poll
03e0: 20 65 76 65 6e 74 73 0a 70 75 62 20 6d 6f 64 20   events.pub mod 
03f0: 70 6f 6c 6c 3b 0a 2f 2f 2f 20 54 65 73 74 20 63  poll;./// Test c
0400: 6c 69 65 6e 74 20 6e 6f 64 65 0a 70 75 62 20 6d  lient node.pub m
0410: 6f 64 20 74 65 73 74 5f 63 6c 69 65 6e 74 3b 0a  od test_client;.
0420: 2f 2f 2f 20 54 65 73 74 20 66 75 6c 6c 20 6e 6f  /// Test full no
0430: 64 65 0a 70 75 62 20 6d 6f 64 20 74 65 73 74 5f  de.pub mod test_
0440: 6e 6f 64 65 3b 0a 0a 75 73 65 20 47 52 4f 55 50  node;..use GROUP
0450: 5f 53 49 5a 45 3b 0a 75 73 65 20 69 74 65 72 74  _SIZE;.use itert
0460: 6f 6f 6c 73 3a 3a 49 74 65 72 74 6f 6f 6c 73 3b  ools::Itertools;
0470: 0a 75 73 65 20 6d 6f 63 6b 5f 63 72 75 73 74 5f  .use mock_crust_
0480: 64 65 74 61 69 6c 3a 3a 74 65 73 74 5f 6e 6f 64  detail::test_nod
0490: 65 3a 3a 54 65 73 74 4e 6f 64 65 3b 0a 75 73 65  e::TestNode;.use
04a0: 20 70 65 72 73 6f 6e 61 73 3a 3a 64 61 74 61 5f   personas::data_
04b0: 6d 61 6e 61 67 65 72 3a 3a 49 64 41 6e 64 56 65  manager::IdAndVe
04c0: 72 73 69 6f 6e 3b 0a 75 73 65 20 72 6f 75 74 69  rsion;.use routi
04d0: 6e 67 3a 3a 7b 73 65 6c 66 2c 20 44 61 74 61 2c  ng::{self, Data,
04e0: 20 58 6f 72 4e 61 6d 65 2c 20 58 6f 72 61 62 6c   XorName, Xorabl
04f0: 65 7d 3b 0a 75 73 65 20 73 74 64 3a 3a 63 6f 6c  e};.use std::col
0500: 6c 65 63 74 69 6f 6e 73 3a 3a 7b 48 61 73 68 4d  lections::{HashM
0510: 61 70 2c 20 48 61 73 68 53 65 74 7d 3b 0a 0a 2f  ap, HashSet};../
0520: 2f 2f 20 43 68 65 63 6b 73 20 74 68 61 74 20 6e  // Checks that n
0530: 6f 6e 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  one of the given
0540: 20 6e 6f 64 65 73 20 68 61 73 20 61 6e 79 20 63   nodes has any c
0550: 6f 70 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e  opy of the given
0560: 20 64 61 74 61 20 6c 65 66 74 2e 0a 70 75 62 20   data left..pub 
0570: 66 6e 20 63 68 65 63 6b 5f 64 65 6c 65 74 65 64  fn check_deleted
0580: 5f 64 61 74 61 28 64 65 6c 65 74 65 64 5f 64 61  _data(deleted_da
0590: 74 61 3a 20 26 5b 44 61 74 61 5d 2c 20 6e 6f 64  ta: &[Data], nod
05a0: 65 73 3a 20 26 5b 54 65 73 74 4e 6f 64 65 5d 29  es: &[TestNode])
05b0: 20 7b 0a 20 20 20 20 6c 65 74 20 64 65 6c 65 74   {.    let delet
05c0: 65 64 5f 64 61 74 61 5f 69 64 73 3a 20 48 61 73  ed_data_ids: Has
05d0: 68 53 65 74 3c 5f 3e 20 3d 20 64 65 6c 65 74 65  hSet<_> = delete
05e0: 64 5f 64 61 74 61 2e 69 74 65 72 28 29 2e 6d 61  d_data.iter().ma
05f0: 70 28 44 61 74 61 3a 3a 69 64 65 6e 74 69 66 69  p(Data::identifi
0600: 65 72 29 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 20  er).collect();. 
0610: 20 20 20 6c 65 74 20 6d 75 74 20 64 61 74 61 5f     let mut data_
0620: 63 6f 75 6e 74 20 3d 20 48 61 73 68 4d 61 70 3a  count = HashMap:
0630: 3a 6e 65 77 28 29 3b 0a 20 20 20 20 6e 6f 64 65  :new();.    node
0640: 73 0a 20 20 20 20 20 20 20 20 2e 69 74 65 72 28  s.        .iter(
0650: 29 0a 20 20 20 20 20 20 20 20 2e 66 6c 61 74 5f  ).        .flat_
0660: 6d 61 70 28 54 65 73 74 4e 6f 64 65 3a 3a 67 65  map(TestNode::ge
0670: 74 5f 73 74 6f 72 65 64 5f 6e 61 6d 65 73 29 0a  t_stored_names).
0680: 20 20 20 20 20 20 20 20 2e 66 6f 72 65 61 63 68          .foreach
0690: 28 7c 64 61 74 61 5f 69 64 76 7c 20 69 66 20 64  (|data_idv| if d
06a0: 65 6c 65 74 65 64 5f 64 61 74 61 5f 69 64 73 2e  eleted_data_ids.
06b0: 63 6f 6e 74 61 69 6e 73 28 26 64 61 74 61 5f 69  contains(&data_i
06c0: 64 76 2e 30 29 20 7b 0a 20 20 20 20 20 20 20 20  dv.0) {.        
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 64 61               *da
06e0: 74 61 5f 63 6f 75 6e 74 2e 65 6e 74 72 79 28 64  ta_count.entry(d
06f0: 61 74 61 5f 69 64 76 29 2e 6f 72 5f 69 6e 73 65  ata_idv).or_inse
0700: 72 74 28 30 29 20 2b 3d 20 31 3b 0a 20 20 20 20  rt(0) += 1;.    
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 3b               });
0720: 0a 20 20 20 20 66 6f 72 20 28 64 61 74 61 5f 69  .    for (data_i
0730: 64 2c 20 63 6f 75 6e 74 29 20 69 6e 20 64 61 74  d, count) in dat
0740: 61 5f 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20  a_count {.      
0750: 20 20 61 73 73 65 72 74 21 28 63 6f 75 6e 74 20    assert!(count 
0760: 3c 20 35 2c 0a 20 20 20 20 20 20 20 20 20 20 20  < 5,.           
0770: 20 20 20 20 20 22 46 6f 75 6e 64 20 64 65 6c 65       "Found dele
0780: 74 65 64 20 64 61 74 61 3a 20 7b 3a 3f 7d 2e 20  ted data: {:?}. 
0790: 63 6f 75 6e 74 3a 20 7b 7d 22 2c 0a 20 20 20 20  count: {}",.    
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
07b0: 5f 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _id,.           
07c0: 20 20 20 20 20 63 6f 75 6e 74 29 3b 0a 20 20 20       count);.   
07d0: 20 7d 0a 7d 0a 0a 2f 2f 2f 20 43 68 65 63 6b 73   }.}../// Checks
07e0: 20 74 68 61 74 20 74 68 65 20 67 69 76 65 6e 20   that the given 
07f0: 60 6e 6f 64 65 73 60 20 73 74 6f 72 65 20 74 68  `nodes` store th
0800: 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
0810: 72 20 6f 66 20 63 6f 70 69 65 73 20 6f 66 20 74  r of copies of t
0820: 68 65 20 67 69 76 65 6e 20 64 61 74 61 2e 0a 70  he given data..p
0830: 75 62 20 66 6e 20 63 68 65 63 6b 5f 64 61 74 61  ub fn check_data
0840: 28 61 6c 6c 5f 64 61 74 61 3a 20 56 65 63 3c 44  (all_data: Vec<D
0850: 61 74 61 3e 2c 20 6e 6f 64 65 73 3a 20 26 5b 54  ata>, nodes: &[T
0860: 65 73 74 4e 6f 64 65 5d 29 20 7b 0a 20 20 20 20  estNode]) {.    
0870: 6c 65 74 20 6d 75 74 20 64 61 74 61 5f 68 6f 6c  let mut data_hol
0880: 64 65 72 73 5f 6d 61 70 3a 20 48 61 73 68 4d 61  ders_map: HashMa
0890: 70 3c 49 64 41 6e 64 56 65 72 73 69 6f 6e 2c 20  p<IdAndVersion, 
08a0: 56 65 63 3c 58 6f 72 4e 61 6d 65 3e 3e 20 3d 20  Vec<XorName>> = 
08b0: 48 61 73 68 4d 61 70 3a 3a 6e 65 77 28 29 3b 0a  HashMap::new();.
08c0: 20 20 20 20 66 6f 72 20 6e 6f 64 65 20 69 6e 20      for node in 
08d0: 6e 6f 64 65 73 20 7b 0a 20 20 20 20 20 20 20 20  nodes {.        
08e0: 66 6f 72 20 64 61 74 61 5f 69 64 76 20 69 6e 20  for data_idv in 
08f0: 6e 6f 64 65 2e 67 65 74 5f 73 74 6f 72 65 64 5f  node.get_stored_
0900: 6e 61 6d 65 73 28 29 20 7b 0a 20 20 20 20 20 20  names() {.      
0910: 20 20 20 20 20 20 64 61 74 61 5f 68 6f 6c 64 65        data_holde
0920: 72 73 5f 6d 61 70 0a 20 20 20 20 20 20 20 20 20  rs_map.         
0930: 20 20 20 20 20 20 20 2e 65 6e 74 72 79 28 64 61         .entry(da
0940: 74 61 5f 69 64 76 29 0a 20 20 20 20 20 20 20 20  ta_idv).        
0950: 20 20 20 20 20 20 20 20 2e 6f 72 5f 69 6e 73 65          .or_inse
0960: 72 74 5f 77 69 74 68 28 56 65 63 3a 3a 6e 65 77  rt_with(Vec::new
0970: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0980: 20 20 2e 70 75 73 68 28 6e 6f 64 65 2e 6e 61 6d    .push(node.nam
0990: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e());.        }.
09a0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 64      }..    for d
09b0: 61 74 61 20 69 6e 20 61 6c 6c 5f 64 61 74 61 20  ata in all_data 
09c0: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 28 64  {.        let (d
09d0: 61 74 61 5f 69 64 2c 20 64 61 74 61 5f 76 65 72  ata_id, data_ver
09e0: 73 69 6f 6e 29 20 3d 20 6d 61 74 63 68 20 64 61  sion) = match da
09f0: 74 61 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ta {.           
0a00: 20 44 61 74 61 3a 3a 49 6d 6d 75 74 61 62 6c 65   Data::Immutable
0a10: 28 64 61 74 61 29 20 3d 3e 20 28 64 61 74 61 2e  (data) => (data.
0a20: 69 64 65 6e 74 69 66 69 65 72 28 29 2c 20 30 29  identifier(), 0)
0a30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 61  ,.            Da
0a40: 74 61 3a 3a 53 74 72 75 63 74 75 72 65 64 28 64  ta::Structured(d
0a50: 61 74 61 29 20 3d 3e 20 28 64 61 74 61 2e 69 64  ata) => (data.id
0a60: 65 6e 74 69 66 69 65 72 28 29 2c 20 64 61 74 61  entifier(), data
0a70: 2e 67 65 74 5f 76 65 72 73 69 6f 6e 28 29 29 2c  .get_version()),
0a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d  .            _ =
0a90: 3e 20 75 6e 72 65 61 63 68 61 62 6c 65 21 28 29  > unreachable!()
0aa0: 2c 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  ,.        };.   
0ab0: 20 20 20 20 20 6c 65 74 20 64 61 74 61 5f 68 6f       let data_ho
0ac0: 6c 64 65 72 73 20 3d 20 64 61 74 61 5f 68 6f 6c  lders = data_hol
0ad0: 64 65 72 73 5f 6d 61 70 0a 20 20 20 20 20 20 20  ders_map.       
0ae0: 20 20 20 20 20 2e 67 65 74 28 26 28 64 61 74 61       .get(&(data
0af0: 5f 69 64 2c 20 64 61 74 61 5f 76 65 72 73 69 6f  _id, data_versio
0b00: 6e 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  n)).            
0b10: 2e 63 6c 6f 6e 65 64 28 29 0a 20 20 20 20 20 20  .cloned().      
0b20: 20 20 20 20 20 20 2e 75 6e 77 72 61 70 5f 6f 72        .unwrap_or
0b30: 5f 65 6c 73 65 28 56 65 63 3a 3a 6e 65 77 29 0a  _else(Vec::new).
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 2e 69 6e 74              .int
0b50: 6f 5f 69 74 65 72 28 29 0a 20 20 20 20 20 20 20  o_iter().       
0b60: 20 20 20 20 20 2e 73 6f 72 74 65 64 5f 62 79 28       .sorted_by(
0b70: 7c 6c 65 66 74 2c 20 72 69 67 68 74 7c 20 64 61  |left, right| da
0b80: 74 61 5f 69 64 2e 6e 61 6d 65 28 29 2e 63 6d 70  ta_id.name().cmp
0b90: 5f 64 69 73 74 61 6e 63 65 28 6c 65 66 74 2c 20  _distance(left, 
0ba0: 72 69 67 68 74 29 29 3b 0a 0a 20 20 20 20 20 20  right));..      
0bb0: 20 20 6c 65 74 20 6d 75 74 20 65 78 70 65 63 74    let mut expect
0bc0: 65 64 5f 64 61 74 61 5f 68 6f 6c 64 65 72 73 20  ed_data_holders 
0bd0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  =.            no
0be0: 64 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  des.            
0bf0: 20 20 20 20 2e 69 74 65 72 28 29 0a 20 20 20 20      .iter().    
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d 61 70              .map
0c10: 28 54 65 73 74 4e 6f 64 65 3a 3a 6e 61 6d 65 29  (TestNode::name)
0c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0c30: 20 2e 73 6f 72 74 65 64 5f 62 79 28 7c 6c 65 66   .sorted_by(|lef
0c40: 74 2c 20 72 69 67 68 74 7c 20 64 61 74 61 5f 69  t, right| data_i
0c50: 64 2e 6e 61 6d 65 28 29 2e 63 6d 70 5f 64 69 73  d.name().cmp_dis
0c60: 74 61 6e 63 65 28 6c 65 66 74 2c 20 72 69 67 68  tance(left, righ
0c70: 74 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  t));..        ex
0c80: 70 65 63 74 65 64 5f 64 61 74 61 5f 68 6f 6c 64  pected_data_hold
0c90: 65 72 73 2e 74 72 75 6e 63 61 74 65 28 47 52 4f  ers.truncate(GRO
0ca0: 55 50 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 20  UP_SIZE);..     
0cb0: 20 20 20 61 73 73 65 72 74 5f 65 71 21 28 65 78     assert_eq!(ex
0cc0: 70 65 63 74 65 64 5f 64 61 74 61 5f 68 6f 6c 64  pected_data_hold
0cd0: 65 72 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ers,.           
0ce0: 20 20 20 20 20 20 20 20 64 61 74 61 5f 68 6f 6c          data_hol
0cf0: 64 65 72 73 2c 0a 20 20 20 20 20 20 20 20 20 20  ders,.          
0d00: 20 20 20 20 20 20 20 20 20 22 44 61 74 61 3a 20           "Data: 
0d10: 7b 3a 3f 7d 2e 20 65 78 70 65 63 74 65 64 20 3d  {:?}. expected =
0d20: 20 7b 3a 3f 7d 2c 20 61 63 74 75 61 6c 20 3d 20   {:?}, actual = 
0d30: 7b 3a 3f 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  {:?}",.         
0d40: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5f 69            data_i
0d50: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
0d60: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 5f 64        expected_d
0d70: 61 74 61 5f 68 6f 6c 64 65 72 73 2c 0a 20 20 20  ata_holders,.   
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 64 61 74 61 5f 68 6f 6c 64 65 72 73 29 3b 0a 20  data_holders);. 
0da0: 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 56 65 72 69     }.}../// Veri
0db0: 66 79 20 74 68 61 74 20 74 68 65 20 6e 65 74 77  fy that the netw
0dc0: 6f 72 6b 20 69 6e 76 61 72 69 61 6e 74 20 69 73  ork invariant is
0dd0: 20 75 70 68 65 6c 64 20 66 6f 72 20 61 6c 6c 20   upheld for all 
0de0: 6e 6f 64 65 73 2e 0a 70 75 62 20 66 6e 20 76 65  nodes..pub fn ve
0df0: 72 69 66 79 5f 6b 61 64 65 6d 6c 69 61 5f 69 6e  rify_kademlia_in
0e00: 76 61 72 69 61 6e 74 5f 66 6f 72 5f 61 6c 6c 5f  variant_for_all_
0e10: 6e 6f 64 65 73 28 6e 6f 64 65 73 3a 20 26 5b 54  nodes(nodes: &[T
0e20: 65 73 74 4e 6f 64 65 5d 29 20 7b 0a 20 20 20 20  estNode]) {.    
0e30: 6c 65 74 20 72 6f 75 74 69 6e 67 5f 74 61 62 6c  let routing_tabl
0e40: 65 73 20 3d 20 6e 6f 64 65 73 2e 69 74 65 72 28  es = nodes.iter(
0e50: 29 2e 6d 61 70 28 54 65 73 74 4e 6f 64 65 3a 3a  ).map(TestNode::
0e60: 72 6f 75 74 69 6e 67 5f 74 61 62 6c 65 29 2e 63  routing_table).c
0e70: 6f 6c 6c 65 63 74 5f 76 65 63 28 29 3b 0a 20 20  ollect_vec();.  
0e80: 20 20 72 6f 75 74 69 6e 67 3a 3a 76 65 72 69 66    routing::verif
0e90: 79 5f 6e 65 74 77 6f 72 6b 5f 69 6e 76 61 72 69  y_network_invari
0ea0: 61 6e 74 28 72 6f 75 74 69 6e 67 5f 74 61 62 6c  ant(routing_tabl
0eb0: 65 73 2e 69 74 65 72 28 29 29 3b 0a 7d 0a        es.iter());.}.