Hex Artifact Content
Not logged in

Artifact 91bdb90967d3f678e3840f21986ea7a53116daff:


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 2c 20 76 65 72 73 69  Agreement, versi
01e0: 6f 6e 20 31 2e 31 2e 20 20 54 68 69 73 2c 20 61  on 1.1.  This, a
01f0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 2f 2f  long with the.//
0200: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0210: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 72 6f   found in the ro
0220: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  ot directory of 
0230: 74 68 69 73 20 70 72 6f 6a 65 63 74 20 61 74 20  this project at 
0240: 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59 49 4e 47  LICENSE, COPYING
0250: 20 61 6e 64 20 43 4f 4e 54 52 49 42 55 54 4f 52   and CONTRIBUTOR
0260: 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73 73 20 72  ..//.// Unless r
0270: 65 71 75 69 72 65 64 20 62 79 20 61 70 70 6c 69  equired by appli
0280: 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61 67 72  cable law or agr
0290: 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74 69 6e  eed to in writin
02a0: 67 2c 20 74 68 65 20 53 41 46 45 20 4e 65 74 77  g, the SAFE Netw
02b0: 6f 72 6b 20 53 6f 66 74 77 61 72 65 20 64 69 73  ork Software dis
02c0: 74 72 69 62 75 74 65 64 0a 2f 2f 20 75 6e 64 65  tributed.// unde
02d0: 72 20 74 68 65 20 47 50 4c 20 4c 69 63 65 6e 63  r the GPL Licenc
02e0: 65 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  e is distributed
02f0: 20 6f 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42   on an "AS IS" B
0300: 41 53 49 53 2c 20 57 49 54 48 4f 55 54 20 57 41  ASIS, WITHOUT WA
0310: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
0320: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 0a 2f 2f  ITIONS OF ANY.//
0330: 20 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78   KIND, either ex
0340: 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64  press or implied
0350: 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73 65 20 72  ..//.// Please r
0360: 65 76 69 65 77 20 74 68 65 20 4c 69 63 65 6e 63  eview the Licenc
0370: 65 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  es for the speci
0380: 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76  fic language gov
0390: 65 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f  erning permissio
03a0: 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61 74 69 6f  ns and limitatio
03b0: 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e 67 20 74  ns.// relating t
03c0: 6f 20 75 73 65 20 6f 66 20 74 68 65 20 53 41 46  o use of the SAF
03d0: 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66 74 77 61  E Network Softwa
03e0: 72 65 2e 0a 0a 75 73 65 20 69 74 65 72 74 6f 6f  re...use itertoo
03f0: 6c 73 3a 3a 49 74 65 72 74 6f 6f 6c 73 3b 0a 75  ls::Itertools;.u
0400: 73 65 20 72 61 6e 64 3a 3a 52 6e 67 3b 0a 75 73  se rand::Rng;.us
0410: 65 20 72 6f 75 74 69 6e 67 3a 3a 7b 41 75 74 68  e routing::{Auth
0420: 6f 72 69 74 79 2c 20 43 61 63 68 65 2c 20 43 6c  ority, Cache, Cl
0430: 69 65 6e 74 2c 20 44 61 74 61 2c 20 44 61 74 61  ient, Data, Data
0440: 49 64 65 6e 74 69 66 69 65 72 2c 20 45 76 65 6e  Identifier, Even
0450: 74 2c 20 45 76 65 6e 74 53 74 72 65 61 6d 2c 20  t, EventStream, 
0460: 46 75 6c 6c 49 64 2c 0a 20 20 20 20 20 20 20 20  FullId,.        
0470: 20 20 20 20 20 20 49 6d 6d 75 74 61 62 6c 65 44        ImmutableD
0480: 61 74 61 2c 20 4e 6f 64 65 2c 20 4e 75 6c 6c 43  ata, Node, NullC
0490: 61 63 68 65 2c 20 50 72 65 66 69 78 2c 20 52 65  ache, Prefix, Re
04a0: 71 75 65 73 74 2c 20 52 65 73 70 6f 6e 73 65 2c  quest, Response,
04b0: 20 52 6f 75 74 69 6e 67 54 61 62 6c 65 2c 20 58   RoutingTable, X
04c0: 6f 72 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  orName,.        
04d0: 20 20 20 20 20 20 58 6f 72 61 62 6c 65 2c 20 76        Xorable, v
04e0: 65 72 69 66 79 5f 6e 65 74 77 6f 72 6b 5f 69 6e  erify_network_in
04f0: 76 61 72 69 61 6e 74 7d 3b 0a 75 73 65 20 72 6f  variant};.use ro
0500: 75 74 69 6e 67 3a 3a 6d 6f 63 6b 5f 63 72 75 73  uting::mock_crus
0510: 74 3a 3a 7b 73 65 6c 66 2c 20 43 6f 6e 66 69 67  t::{self, Config
0520: 2c 20 45 6e 64 70 6f 69 6e 74 2c 20 4e 65 74 77  , Endpoint, Netw
0530: 6f 72 6b 2c 20 53 65 72 76 69 63 65 48 61 6e 64  ork, ServiceHand
0540: 6c 65 7d 3b 0a 75 73 65 20 73 74 64 3a 3a 7b 63  le};.use std::{c
0550: 6d 70 2c 20 74 68 72 65 61 64 7d 3b 0a 75 73 65  mp, thread};.use
0560: 20 73 74 64 3a 3a 63 65 6c 6c 3a 3a 52 65 66 43   std::cell::RefC
0570: 65 6c 6c 3b 0a 75 73 65 20 73 74 64 3a 3a 63 6f  ell;.use std::co
0580: 6c 6c 65 63 74 69 6f 6e 73 3a 3a 7b 42 54 72 65  llections::{BTre
0590: 65 53 65 74 2c 20 48 61 73 68 4d 61 70 7d 3b 0a  eSet, HashMap};.
05a0: 75 73 65 20 73 74 64 3a 3a 6f 70 73 3a 3a 7b 44  use std::ops::{D
05b0: 65 72 65 66 2c 20 44 65 72 65 66 4d 75 74 7d 3b  eref, DerefMut};
05c0: 0a 75 73 65 20 73 74 64 3a 3a 73 79 6e 63 3a 3a  .use std::sync::
05d0: 6d 70 73 63 3a 3a 7b 52 65 63 76 45 72 72 6f 72  mpsc::{RecvError
05e0: 2c 20 54 72 79 52 65 63 76 45 72 72 6f 72 7d 3b  , TryRecvError};
05f0: 0a 0a 2f 2f 20 56 61 72 69 6f 75 73 20 75 74 69  ..// Various uti
0600: 6c 69 74 69 65 73 2e 20 53 69 6e 63 65 20 74 68  lities. Since th
0610: 69 73 20 69 73 20 61 6c 6c 20 69 6e 74 65 72 6e  is is all intern
0620: 61 6c 20 73 74 75 66 66 20 77 65 27 72 65 20 61  al stuff we're a
0630: 20 62 69 74 20 6c 61 78 20 61 62 6f 75 74 20 74   bit lax about t
0640: 68 65 20 64 6f 63 2e 0a 23 5b 61 6c 6c 6f 77 28  he doc..#[allow(
0650: 6d 69 73 73 69 6e 67 5f 64 6f 63 73 29 5d 0a 0a  missing_docs)]..
0660: 2f 2f 20 50 6f 6c 6c 20 6f 6e 65 20 65 76 65 6e  // Poll one even
0670: 74 20 70 65 72 20 6e 6f 64 65 2e 20 4f 74 68 65  t per node. Othe
0680: 72 77 69 73 65 2c 20 61 6c 6c 20 65 76 65 6e 74  rwise, all event
0690: 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 6e 6f  s in a single no
06a0: 64 65 20 61 72 65 20 70 6f 6c 6c 65 64 20 62 65  de are polled be
06b0: 66 6f 72 65 20 6d 6f 76 69 6e 67 20 6f 6e 2e 0a  fore moving on..
06c0: 63 6f 6e 73 74 20 42 41 4c 41 4e 43 45 44 5f 50  const BALANCED_P
06d0: 4f 4c 4c 49 4e 47 3a 20 62 6f 6f 6c 20 3d 20 74  OLLING: bool = t
06e0: 72 75 65 3b 0a 0a 2f 2f 20 4d 61 78 69 6d 75 6d  rue;..// Maximum
06f0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
0700: 20 74 6f 20 74 72 79 20 61 6e 64 20 70 6f 6c 6c   to try and poll
0710: 20 69 6e 20 61 20 6c 6f 6f 70 2e 20 20 54 68 69   in a loop.  Thi
0720: 73 20 69 73 20 73 65 76 65 72 61 6c 20 6f 72 64  s is several ord
0730: 65 72 73 20 68 69 67 68 65 72 20 74 68 61 6e 20  ers higher than 
0740: 74 68 65 0a 2f 2f 20 61 6e 74 69 63 69 70 61 74  the.// anticipat
0750: 65 64 20 75 70 70 65 72 20 6c 69 6d 69 74 20 66  ed upper limit f
0760: 6f 72 20 61 6e 79 20 74 65 73 74 2c 20 61 6e 64  or any test, and
0770: 20 69 66 20 68 69 74 20 69 73 20 6c 69 6b 65 6c   if hit is likel
0780: 79 20 74 6f 20 69 6e 64 69 63 61 74 65 20 61 6e  y to indicate an
0790: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 2e 0a   infinite loop..
07a0: 63 6f 6e 73 74 20 4d 41 58 5f 50 4f 4c 4c 5f 43  const MAX_POLL_C
07b0: 41 4c 4c 53 3a 20 75 73 69 7a 65 20 3d 20 31 30  ALLS: usize = 10
07c0: 30 30 3b 0a 0a 2f 2f 20 2d 2d 2d 2d 2d 20 20 52  00;..// -----  R
07d0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
07e0: 65 72 61 74 69 6f 6e 20 20 2d 2d 2d 2d 2d 0a 0a  eration  -----..
07f0: 2f 2f 2f 20 47 65 6e 65 72 61 74 65 20 61 20 72  /// Generate a r
0800: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 69 6e 20 74  andom value in t
0810: 68 65 20 72 61 6e 67 65 2c 20 65 78 63 6c 75 64  he range, exclud
0820: 69 6e 67 20 74 68 65 20 60 65 78 63 6c 75 64 65  ing the `exclude
0830: 60 20 76 61 6c 75 65 2c 20 69 66 20 6e 6f 74 20  ` value, if not 
0840: 60 4e 6f 6e 65 60 2e 0a 70 75 62 20 66 6e 20 67  `None`..pub fn g
0850: 65 6e 5f 72 61 6e 67 65 5f 65 78 63 65 70 74 3c  en_range_except<
0860: 54 3a 20 52 6e 67 3e 28 72 6e 67 3a 20 26 6d 75  T: Rng>(rng: &mu
0870: 74 20 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t T,.           
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 6c 6f 77 3a 20 75 73 69 7a 65 2c       low: usize,
08a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 68 69 67 68 3a 20 75 73 69 7a 65 2c 0a 20 20   high: usize,.  
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
08f0: 63 6c 75 64 65 3a 20 26 42 54 72 65 65 53 65 74  clude: &BTreeSet
0900: 3c 75 73 69 7a 65 3e 29 0a 20 20 20 20 20 20 20  <usize>).       
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 20 20 2d 3e 20 75 73 69 7a           -> usiz
0930: 65 20 7b 0a 20 20 20 20 6c 65 74 20 6d 75 74 20  e {.    let mut 
0940: 78 20 3d 20 72 6e 67 2e 67 65 6e 5f 72 61 6e 67  x = rng.gen_rang
0950: 65 28 6c 6f 77 2c 20 68 69 67 68 20 2d 20 65 78  e(low, high - ex
0960: 63 6c 75 64 65 2e 6c 65 6e 28 29 29 3b 0a 20 20  clude.len());.  
0970: 20 20 66 6f 72 20 65 20 69 6e 20 65 78 63 6c 75    for e in exclu
0980: 64 65 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  de {.        if 
0990: 78 20 3e 3d 20 2a 65 20 7b 0a 20 20 20 20 20 20  x >= *e {.      
09a0: 20 20 20 20 20 20 78 20 2b 3d 20 31 3b 0a 20 20        x += 1;.  
09b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
09c0: 20 20 78 0a 7d 0a 0a 0a 2f 2f 2f 20 57 72 61 70    x.}.../// Wrap
09d0: 73 20 61 20 60 56 65 63 3c 54 65 73 74 4e 6f 64  s a `Vec<TestNod
09e0: 65 3e 60 73 20 61 6e 64 20 70 72 69 6e 74 73 20  e>`s and prints 
09f0: 74 68 65 20 6e 6f 64 65 73 27 20 72 6f 75 74 69  the nodes' routi
0a00: 6e 67 20 74 61 62 6c 65 73 20 77 68 65 6e 20 64  ng tables when d
0a10: 72 6f 70 70 65 64 20 69 6e 20 61 20 70 61 6e 69  ropped in a pani
0a20: 63 6b 69 6e 67 0a 2f 2f 2f 20 74 68 72 65 61 64  cking./// thread
0a30: 2e 0a 70 75 62 20 73 74 72 75 63 74 20 4e 6f 64  ..pub struct Nod
0a40: 65 73 28 70 75 62 20 56 65 63 3c 54 65 73 74 4e  es(pub Vec<TestN
0a50: 6f 64 65 3e 29 3b 0a 0a 69 6d 70 6c 20 44 72 6f  ode>);..impl Dro
0a60: 70 20 66 6f 72 20 4e 6f 64 65 73 20 7b 0a 20 20  p for Nodes {.  
0a70: 20 20 66 6e 20 64 72 6f 70 28 26 6d 75 74 20 73    fn drop(&mut s
0a80: 65 6c 66 29 20 7b 0a 20 20 20 20 20 20 20 20 69  elf) {.        i
0a90: 66 20 74 68 72 65 61 64 3a 3a 70 61 6e 69 63 6b  f thread::panick
0aa0: 69 6e 67 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ing() {.        
0ab0: 20 20 20 20 65 72 72 6f 72 21 28 22 2d 2d 2d 2d      error!("----
0ac0: 2d 2d 2d 2d 2d 2d 20 52 6f 75 74 69 6e 67 20 74  ------ Routing t
0ad0: 61 62 6c 65 73 20 61 74 20 74 69 6d 65 20 6f 66  ables at time of
0ae0: 20 65 72 72 6f 72 20 2d 2d 2d 2d 2d 2d 2d 2d 2d   error ---------
0af0: 2d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -");.           
0b00: 20 65 72 72 6f 72 21 28 22 22 29 3b 0a 20 20 20   error!("");.   
0b10: 20 20 20 20 20 20 20 20 20 66 6f 72 20 6e 6f 64           for nod
0b20: 65 20 69 6e 20 26 73 65 6c 66 2e 30 20 7b 0a 20  e in &self.0 {. 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
0b40: 72 72 6f 72 21 28 22 2d 2d 2d 2d 2d 20 4e 6f 64  rror!("----- Nod
0b50: 65 20 7b 3a 3f 7d 20 2d 2d 2d 2d 2d 22 2c 20 6e  e {:?} -----", n
0b60: 6f 64 65 2e 6e 61 6d 65 28 29 29 3b 0a 20 20 20  ode.name());.   
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
0b80: 6f 72 21 28 22 7b 3a 3f 7d 22 2c 20 6e 6f 64 65  or!("{:?}", node
0b90: 2e 72 6f 75 74 69 6e 67 5f 74 61 62 6c 65 28 29  .routing_table()
0ba0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
0bb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
0bc0: 0a 7d 0a 0a 69 6d 70 6c 20 44 65 72 65 66 20 66  .}..impl Deref f
0bd0: 6f 72 20 4e 6f 64 65 73 20 7b 0a 20 20 20 20 74  or Nodes {.    t
0be0: 79 70 65 20 54 61 72 67 65 74 20 3d 20 56 65 63  ype Target = Vec
0bf0: 3c 54 65 73 74 4e 6f 64 65 3e 3b 0a 0a 20 20 20  <TestNode>;..   
0c00: 20 66 6e 20 64 65 72 65 66 28 26 73 65 6c 66 29   fn deref(&self)
0c10: 20 2d 3e 20 26 56 65 63 3c 54 65 73 74 4e 6f 64   -> &Vec<TestNod
0c20: 65 3e 20 7b 0a 20 20 20 20 20 20 20 20 26 73 65  e> {.        &se
0c30: 6c 66 2e 30 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d  lf.0.    }.}..im
0c40: 70 6c 20 44 65 72 65 66 4d 75 74 20 66 6f 72 20  pl DerefMut for 
0c50: 4e 6f 64 65 73 20 7b 0a 20 20 20 20 66 6e 20 64  Nodes {.    fn d
0c60: 65 72 65 66 5f 6d 75 74 28 26 6d 75 74 20 73 65  eref_mut(&mut se
0c70: 6c 66 29 20 2d 3e 20 26 6d 75 74 20 56 65 63 3c  lf) -> &mut Vec<
0c80: 54 65 73 74 4e 6f 64 65 3e 20 7b 0a 20 20 20 20  TestNode> {.    
0c90: 20 20 20 20 26 6d 75 74 20 73 65 6c 66 2e 30 0a      &mut self.0.
0ca0: 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f 20 2d 2d 2d      }.}...// ---
0cb0: 2d 2d 20 20 54 65 73 74 4e 6f 64 65 20 61 6e 64  --  TestNode and
0cc0: 20 62 75 69 6c 64 65 72 20 20 2d 2d 2d 2d 2d 0a   builder  -----.
0cd0: 0a 69 6d 70 6c 20 45 76 65 6e 74 53 74 72 65 61  .impl EventStrea
0ce0: 6d 20 66 6f 72 20 54 65 73 74 4e 6f 64 65 20 7b  m for TestNode {
0cf0: 0a 20 20 20 20 74 79 70 65 20 49 74 65 6d 20 3d  .    type Item =
0d00: 20 45 76 65 6e 74 3b 0a 0a 20 20 20 20 66 6e 20   Event;..    fn 
0d10: 6e 65 78 74 5f 65 76 28 26 6d 75 74 20 73 65 6c  next_ev(&mut sel
0d20: 66 29 20 2d 3e 20 52 65 73 75 6c 74 3c 45 76 65  f) -> Result<Eve
0d30: 6e 74 2c 20 52 65 63 76 45 72 72 6f 72 3e 20 7b  nt, RecvError> {
0d40: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 69 6e  .        self.in
0d50: 6e 65 72 2e 6e 65 78 74 5f 65 76 28 29 0a 20 20  ner.next_ev().  
0d60: 20 20 7d 0a 0a 20 20 20 20 66 6e 20 74 72 79 5f    }..    fn try_
0d70: 6e 65 78 74 5f 65 76 28 26 6d 75 74 20 73 65 6c  next_ev(&mut sel
0d80: 66 29 20 2d 3e 20 52 65 73 75 6c 74 3c 45 76 65  f) -> Result<Eve
0d90: 6e 74 2c 20 54 72 79 52 65 63 76 45 72 72 6f 72  nt, TryRecvError
0da0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  > {.        self
0db0: 2e 69 6e 6e 65 72 2e 74 72 79 5f 6e 65 78 74 5f  .inner.try_next_
0dc0: 65 76 28 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ev().    }..    
0dd0: 66 6e 20 70 6f 6c 6c 28 26 6d 75 74 20 73 65 6c  fn poll(&mut sel
0de0: 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20  f) -> bool {.   
0df0: 20 20 20 20 20 73 65 6c 66 2e 69 6e 6e 65 72 2e       self.inner.
0e00: 70 6f 6c 6c 28 29 0a 20 20 20 20 7d 0a 7d 0a 0a  poll().    }.}..
0e10: 70 75 62 20 73 74 72 75 63 74 20 54 65 73 74 4e  pub struct TestN
0e20: 6f 64 65 20 7b 0a 20 20 20 20 70 75 62 20 68 61  ode {.    pub ha
0e30: 6e 64 6c 65 3a 20 53 65 72 76 69 63 65 48 61 6e  ndle: ServiceHan
0e40: 64 6c 65 2c 0a 20 20 20 20 70 75 62 20 69 6e 6e  dle,.    pub inn
0e50: 65 72 3a 20 4e 6f 64 65 2c 0a 7d 0a 0a 69 6d 70  er: Node,.}..imp
0e60: 6c 20 54 65 73 74 4e 6f 64 65 20 7b 0a 20 20 20  l TestNode {.   
0e70: 20 70 75 62 20 66 6e 20 62 75 69 6c 64 65 72 28   pub fn builder(
0e80: 6e 65 74 77 6f 72 6b 3a 20 26 4e 65 74 77 6f 72  network: &Networ
0e90: 6b 29 20 2d 3e 20 54 65 73 74 4e 6f 64 65 42 75  k) -> TestNodeBu
0ea0: 69 6c 64 65 72 20 7b 0a 20 20 20 20 20 20 20 20  ilder {.        
0eb0: 54 65 73 74 4e 6f 64 65 42 75 69 6c 64 65 72 20  TestNodeBuilder 
0ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  {.            ne
0ed0: 74 77 6f 72 6b 3a 20 6e 65 74 77 6f 72 6b 2c 0a  twork: network,.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 72 73              firs
0ef0: 74 5f 6e 6f 64 65 3a 20 66 61 6c 73 65 2c 0a 20  t_node: false,. 
0f00: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
0f10: 67 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  g: None,.       
0f20: 20 20 20 20 20 65 6e 64 70 6f 69 6e 74 3a 20 4e       endpoint: N
0f30: 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  one,.           
0f40: 20 63 61 63 68 65 3a 20 42 6f 78 3a 3a 6e 65 77   cache: Box::new
0f50: 28 4e 75 6c 6c 43 61 63 68 65 29 2c 0a 20 20 20  (NullCache),.   
0f60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
0f70: 20 20 70 75 62 20 66 6e 20 6e 65 77 28 6e 65 74    pub fn new(net
0f80: 77 6f 72 6b 3a 20 26 4e 65 74 77 6f 72 6b 2c 0a  work: &Network,.
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0fa0: 69 72 73 74 5f 6e 6f 64 65 3a 20 62 6f 6f 6c 2c  irst_node: bool,
0fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fc0: 63 6f 6e 66 69 67 3a 20 4f 70 74 69 6f 6e 3c 43  config: Option<C
0fd0: 6f 6e 66 69 67 3e 2c 0a 20 20 20 20 20 20 20 20  onfig>,.        
0fe0: 20 20 20 20 20 20 20 65 6e 64 70 6f 69 6e 74 3a         endpoint:
0ff0: 20 4f 70 74 69 6f 6e 3c 45 6e 64 70 6f 69 6e 74   Option<Endpoint
1000: 3e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  >,.             
1010: 20 20 63 61 63 68 65 3a 20 42 6f 78 3c 43 61 63    cache: Box<Cac
1020: 68 65 3e 29 0a 20 20 20 20 20 20 20 20 20 20 20  he>).           
1030: 20 20 20 20 2d 3e 20 53 65 6c 66 20 7b 0a 20 20      -> Self {.  
1040: 20 20 20 20 20 20 6c 65 74 20 68 61 6e 64 6c 65        let handle
1050: 20 3d 20 6e 65 74 77 6f 72 6b 2e 6e 65 77 5f 73   = network.new_s
1060: 65 72 76 69 63 65 5f 68 61 6e 64 6c 65 28 63 6f  ervice_handle(co
1070: 6e 66 69 67 2c 20 65 6e 64 70 6f 69 6e 74 29 3b  nfig, endpoint);
1080: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 6f 64  .        let nod
1090: 65 20 3d 20 6d 6f 63 6b 5f 63 72 75 73 74 3a 3a  e = mock_crust::
10a0: 6d 61 6b 65 5f 63 75 72 72 65 6e 74 28 26 68 61  make_current(&ha
10b0: 6e 64 6c 65 2c 20 7c 7c 20 7b 0a 20 20 20 20 20  ndle, || {.     
10c0: 20 20 20 20 20 20 20 75 6e 77 72 61 70 21 28 4e         unwrap!(N
10d0: 6f 64 65 3a 3a 62 75 69 6c 64 65 72 28 29 0a 20  ode::builder(). 
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
10f0: 63 61 63 68 65 28 63 61 63 68 65 29 0a 20 20 20  cache(cache).   
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 66 69               .fi
1110: 72 73 74 28 66 69 72 73 74 5f 6e 6f 64 65 29 0a  rst(first_node).
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 2e 63 72 65 61 74 65 28 6e 65 74 77 6f 72 6b 2e  .create(network.
1140: 6d 69 6e 5f 73 65 63 74 69 6f 6e 5f 73 69 7a 65  min_section_size
1150: 28 29 29 29 0a 20 20 20 20 20 20 20 20 7d 29 3b  ())).        });
1160: 0a 0a 20 20 20 20 20 20 20 20 54 65 73 74 4e 6f  ..        TestNo
1170: 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  de {.           
1180: 20 68 61 6e 64 6c 65 3a 20 68 61 6e 64 6c 65 2c   handle: handle,
1190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 6e  .            inn
11a0: 65 72 3a 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20  er: node,.      
11b0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
11c0: 75 62 20 66 6e 20 6e 61 6d 65 28 26 73 65 6c 66  ub fn name(&self
11d0: 29 20 2d 3e 20 58 6f 72 4e 61 6d 65 20 7b 0a 20  ) -> XorName {. 
11e0: 20 20 20 20 20 20 20 75 6e 77 72 61 70 21 28 73         unwrap!(s
11f0: 65 6c 66 2e 69 6e 6e 65 72 2e 6e 61 6d 65 28 29  elf.inner.name()
1200: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ).    }..    pub
1210: 20 66 6e 20 63 6c 6f 73 65 5f 6e 61 6d 65 73 28   fn close_names(
1220: 26 73 65 6c 66 29 20 2d 3e 20 42 54 72 65 65 53  &self) -> BTreeS
1230: 65 74 3c 58 6f 72 4e 61 6d 65 3e 20 7b 0a 20 20  et<XorName> {.  
1240: 20 20 20 20 20 20 75 6e 77 72 61 70 21 28 75 6e        unwrap!(un
1250: 77 72 61 70 21 28 73 65 6c 66 2e 69 6e 6e 65 72  wrap!(self.inner
1260: 2e 72 6f 75 74 69 6e 67 5f 74 61 62 6c 65 28 29  .routing_table()
1270: 29 2e 63 6c 6f 73 65 5f 6e 61 6d 65 73 28 26 73  ).close_names(&s
1280: 65 6c 66 2e 6e 61 6d 65 28 29 29 29 0a 20 20 20  elf.name())).   
1290: 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 72   }..    pub fn r
12a0: 6f 75 74 69 6e 67 5f 74 61 62 6c 65 28 26 73 65  outing_table(&se
12b0: 6c 66 29 20 2d 3e 20 52 6f 75 74 69 6e 67 54 61  lf) -> RoutingTa
12c0: 62 6c 65 3c 58 6f 72 4e 61 6d 65 3e 20 7b 0a 20  ble<XorName> {. 
12d0: 20 20 20 20 20 20 20 75 6e 77 72 61 70 21 28 73         unwrap!(s
12e0: 65 6c 66 2e 69 6e 6e 65 72 2e 72 6f 75 74 69 6e  elf.inner.routin
12f0: 67 5f 74 61 62 6c 65 28 29 29 0a 20 20 20 20 7d  g_table()).    }
1300: 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73 5f  ..    pub fn is_
1310: 72 65 63 69 70 69 65 6e 74 28 26 73 65 6c 66 2c  recipient(&self,
1320: 20 64 73 74 3a 20 26 41 75 74 68 6f 72 69 74 79   dst: &Authority
1330: 3c 58 6f 72 4e 61 6d 65 3e 29 20 2d 3e 20 62 6f  <XorName>) -> bo
1340: 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  ol {.        sel
1350: 66 2e 69 6e 6e 65 72 2e 72 6f 75 74 69 6e 67 5f  f.inner.routing_
1360: 74 61 62 6c 65 28 29 2e 6d 61 70 5f 6f 72 28 66  table().map_or(f
1370: 61 6c 73 65 2c 20 7c 72 74 7c 20 72 74 2e 69 6e  alse, |rt| rt.in
1380: 5f 61 75 74 68 6f 72 69 74 79 28 64 73 74 29 29  _authority(dst))
1390: 0a 20 20 20 20 7d 0a 7d 0a 0a 70 75 62 20 73 74  .    }.}..pub st
13a0: 72 75 63 74 20 54 65 73 74 4e 6f 64 65 42 75 69  ruct TestNodeBui
13b0: 6c 64 65 72 3c 27 61 3e 20 7b 0a 20 20 20 20 6e  lder<'a> {.    n
13c0: 65 74 77 6f 72 6b 3a 20 26 27 61 20 4e 65 74 77  etwork: &'a Netw
13d0: 6f 72 6b 2c 0a 20 20 20 20 66 69 72 73 74 5f 6e  ork,.    first_n
13e0: 6f 64 65 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 63  ode: bool,.    c
13f0: 6f 6e 66 69 67 3a 20 4f 70 74 69 6f 6e 3c 43 6f  onfig: Option<Co
1400: 6e 66 69 67 3e 2c 0a 20 20 20 20 65 6e 64 70 6f  nfig>,.    endpo
1410: 69 6e 74 3a 20 4f 70 74 69 6f 6e 3c 45 6e 64 70  int: Option<Endp
1420: 6f 69 6e 74 3e 2c 0a 20 20 20 20 63 61 63 68 65  oint>,.    cache
1430: 3a 20 42 6f 78 3c 43 61 63 68 65 3e 2c 0a 7d 0a  : Box<Cache>,.}.
1440: 0a 69 6d 70 6c 3c 27 61 3e 20 54 65 73 74 4e 6f  .impl<'a> TestNo
1450: 64 65 42 75 69 6c 64 65 72 3c 27 61 3e 20 7b 0a  deBuilder<'a> {.
1460: 20 20 20 20 70 75 62 20 66 6e 20 66 69 72 73 74      pub fn first
1470: 28 6d 75 74 20 73 65 6c 66 29 20 2d 3e 20 53 65  (mut self) -> Se
1480: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  lf {.        sel
1490: 66 2e 66 69 72 73 74 5f 6e 6f 64 65 20 3d 20 74  f.first_node = t
14a0: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  rue;.        sel
14b0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  f.    }..    pub
14c0: 20 66 6e 20 63 6f 6e 66 69 67 28 6d 75 74 20 73   fn config(mut s
14d0: 65 6c 66 2c 20 63 6f 6e 66 69 67 3a 20 43 6f 6e  elf, config: Con
14e0: 66 69 67 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20  fig) -> Self {. 
14f0: 20 20 20 20 20 20 20 73 65 6c 66 2e 63 6f 6e 66         self.conf
1500: 69 67 20 3d 20 53 6f 6d 65 28 63 6f 6e 66 69 67  ig = Some(config
1510: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 0a  );.        self.
1520: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66      }..    pub f
1530: 6e 20 65 6e 64 70 6f 69 6e 74 28 6d 75 74 20 73  n endpoint(mut s
1540: 65 6c 66 2c 20 65 6e 64 70 6f 69 6e 74 3a 20 45  elf, endpoint: E
1550: 6e 64 70 6f 69 6e 74 29 20 2d 3e 20 53 65 6c 66  ndpoint) -> Self
1560: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e   {.        self.
1570: 65 6e 64 70 6f 69 6e 74 20 3d 20 53 6f 6d 65 28  endpoint = Some(
1580: 65 6e 64 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  endpoint);.     
1590: 20 20 20 73 65 6c 66 0a 20 20 20 20 7d 0a 0a 20     self.    }.. 
15a0: 20 20 20 70 75 62 20 66 6e 20 63 61 63 68 65 28     pub fn cache(
15b0: 6d 75 74 20 73 65 6c 66 2c 20 75 73 65 5f 63 61  mut self, use_ca
15c0: 63 68 65 3a 20 62 6f 6f 6c 29 20 2d 3e 20 53 65  che: bool) -> Se
15d0: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  lf {.        sel
15e0: 66 2e 63 61 63 68 65 20 3d 20 69 66 20 75 73 65  f.cache = if use
15f0: 5f 63 61 63 68 65 20 7b 0a 20 20 20 20 20 20 20  _cache {.       
1600: 20 20 20 20 20 42 6f 78 3a 3a 6e 65 77 28 54 65       Box::new(Te
1610: 73 74 43 61 63 68 65 3a 3a 6e 65 77 28 29 29 0a  stCache::new()).
1620: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 6f 78  .            Box
1640: 3a 3a 6e 65 77 28 4e 75 6c 6c 43 61 63 68 65 29  ::new(NullCache)
1650: 0a 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20  .        };..   
1660: 20 20 20 20 20 73 65 6c 66 0a 20 20 20 20 7d 0a       self.    }.
1670: 0a 20 20 20 20 70 75 62 20 66 6e 20 63 72 65 61  .    pub fn crea
1680: 74 65 28 73 65 6c 66 29 20 2d 3e 20 54 65 73 74  te(self) -> Test
1690: 4e 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 54  Node {.        T
16a0: 65 73 74 4e 6f 64 65 3a 3a 6e 65 77 28 73 65 6c  estNode::new(sel
16b0: 66 2e 6e 65 74 77 6f 72 6b 2c 0a 20 20 20 20 20  f.network,.     
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 73 65 6c 66 2e 66 69 72 73 74 5f 6e 6f 64 65   self.first_node
16e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63 6f 6e          self.con
1700: 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fig,.           
1710: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
1720: 65 6e 64 70 6f 69 6e 74 2c 0a 20 20 20 20 20 20  endpoint,.      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 73 65 6c 66 2e 63 61 63 68 65 29 0a 20 20 20 20  self.cache).    
1750: 7d 0a 7d 0a 0a 0a 2f 2f 20 2d 2d 2d 2d 2d 20 20  }.}...// -----  
1760: 54 65 73 74 43 6c 69 65 6e 74 20 20 2d 2d 2d 2d  TestClient  ----
1770: 2d 0a 0a 70 75 62 20 73 74 72 75 63 74 20 54 65  -..pub struct Te
1780: 73 74 43 6c 69 65 6e 74 20 7b 0a 20 20 20 20 70  stClient {.    p
1790: 75 62 20 68 61 6e 64 6c 65 3a 20 53 65 72 76 69  ub handle: Servi
17a0: 63 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 70 75  ceHandle,.    pu
17b0: 62 20 69 6e 6e 65 72 3a 20 43 6c 69 65 6e 74 2c  b inner: Client,
17c0: 0a 20 20 20 20 70 75 62 20 66 75 6c 6c 5f 69 64  .    pub full_id
17d0: 3a 20 46 75 6c 6c 49 64 2c 0a 7d 0a 0a 69 6d 70  : FullId,.}..imp
17e0: 6c 20 54 65 73 74 43 6c 69 65 6e 74 20 7b 0a 20  l TestClient {. 
17f0: 20 20 20 70 75 62 20 66 6e 20 6e 65 77 28 6e 65     pub fn new(ne
1800: 74 77 6f 72 6b 3a 20 26 4e 65 74 77 6f 72 6b 2c  twork: &Network,
1810: 20 63 6f 6e 66 69 67 3a 20 4f 70 74 69 6f 6e 3c   config: Option<
1820: 43 6f 6e 66 69 67 3e 2c 20 65 6e 64 70 6f 69 6e  Config>, endpoin
1830: 74 3a 20 4f 70 74 69 6f 6e 3c 45 6e 64 70 6f 69  t: Option<Endpoi
1840: 6e 74 3e 29 20 2d 3e 20 53 65 6c 66 20 7b 0a 20  nt>) -> Self {. 
1850: 20 20 20 20 20 20 20 6c 65 74 20 66 75 6c 6c 5f         let full_
1860: 69 64 20 3d 20 46 75 6c 6c 49 64 3a 3a 6e 65 77  id = FullId::new
1870: 28 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ();.        let 
1880: 68 61 6e 64 6c 65 20 3d 20 6e 65 74 77 6f 72 6b  handle = network
1890: 2e 6e 65 77 5f 73 65 72 76 69 63 65 5f 68 61 6e  .new_service_han
18a0: 64 6c 65 28 63 6f 6e 66 69 67 2c 20 65 6e 64 70  dle(config, endp
18b0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6c  oint);.        l
18c0: 65 74 20 63 6c 69 65 6e 74 20 3d 20 6d 6f 63 6b  et client = mock
18d0: 5f 63 72 75 73 74 3a 3a 6d 61 6b 65 5f 63 75 72  _crust::make_cur
18e0: 72 65 6e 74 28 26 68 61 6e 64 6c 65 2c 20 7c 7c  rent(&handle, ||
18f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75   {.            u
1900: 6e 77 72 61 70 21 28 43 6c 69 65 6e 74 3a 3a 6e  nwrap!(Client::n
1910: 65 77 28 53 6f 6d 65 28 66 75 6c 6c 5f 69 64 2e  ew(Some(full_id.
1920: 63 6c 6f 6e 65 28 29 29 2c 20 6e 65 74 77 6f 72  clone()), networ
1930: 6b 2e 6d 69 6e 5f 73 65 63 74 69 6f 6e 5f 73 69  k.min_section_si
1940: 7a 65 28 29 29 29 0a 20 20 20 20 20 20 20 20 7d  ze())).        }
1950: 29 3b 0a 0a 20 20 20 20 20 20 20 20 54 65 73 74  );..        Test
1960: 43 6c 69 65 6e 74 20 7b 0a 20 20 20 20 20 20 20  Client {.       
1970: 20 20 20 20 20 68 61 6e 64 6c 65 3a 20 68 61 6e       handle: han
1980: 64 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dle,.           
1990: 20 69 6e 6e 65 72 3a 20 63 6c 69 65 6e 74 2c 0a   inner: client,.
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c 6c              full
19b0: 5f 69 64 3a 20 66 75 6c 6c 5f 69 64 2c 0a 20 20  _id: full_id,.  
19c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
19d0: 20 20 20 70 75 62 20 66 6e 20 6e 61 6d 65 28 26     pub fn name(&
19e0: 73 65 6c 66 29 20 2d 3e 20 58 6f 72 4e 61 6d 65  self) -> XorName
19f0: 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 77 72 61   {.        unwra
1a00: 70 21 28 73 65 6c 66 2e 69 6e 6e 65 72 2e 6e 61  p!(self.inner.na
1a10: 6d 65 28 29 29 0a 20 20 20 20 7d 0a 7d 0a 0a 2f  me()).    }.}../
1a20: 2f 20 2d 2d 2d 2d 2d 20 20 54 65 73 74 43 61 63  / -----  TestCac
1a30: 68 65 20 20 2d 2d 2d 2d 2d 0a 0a 23 5b 64 65 72  he  -----..#[der
1a40: 69 76 65 28 44 65 66 61 75 6c 74 29 5d 0a 70 75  ive(Default)].pu
1a50: 62 20 73 74 72 75 63 74 20 54 65 73 74 43 61 63  b struct TestCac
1a60: 68 65 28 52 65 66 43 65 6c 6c 3c 48 61 73 68 4d  he(RefCell<HashM
1a70: 61 70 3c 44 61 74 61 49 64 65 6e 74 69 66 69 65  ap<DataIdentifie
1a80: 72 2c 20 44 61 74 61 3e 3e 29 3b 0a 0a 69 6d 70  r, Data>>);..imp
1a90: 6c 20 54 65 73 74 43 61 63 68 65 20 7b 0a 20 20  l TestCache {.  
1aa0: 20 20 70 75 62 20 66 6e 20 6e 65 77 28 29 20 2d    pub fn new() -
1ab0: 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  > Self {.       
1ac0: 20 54 65 73 74 43 61 63 68 65 28 52 65 66 43 65   TestCache(RefCe
1ad0: 6c 6c 3a 3a 6e 65 77 28 48 61 73 68 4d 61 70 3a  ll::new(HashMap:
1ae0: 3a 6e 65 77 28 29 29 29 0a 20 20 20 20 7d 0a 7d  :new())).    }.}
1af0: 0a 0a 69 6d 70 6c 20 43 61 63 68 65 20 66 6f 72  ..impl Cache for
1b00: 20 54 65 73 74 43 61 63 68 65 20 7b 0a 20 20 20   TestCache {.   
1b10: 20 66 6e 20 67 65 74 28 26 73 65 6c 66 2c 20 72   fn get(&self, r
1b20: 65 71 75 65 73 74 3a 20 26 52 65 71 75 65 73 74  equest: &Request
1b30: 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 52 65 73 70  ) -> Option<Resp
1b40: 6f 6e 73 65 3e 20 7b 0a 20 20 20 20 20 20 20 20  onse> {.        
1b50: 69 66 20 6c 65 74 20 52 65 71 75 65 73 74 3a 3a  if let Request::
1b60: 47 65 74 28 69 64 65 6e 74 69 66 69 65 72 2c 20  Get(identifier, 
1b70: 6d 65 73 73 61 67 65 5f 69 64 29 20 3d 20 2a 72  message_id) = *r
1b80: 65 71 75 65 73 74 20 7b 0a 20 20 20 20 20 20 20  equest {.       
1b90: 20 20 20 20 20 73 65 6c 66 2e 30 0a 20 20 20 20       self.0.    
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2e 62 6f 72              .bor
1bb0: 72 6f 77 28 29 0a 20 20 20 20 20 20 20 20 20 20  row().          
1bc0: 20 20 20 20 20 20 2e 67 65 74 28 26 69 64 65 6e        .get(&iden
1bd0: 74 69 66 69 65 72 29 0a 20 20 20 20 20 20 20 20  tifier).        
1be0: 20 20 20 20 20 20 20 20 2e 6d 61 70 28 7c 64 61          .map(|da
1bf0: 74 61 7c 20 52 65 73 70 6f 6e 73 65 3a 3a 47 65  ta| Response::Ge
1c00: 74 53 75 63 63 65 73 73 28 64 61 74 61 2e 63 6c  tSuccess(data.cl
1c10: 6f 6e 65 28 29 2c 20 6d 65 73 73 61 67 65 5f 69  one(), message_i
1c20: 64 29 29 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  d)).        } el
1c30: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
1c40: 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 7d 0a   None.        }.
1c50: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 70 75      }..    fn pu
1c60: 74 28 26 73 65 6c 66 2c 20 72 65 73 70 6f 6e 73  t(&self, respons
1c70: 65 3a 20 52 65 73 70 6f 6e 73 65 29 20 7b 0a 20  e: Response) {. 
1c80: 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 52 65         if let Re
1c90: 73 70 6f 6e 73 65 3a 3a 47 65 74 53 75 63 63 65  sponse::GetSucce
1ca0: 73 73 28 64 61 74 61 2c 20 5f 29 20 3d 20 72 65  ss(data, _) = re
1cb0: 73 70 6f 6e 73 65 20 7b 0a 20 20 20 20 20 20 20  sponse {.       
1cc0: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 73 65 6c       let _ = sel
1cd0: 66 2e 30 2e 62 6f 72 72 6f 77 5f 6d 75 74 28 29  f.0.borrow_mut()
1ce0: 2e 69 6e 73 65 72 74 28 64 61 74 61 2e 69 64 65  .insert(data.ide
1cf0: 6e 74 69 66 69 65 72 28 29 2c 20 64 61 74 61 29  ntifier(), data)
1d00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d10: 7d 0a 7d 0a 0a 0a 2f 2f 20 2d 2d 2d 2d 2d 20 20  }.}...// -----  
1d20: 70 6f 6c 6c 5f 61 6c 6c 2c 20 63 72 65 61 74 65  poll_all, create
1d30: 5f 63 6f 6e 6e 65 63 74 65 64 5f 2e 2e 2e 20 20  _connected_...  
1d40: 2d 2d 2d 2d 2d 0a 0a 2f 2f 2f 20 50 72 6f 63 65  -----../// Proce
1d50: 73 73 20 61 6c 6c 20 65 76 65 6e 74 73 2e 20 52  ss all events. R
1d60: 65 74 75 72 6e 73 20 77 68 65 74 68 65 72 20 74  eturns whether t
1d70: 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 65 76  here were any ev
1d80: 65 6e 74 73 2e 0a 70 75 62 20 66 6e 20 70 6f 6c  ents..pub fn pol
1d90: 6c 5f 61 6c 6c 28 6e 6f 64 65 73 3a 20 26 6d 75  l_all(nodes: &mu
1da0: 74 20 5b 54 65 73 74 4e 6f 64 65 5d 2c 20 63 6c  t [TestNode], cl
1db0: 69 65 6e 74 73 3a 20 26 6d 75 74 20 5b 54 65 73  ients: &mut [Tes
1dc0: 74 43 6c 69 65 6e 74 5d 29 20 2d 3e 20 62 6f 6f  tClient]) -> boo
1dd0: 6c 20 7b 0a 20 20 20 20 6c 65 74 20 6d 75 74 20  l {.    let mut 
1de0: 72 65 73 75 6c 74 20 3d 20 66 61 6c 73 65 3b 0a  result = false;.
1df0: 20 20 20 20 66 6f 72 20 5f 20 69 6e 20 30 2e 2e      for _ in 0..
1e00: 4d 41 58 5f 50 4f 4c 4c 5f 43 41 4c 4c 53 20 7b  MAX_POLL_CALLS {
1e10: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
1e20: 20 68 61 6e 64 6c 65 64 5f 6d 65 73 73 61 67 65   handled_message
1e30: 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20   = false;.      
1e40: 20 20 69 66 20 42 41 4c 41 4e 43 45 44 5f 50 4f    if BALANCED_PO
1e50: 4c 4c 49 4e 47 20 7b 0a 20 20 20 20 20 20 20 20  LLING {.        
1e60: 20 20 20 20 2f 2f 20 68 61 6e 64 6c 65 20 61 6c      // handle al
1e70: 6c 20 63 75 72 72 65 6e 74 20 6d 65 73 73 61 67  l current messag
1e80: 65 73 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65  es for each node
1e90: 20 69 6e 20 74 75 72 6e 2c 20 74 68 65 6e 20 72   in turn, then r
1ea0: 65 70 65 61 74 20 28 76 69 61 20 6f 75 74 65 72  epeat (via outer
1eb0: 20 6c 6f 6f 70 29 3a 0a 20 20 20 20 20 20 20 20   loop):.        
1ec0: 20 20 20 20 6e 6f 64 65 73 2e 69 74 65 72 5f 6d      nodes.iter_m
1ed0: 75 74 28 29 2e 66 6f 72 65 61 63 68 28 7c 6e 6f  ut().foreach(|no
1ee0: 64 65 7c 20 68 61 6e 64 6c 65 64 5f 6d 65 73 73  de| handled_mess
1ef0: 61 67 65 20 3d 20 6e 6f 64 65 2e 70 6f 6c 6c 28  age = node.poll(
1f00: 29 20 7c 7c 20 68 61 6e 64 6c 65 64 5f 6d 65 73  ) || handled_mes
1f10: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  sage);.        }
1f20: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1f30: 20 20 20 20 68 61 6e 64 6c 65 64 5f 6d 65 73 73      handled_mess
1f40: 61 67 65 20 3d 20 6e 6f 64 65 73 2e 69 74 65 72  age = nodes.iter
1f50: 5f 6d 75 74 28 29 2e 61 6e 79 28 54 65 73 74 4e  _mut().any(TestN
1f60: 6f 64 65 3a 3a 70 6f 6c 6c 29 3b 0a 20 20 20 20  ode::poll);.    
1f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 68 61      }.        ha
1f80: 6e 64 6c 65 64 5f 6d 65 73 73 61 67 65 20 3d 20  ndled_message = 
1f90: 63 6c 69 65 6e 74 73 2e 69 74 65 72 28 29 2e 61  clients.iter().a
1fa0: 6e 79 28 7c 63 7c 20 63 2e 69 6e 6e 65 72 2e 70  ny(|c| c.inner.p
1fb0: 6f 6c 6c 28 29 29 20 7c 7c 20 68 61 6e 64 6c 65  oll()) || handle
1fc0: 64 5f 6d 65 73 73 61 67 65 3b 0a 20 20 20 20 20  d_message;.     
1fd0: 20 20 20 69 66 20 21 68 61 6e 64 6c 65 64 5f 6d     if !handled_m
1fe0: 65 73 73 61 67 65 20 7b 0a 20 20 20 20 20 20 20  essage {.       
1ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75       return resu
2000: 6c 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  lt;.        }.  
2010: 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 74        result = t
2020: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rue;.    }.    p
2030: 61 6e 69 63 21 28 22 50 6f 6c 6c 69 6e 67 20 68  anic!("Polling h
2040: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 7b  as been called {
2050: 7d 20 74 69 6d 65 73 2e 22 2c 20 4d 41 58 5f 50  } times.", MAX_P
2060: 4f 4c 4c 5f 43 41 4c 4c 53 29 3b 0a 7d 0a 0a 2f  OLL_CALLS);.}../
2070: 2f 2f 20 50 6f 6c 6c 73 20 61 6e 64 20 70 72 6f  // Polls and pro
2080: 63 65 73 73 65 73 20 61 6c 6c 20 65 76 65 6e 74  cesses all event
2090: 73 2c 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  s, until there a
20a0: 72 65 20 6e 6f 20 75 6e 61 63 6b 6e 6f 77 6c 65  re no unacknowle
20b0: 64 67 65 64 20 6d 65 73 73 61 67 65 73 20 6c 65  dged messages le
20c0: 66 74 20 61 6e 64 20 63 6c 65 61 72 69 6e 67 0a  ft and clearing.
20d0: 2f 2f 2f 20 74 68 65 20 6e 6f 64 65 73 27 20 73  /// the nodes' s
20e0: 74 61 74 65 20 74 72 69 67 67 65 72 73 20 6e 6f  tate triggers no
20f0: 20 6e 65 77 20 65 76 65 6e 74 73 20 61 6e 79 6d   new events anym
2100: 6f 72 65 2e 0a 70 75 62 20 66 6e 20 70 6f 6c 6c  ore..pub fn poll
2110: 5f 61 6e 64 5f 72 65 73 65 6e 64 28 6e 6f 64 65  _and_resend(node
2120: 73 3a 20 26 6d 75 74 20 5b 54 65 73 74 4e 6f 64  s: &mut [TestNod
2130: 65 5d 2c 20 63 6c 69 65 6e 74 73 3a 20 26 6d 75  e], clients: &mu
2140: 74 20 5b 54 65 73 74 43 6c 69 65 6e 74 5d 29 20  t [TestClient]) 
2150: 7b 0a 20 20 20 20 66 6f 72 20 5f 20 69 6e 20 30  {.    for _ in 0
2160: 2e 2e 4d 41 58 5f 50 4f 4c 4c 5f 43 41 4c 4c 53  ..MAX_POLL_CALLS
2170: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 70 6f   {.        if po
2180: 6c 6c 5f 61 6c 6c 28 6e 6f 64 65 73 2c 20 63 6c  ll_all(nodes, cl
2190: 69 65 6e 74 73 29 20 7b 0a 20 20 20 20 20 20 20  ients) {.       
21a0: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 63 61 6c       let mut cal
21b0: 6c 5f 63 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20  l_count = 1;.   
21c0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 72           while r
21d0: 65 73 65 6e 64 5f 75 6e 61 63 6b 6e 6f 77 6c 65  esend_unacknowle
21e0: 64 67 65 64 28 6e 6f 64 65 73 2c 20 63 6c 69 65  dged(nodes, clie
21f0: 6e 74 73 29 20 26 26 20 70 6f 6c 6c 5f 61 6c 6c  nts) && poll_all
2200: 28 6e 6f 64 65 73 2c 20 63 6c 69 65 6e 74 73 29  (nodes, clients)
2210: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2220: 20 20 20 63 61 6c 6c 5f 63 6f 75 6e 74 20 2b 3d     call_count +=
2230: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2240: 20 20 20 20 61 73 73 65 72 74 5f 6e 65 21 28 63      assert_ne!(c
2250: 61 6c 6c 5f 63 6f 75 6e 74 2c 0a 20 20 20 20 20  all_count,.     
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 4d 41 58 5f 50 4f 4c 4c 5f 43        MAX_POLL_C
2280: 41 4c 4c 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ALLS,.          
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 22 50 6f 6c 6c 69 6e 67 20 61 6e 64 20 72 65   "Polling and re
22b0: 73 65 6e 64 69 6e 67 20 75 6e 61 63 6b 6e 6f 77  sending unacknow
22c0: 6c 65 64 67 65 64 20 68 61 73 20 62 65 65 6e 20  ledged has been 
22d0: 63 61 6c 6c 65 64 20 7b 7d 20 74 69 6d 65 73 2e  called {} times.
22e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 41                MA
2300: 58 5f 50 4f 4c 4c 5f 43 41 4c 4c 53 29 3b 0a 20  X_POLL_CALLS);. 
2310: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2320: 20 20 20 20 20 20 20 20 20 6e 6f 64 65 73 2e 69           nodes.i
2330: 74 65 72 5f 6d 75 74 28 29 2e 66 6f 72 65 61 63  ter_mut().foreac
2340: 68 28 7c 6e 6f 64 65 7c 20 6e 6f 64 65 2e 69 6e  h(|node| node.in
2350: 6e 65 72 2e 63 6c 65 61 72 5f 73 74 61 74 65 28  ner.clear_state(
2360: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  ));.        } el
2370: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2380: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
2390: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 6e   }.    }.    pan
23a0: 69 63 21 28 22 50 6f 6c 6c 69 6e 67 20 68 61 73  ic!("Polling has
23b0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 7b 7d 20   been called {} 
23c0: 74 69 6d 65 73 2e 22 2c 20 4d 41 58 5f 50 4f 4c  times.", MAX_POL
23d0: 4c 5f 43 41 4c 4c 53 29 3b 0a 7d 0a 0a 2f 2f 2f  L_CALLS);.}..///
23e0: 20 43 68 65 63 6b 73 20 65 61 63 68 20 6f 66 20   Checks each of 
23f0: 74 68 65 20 6c 61 73 74 20 60 63 6f 75 6e 74 60  the last `count`
2400: 20 6d 65 6d 62 65 72 73 20 6f 66 20 60 6e 6f 64   members of `nod
2410: 65 73 60 20 66 6f 72 20 61 20 60 43 6f 6e 6e 65  es` for a `Conne
2420: 63 74 65 64 60 20 65 76 65 6e 74 2c 20 61 6e 64  cted` event, and
2430: 20 72 65 6d 6f 76 65 73 20 74 68 6f 73 65 0a 2f   removes those./
2440: 2f 2f 20 77 68 69 63 68 20 64 6f 6e 27 74 20 66  // which don't f
2450: 69 72 65 20 6f 6e 65 2e 20 52 65 74 75 72 6e 73  ire one. Returns
2460: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2470: 65 6d 6f 76 65 64 20 6e 6f 64 65 73 2e 0a 70 75  emoved nodes..pu
2480: 62 20 66 6e 20 72 65 6d 6f 76 65 5f 6e 6f 64 65  b fn remove_node
2490: 73 5f 77 68 69 63 68 5f 66 61 69 6c 65 64 5f 74  s_which_failed_t
24a0: 6f 5f 63 6f 6e 6e 65 63 74 28 6e 6f 64 65 73 3a  o_connect(nodes:
24b0: 20 26 6d 75 74 20 56 65 63 3c 54 65 73 74 4e 6f   &mut Vec<TestNo
24c0: 64 65 3e 2c 20 63 6f 75 6e 74 3a 20 75 73 69 7a  de>, count: usiz
24d0: 65 29 20 2d 3e 20 75 73 69 7a 65 20 7b 0a 20 20  e) -> usize {.  
24e0: 20 20 6c 65 74 20 66 61 69 6c 65 64 5f 74 6f 5f    let failed_to_
24f0: 6a 6f 69 6e 20 3d 20 6e 6f 64 65 73 2e 69 74 65  join = nodes.ite
2500: 72 5f 6d 75 74 28 29 0a 20 20 20 20 20 20 20 20  r_mut().        
2510: 2e 65 6e 75 6d 65 72 61 74 65 28 29 0a 20 20 20  .enumerate().   
2520: 20 20 20 20 20 2e 72 65 76 28 29 0a 20 20 20 20       .rev().    
2530: 20 20 20 20 2e 74 61 6b 65 28 63 6f 75 6e 74 29      .take(count)
2540: 0a 20 20 20 20 20 20 20 20 2e 66 69 6c 74 65 72  .        .filter
2550: 5f 6d 61 70 28 7c 28 69 6e 64 65 78 2c 20 72 65  _map(|(index, re
2560: 66 20 6d 75 74 20 6e 6f 64 65 29 7c 20 7b 0a 20  f mut node)| {. 
2570: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
2580: 20 6c 65 74 20 4f 6b 28 65 76 65 6e 74 29 20 3d   let Ok(event) =
2590: 20 6e 6f 64 65 2e 74 72 79 5f 6e 65 78 74 5f 65   node.try_next_e
25a0: 76 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  v() {.          
25b0: 20 20 20 20 20 20 69 66 20 6c 65 74 20 45 76 65        if let Eve
25c0: 6e 74 3a 3a 43 6f 6e 6e 65 63 74 65 64 20 3d 20  nt::Connected = 
25d0: 65 76 65 6e 74 20 7b 0a 20 20 20 20 20 20 20 20  event {.        
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
25f0: 72 6e 20 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 20  rn None;.       
2600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2620: 20 20 20 20 20 53 6f 6d 65 28 69 6e 64 65 78 29       Some(index)
2630: 0a 20 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20  .        }).    
2640: 20 20 20 20 2e 63 6f 6c 6c 65 63 74 5f 76 65 63      .collect_vec
2650: 28 29 3b 0a 20 20 20 20 66 6f 72 20 69 6e 64 65  ();.    for inde
2660: 78 20 69 6e 20 26 66 61 69 6c 65 64 5f 74 6f 5f  x in &failed_to_
2670: 6a 6f 69 6e 20 7b 0a 20 20 20 20 20 20 20 20 6c  join {.        l
2680: 65 74 20 5f 20 3d 20 6e 6f 64 65 73 2e 72 65 6d  et _ = nodes.rem
2690: 6f 76 65 28 2a 69 6e 64 65 78 29 3b 0a 20 20 20  ove(*index);.   
26a0: 20 7d 0a 20 20 20 20 70 6f 6c 6c 5f 61 6e 64 5f   }.    poll_and_
26b0: 72 65 73 65 6e 64 28 6e 6f 64 65 73 2c 20 26 6d  resend(nodes, &m
26c0: 75 74 20 5b 5d 29 3b 0a 20 20 20 20 66 61 69 6c  ut []);.    fail
26d0: 65 64 5f 74 6f 5f 6a 6f 69 6e 2e 6c 65 6e 28 29  ed_to_join.len()
26e0: 0a 7d 0a 0a 70 75 62 20 66 6e 20 63 72 65 61 74  .}..pub fn creat
26f0: 65 5f 63 6f 6e 6e 65 63 74 65 64 5f 6e 6f 64 65  e_connected_node
2700: 73 28 6e 65 74 77 6f 72 6b 3a 20 26 4e 65 74 77  s(network: &Netw
2710: 6f 72 6b 2c 20 73 69 7a 65 3a 20 75 73 69 7a 65  ork, size: usize
2720: 29 20 2d 3e 20 4e 6f 64 65 73 20 7b 0a 20 20 20  ) -> Nodes {.   
2730: 20 63 72 65 61 74 65 5f 63 6f 6e 6e 65 63 74 65   create_connecte
2740: 64 5f 6e 6f 64 65 73 5f 77 69 74 68 5f 63 61 63  d_nodes_with_cac
2750: 68 65 28 6e 65 74 77 6f 72 6b 2c 20 73 69 7a 65  he(network, size
2760: 2c 20 66 61 6c 73 65 29 0a 7d 0a 0a 70 75 62 20  , false).}..pub 
2770: 66 6e 20 63 72 65 61 74 65 5f 63 6f 6e 6e 65 63  fn create_connec
2780: 74 65 64 5f 6e 6f 64 65 73 5f 77 69 74 68 5f 63  ted_nodes_with_c
2790: 61 63 68 65 28 6e 65 74 77 6f 72 6b 3a 20 26 4e  ache(network: &N
27a0: 65 74 77 6f 72 6b 2c 20 73 69 7a 65 3a 20 75 73  etwork, size: us
27b0: 69 7a 65 2c 20 75 73 65 5f 63 61 63 68 65 3a 20  ize, use_cache: 
27c0: 62 6f 6f 6c 29 20 2d 3e 20 4e 6f 64 65 73 20 7b  bool) -> Nodes {
27d0: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 6e 6f 64  .    let mut nod
27e0: 65 73 20 3d 20 56 65 63 3a 3a 6e 65 77 28 29 3b  es = Vec::new();
27f0: 0a 0a 20 20 20 20 2f 2f 20 43 72 65 61 74 65 20  ..    // Create 
2800: 74 68 65 20 73 65 65 64 20 6e 6f 64 65 2e 0a 20  the seed node.. 
2810: 20 20 20 6e 6f 64 65 73 2e 70 75 73 68 28 54 65     nodes.push(Te
2820: 73 74 4e 6f 64 65 3a 3a 62 75 69 6c 64 65 72 28  stNode::builder(
2830: 6e 65 74 77 6f 72 6b 29 0a 20 20 20 20 20 20 20  network).       
2840: 20 2e 66 69 72 73 74 28 29 0a 20 20 20 20 20 20   .first().      
2850: 20 20 2e 65 6e 64 70 6f 69 6e 74 28 45 6e 64 70    .endpoint(Endp
2860: 6f 69 6e 74 28 30 29 29 0a 20 20 20 20 20 20 20  oint(0)).       
2870: 20 2e 63 61 63 68 65 28 75 73 65 5f 63 61 63 68   .cache(use_cach
2880: 65 29 0a 20 20 20 20 20 20 20 20 2e 63 72 65 61  e).        .crea
2890: 74 65 28 29 29 3b 0a 20 20 20 20 6e 6f 64 65 73  te());.    nodes
28a0: 5b 30 5d 2e 70 6f 6c 6c 28 29 3b 0a 0a 20 20 20  [0].poll();..   
28b0: 20 6c 65 74 20 63 6f 6e 66 69 67 20 3d 20 43 6f   let config = Co
28c0: 6e 66 69 67 3a 3a 77 69 74 68 5f 63 6f 6e 74 61  nfig::with_conta
28d0: 63 74 73 28 26 5b 6e 6f 64 65 73 5b 30 5d 2e 68  cts(&[nodes[0].h
28e0: 61 6e 64 6c 65 2e 65 6e 64 70 6f 69 6e 74 28 29  andle.endpoint()
28f0: 5d 29 3b 0a 0a 20 20 20 20 2f 2f 20 43 72 65 61  ]);..    // Crea
2900: 74 65 20 6f 74 68 65 72 20 6e 6f 64 65 73 20 75  te other nodes u
2910: 73 69 6e 67 20 74 68 65 20 73 65 65 64 20 6e 6f  sing the seed no
2920: 64 65 20 65 6e 64 70 6f 69 6e 74 20 61 73 20 62  de endpoint as b
2930: 6f 6f 74 73 74 72 61 70 20 63 6f 6e 74 61 63 74  ootstrap contact
2940: 2e 0a 20 20 20 20 66 6f 72 20 69 20 69 6e 20 31  ..    for i in 1
2950: 2e 2e 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20  ..size {.       
2960: 20 6e 6f 64 65 73 2e 70 75 73 68 28 54 65 73 74   nodes.push(Test
2970: 4e 6f 64 65 3a 3a 62 75 69 6c 64 65 72 28 6e 65  Node::builder(ne
2980: 74 77 6f 72 6b 29 0a 20 20 20 20 20 20 20 20 20  twork).         
2990: 20 20 20 2e 63 6f 6e 66 69 67 28 63 6f 6e 66 69     .config(confi
29a0: 67 2e 63 6c 6f 6e 65 28 29 29 0a 20 20 20 20 20  g.clone()).     
29b0: 20 20 20 20 20 20 20 2e 65 6e 64 70 6f 69 6e 74         .endpoint
29c0: 28 45 6e 64 70 6f 69 6e 74 28 69 29 29 0a 20 20  (Endpoint(i)).  
29d0: 20 20 20 20 20 20 20 20 20 20 2e 63 61 63 68 65            .cache
29e0: 28 75 73 65 5f 63 61 63 68 65 29 0a 20 20 20 20  (use_cache).    
29f0: 20 20 20 20 20 20 20 20 2e 63 72 65 61 74 65 28          .create(
2a00: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 6f 6c 6c  ));.        poll
2a10: 5f 61 6e 64 5f 72 65 73 65 6e 64 28 26 6d 75 74  _and_resend(&mut
2a20: 20 6e 6f 64 65 73 2c 20 26 6d 75 74 20 5b 5d 29   nodes, &mut [])
2a30: 3b 0a 20 20 20 20 20 20 20 20 76 65 72 69 66 79  ;.        verify
2a40: 5f 69 6e 76 61 72 69 61 6e 74 5f 66 6f 72 5f 61  _invariant_for_a
2a50: 6c 6c 5f 6e 6f 64 65 73 28 26 6e 6f 64 65 73 29  ll_nodes(&nodes)
2a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 65 74  ;.    }..    let
2a70: 20 6e 20 3d 20 63 6d 70 3a 3a 6d 69 6e 28 6e 6f   n = cmp::min(no
2a80: 64 65 73 2e 6c 65 6e 28 29 2c 20 6e 65 74 77 6f  des.len(), netwo
2a90: 72 6b 2e 6d 69 6e 5f 73 65 63 74 69 6f 6e 5f 73  rk.min_section_s
2aa0: 69 7a 65 28 29 29 20 2d 20 31 3b 0a 0a 20 20 20  ize()) - 1;..   
2ab0: 20 66 6f 72 20 6e 6f 64 65 20 69 6e 20 26 6d 75   for node in &mu
2ac0: 74 20 6e 6f 64 65 73 20 7b 0a 20 20 20 20 20 20  t nodes {.      
2ad0: 20 20 65 78 70 65 63 74 5f 6e 65 78 74 5f 65 76    expect_next_ev
2ae0: 65 6e 74 21 28 6e 6f 64 65 2c 20 45 76 65 6e 74  ent!(node, Event
2af0: 3a 3a 43 6f 6e 6e 65 63 74 65 64 29 3b 0a 0a 20  ::Connected);.. 
2b00: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6e         let mut n
2b10: 6f 64 65 5f 61 64 64 65 64 5f 63 6f 75 6e 74 20  ode_added_count 
2b20: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 77 68  = 0;..        wh
2b30: 69 6c 65 20 6c 65 74 20 4f 6b 28 65 76 65 6e 74  ile let Ok(event
2b40: 29 20 3d 20 6e 6f 64 65 2e 74 72 79 5f 6e 65 78  ) = node.try_nex
2b50: 74 5f 65 76 28 29 20 7b 0a 20 20 20 20 20 20 20  t_ev() {.       
2b60: 20 20 20 20 20 6d 61 74 63 68 20 65 76 65 6e 74       match event
2b70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2b80: 20 20 20 45 76 65 6e 74 3a 3a 4e 6f 64 65 41 64     Event::NodeAd
2b90: 64 65 64 28 2e 2e 29 20 3d 3e 20 6e 6f 64 65 5f  ded(..) => node_
2ba0: 61 64 64 65 64 5f 63 6f 75 6e 74 20 2b 3d 20 31  added_count += 1
2bb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bc0: 20 20 45 76 65 6e 74 3a 3a 4e 6f 64 65 4c 6f 73    Event::NodeLos
2bd0: 74 28 2e 2e 29 20 7c 0a 20 20 20 20 20 20 20 20  t(..) |.        
2be0: 20 20 20 20 20 20 20 20 45 76 65 6e 74 3a 3a 53          Event::S
2bf0: 65 63 74 69 6f 6e 53 70 6c 69 74 28 2e 2e 29 20  ectionSplit(..) 
2c00: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2c10: 20 20 45 76 65 6e 74 3a 3a 52 65 73 74 61 72 74    Event::Restart
2c20: 52 65 71 75 69 72 65 64 20 7c 0a 20 20 20 20 20  Required |.     
2c30: 20 20 20 20 20 20 20 20 20 20 20 45 76 65 6e 74             Event
2c40: 3a 3a 54 69 63 6b 20 3d 3e 20 28 29 2c 0a 20 20  ::Tick => (),.  
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 76                ev
2c60: 65 6e 74 20 3d 3e 20 70 61 6e 69 63 21 28 22 47  ent => panic!("G
2c70: 6f 74 20 75 6e 65 78 70 65 63 74 65 64 20 65 76  ot unexpected ev
2c80: 65 6e 74 3a 20 7b 3a 3f 7d 22 2c 20 65 76 65 6e  ent: {:?}", even
2c90: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
2ca0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
2cb0: 20 20 20 20 20 61 73 73 65 72 74 21 28 6e 6f 64       assert!(nod
2cc0: 65 5f 61 64 64 65 64 5f 63 6f 75 6e 74 20 3e 3d  e_added_count >=
2cd0: 20 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   n,.            
2ce0: 20 20 20 20 22 47 6f 74 20 6f 6e 6c 79 20 7b 7d      "Got only {}
2cf0: 20 4e 6f 64 65 41 64 64 65 64 20 65 76 65 6e 74   NodeAdded event
2d00: 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s.",.           
2d10: 20 20 20 20 20 6e 6f 64 65 5f 61 64 64 65 64 5f       node_added_
2d20: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  count);.    }.. 
2d30: 20 20 20 4e 6f 64 65 73 28 6e 6f 64 65 73 29 0a     Nodes(nodes).
2d40: 7d 0a 0a 70 75 62 20 66 6e 20 63 72 65 61 74 65  }..pub fn create
2d50: 5f 63 6f 6e 6e 65 63 74 65 64 5f 6e 6f 64 65 73  _connected_nodes
2d60: 5f 75 6e 74 69 6c 5f 73 70 6c 69 74 28 6e 65 74  _until_split(net
2d70: 77 6f 72 6b 3a 20 26 4e 65 74 77 6f 72 6b 2c 0a  work: &Network,.
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
2db0: 5f 6c 65 6e 67 74 68 73 3a 20 56 65 63 3c 75 73  _lengths: Vec<us
2dc0: 69 7a 65 3e 2c 0a 20 20 20 20 20 20 20 20 20 20  ize>,.          
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df0: 75 73 65 5f 63 61 63 68 65 3a 20 62 6f 6f 6c 29  use_cache: bool)
2e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 4e 6f             -> No
2e30: 64 65 73 20 7b 0a 20 20 20 20 2f 2f 20 53 74 61  des {.    // Sta
2e40: 72 74 20 66 69 72 73 74 20 6e 6f 64 65 2e 0a 20  rt first node.. 
2e50: 20 20 20 6c 65 74 20 6d 75 74 20 6e 6f 64 65 73     let mut nodes
2e60: 20 3d 0a 20 20 20 20 20 20 20 20 76 65 63 21 5b   =.        vec![
2e70: 54 65 73 74 4e 6f 64 65 3a 3a 62 75 69 6c 64 65  TestNode::builde
2e80: 72 28 6e 65 74 77 6f 72 6b 29 2e 66 69 72 73 74  r(network).first
2e90: 28 29 2e 65 6e 64 70 6f 69 6e 74 28 45 6e 64 70  ().endpoint(Endp
2ea0: 6f 69 6e 74 28 30 29 29 2e 63 61 63 68 65 28 75  oint(0)).cache(u
2eb0: 73 65 5f 63 61 63 68 65 29 2e 63 72 65 61 74 65  se_cache).create
2ec0: 28 29 5d 3b 0a 20 20 20 20 6e 6f 64 65 73 5b 30  ()];.    nodes[0
2ed0: 5d 2e 70 6f 6c 6c 28 29 3b 0a 20 20 20 20 61 64  ].poll();.    ad
2ee0: 64 5f 63 6f 6e 6e 65 63 74 65 64 5f 6e 6f 64 65  d_connected_node
2ef0: 73 5f 75 6e 74 69 6c 5f 73 70 6c 69 74 28 6e 65  s_until_split(ne
2f00: 74 77 6f 72 6b 2c 20 26 6d 75 74 20 6e 6f 64 65  twork, &mut node
2f10: 73 2c 20 70 72 65 66 69 78 5f 6c 65 6e 67 74 68  s, prefix_length
2f20: 73 2c 20 75 73 65 5f 63 61 63 68 65 29 3b 0a 20  s, use_cache);. 
2f30: 20 20 20 4e 6f 64 65 73 28 6e 6f 64 65 73 29 0a     Nodes(nodes).
2f40: 7d 0a 0a 2f 2f 20 54 68 69 73 20 61 64 64 73 20  }..// This adds 
2f50: 6e 65 77 20 6e 6f 64 65 73 20 28 61 6c 6c 20 77  new nodes (all w
2f60: 69 74 68 20 60 75 73 65 5f 63 61 63 68 65 60 20  ith `use_cache` 
2f70: 73 65 74 20 74 6f 20 60 74 72 75 65 60 29 20 75  set to `true`) u
2f80: 6e 74 69 6c 20 74 68 65 20 73 70 65 63 69 66 69  ntil the specifi
2f90: 65 64 20 64 69 73 6a 6f 69 6e 74 20 73 65 63 74  ed disjoint sect
2fa0: 69 6f 6e 73 0a 2f 2f 20 68 61 76 65 20 66 6f 72  ions.// have for
2fb0: 6d 65 64 2e 0a 2f 2f 0a 2f 2f 20 60 70 72 65 66  med..//.// `pref
2fc0: 69 78 5f 6c 65 6e 67 74 68 73 60 20 69 73 20 61  ix_lengths` is a
2fd0: 6e 20 61 72 72 61 79 20 72 65 70 72 65 73 65 6e  n array represen
2fe0: 74 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ting the require
2ff0: 64 20 60 62 69 74 5f 63 6f 75 6e 74 60 73 20 6f  d `bit_count`s o
3000: 66 20 74 68 65 20 73 65 63 74 69 6f 6e 20 70 72  f the section pr
3010: 65 66 69 78 65 73 2e 20 20 46 6f 72 0a 2f 2f 20  efixes.  For.// 
3020: 65 78 61 6d 70 6c 65 20 70 61 73 73 69 6e 67 20  example passing 
3030: 5b 31 2c 20 32 2c 20 33 2c 20 33 5d 20 63 6f 75  [1, 2, 3, 3] cou
3040: 6c 64 20 79 69 65 6c 64 20 61 20 6e 65 74 77 6f  ld yield a netwo
3050: 72 6b 20 63 6f 6d 70 72 69 73 69 6e 67 20 73 65  rk comprising se
3060: 63 74 69 6f 6e 73 20 5b 30 2c 20 31 30 30 2c 20  ctions [0, 100, 
3070: 31 30 31 2c 20 31 31 5d 2c 20 6f 72 0a 2f 2f 20  101, 11], or.// 
3080: 70 61 73 73 69 6e 67 20 5b 32 2c 20 32 2c 20 33  passing [2, 2, 3
3090: 2c 20 33 2c 20 33 2c 20 33 5d 20 63 6f 75 6c 64  , 3, 3, 3] could
30a0: 20 79 69 65 6c 64 20 5b 30 30 30 2c 20 30 30 31   yield [000, 001
30b0: 2c 20 30 31 2c 20 31 30 30 2c 20 31 30 31 2c 20  , 01, 100, 101, 
30c0: 31 31 5d 2c 20 77 68 69 6c 65 20 70 61 73 73 69  11], while passi
30d0: 6e 67 20 5b 31 2c 20 31 5d 20 77 69 6c 6c 0a 2f  ng [1, 1] will./
30e0: 2f 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20 73  / always yield s
30f0: 65 63 74 69 6f 6e 73 20 5b 30 2c 20 31 5d 2e 0a  ections [0, 1]..
3100: 2f 2f 0a 2f 2f 20 54 68 65 20 61 72 72 61 79 20  //.// The array 
3110: 69 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 65  is sanity checke
3120: 64 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64  d (e.g. it would
3130: 20 62 65 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   be an error to 
3140: 70 61 73 73 20 5b 31 2c 20 31 2c 20 31 5d 29 2c  pass [1, 1, 1]),
3150: 20 6d 75 73 74 20 63 6f 6d 70 72 69 73 65 20 61   must comprise a
3160: 74 0a 2f 2f 20 6c 65 61 73 74 20 74 77 6f 20 65  t.// least two e
3170: 6c 65 6d 65 6e 74 73 2c 20 61 6e 64 20 65 76 65  lements, and eve
3180: 72 79 20 65 6c 65 6d 65 6e 74 20 6d 75 73 74 20  ry element must 
3190: 62 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  be no more than 
31a0: 60 38 60 2e 0a 70 75 62 20 66 6e 20 61 64 64 5f  `8`..pub fn add_
31b0: 63 6f 6e 6e 65 63 74 65 64 5f 6e 6f 64 65 73 5f  connected_nodes_
31c0: 75 6e 74 69 6c 5f 73 70 6c 69 74 28 6e 65 74 77  until_split(netw
31d0: 6f 72 6b 3a 20 26 4e 65 74 77 6f 72 6b 2c 0a 20  ork: &Network,. 
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 20 20 20 6e 6f 64 65 73 3a 20 26 6d 75        nodes: &mu
3210: 74 20 56 65 63 3c 54 65 73 74 4e 6f 64 65 3e 2c  t Vec<TestNode>,
3220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 20 20 20 20 20 6d 75 74 20 70 72 65 66          mut pref
3250: 69 78 5f 6c 65 6e 67 74 68 73 3a 20 56 65 63 3c  ix_lengths: Vec<
3260: 75 73 69 7a 65 3e 2c 0a 20 20 20 20 20 20 20 20  usize>,.        
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
3290: 73 65 5f 63 61 63 68 65 3a 20 62 6f 6f 6c 29 20  se_cache: bool) 
32a0: 7b 0a 20 20 20 20 2f 2f 20 47 65 74 20 73 6f 72  {.    // Get sor
32b0: 74 65 64 20 6c 69 73 74 20 6f 66 20 70 72 65 66  ted list of pref
32c0: 69 78 65 73 20 74 6f 20 73 75 69 74 20 72 65 71  ixes to suit req
32d0: 75 65 73 74 65 64 20 6c 65 6e 67 74 68 73 2e 0a  uested lengths..
32e0: 20 20 20 20 73 61 6e 69 74 79 5f 63 68 65 63 6b      sanity_check
32f0: 28 26 70 72 65 66 69 78 5f 6c 65 6e 67 74 68 73  (&prefix_lengths
3300: 29 3b 0a 20 20 20 20 70 72 65 66 69 78 5f 6c 65  );.    prefix_le
3310: 6e 67 74 68 73 2e 73 6f 72 74 28 29 3b 0a 20 20  ngths.sort();.  
3320: 20 20 6c 65 74 20 6d 75 74 20 72 6e 67 20 3d 20    let mut rng = 
3330: 6e 65 74 77 6f 72 6b 2e 6e 65 77 5f 72 6e 67 28  network.new_rng(
3340: 29 3b 0a 20 20 20 20 6c 65 74 20 70 72 65 66 69  );.    let prefi
3350: 78 65 73 20 3d 20 70 72 65 66 69 78 65 73 28 26  xes = prefixes(&
3360: 70 72 65 66 69 78 5f 6c 65 6e 67 74 68 73 2c 20  prefix_lengths, 
3370: 26 6d 75 74 20 72 6e 67 29 3b 0a 0a 20 20 20 20  &mut rng);..    
3380: 2f 2f 20 43 6c 65 61 6e 75 70 20 74 68 65 20 70  // Cleanup the p
3390: 72 65 76 69 6f 75 73 20 65 76 65 6e 74 20 71 75  revious event qu
33a0: 65 75 65 0a 20 20 20 20 66 6f 72 20 6e 6f 64 65  eue.    for node
33b0: 20 69 6e 20 6e 6f 64 65 73 2e 69 74 65 72 5f 6d   in nodes.iter_m
33c0: 75 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20 77  ut() {.        w
33d0: 68 69 6c 65 20 6c 65 74 20 4f 6b 28 5f 29 20 3d  hile let Ok(_) =
33e0: 20 6e 6f 64 65 2e 74 72 79 5f 6e 65 78 74 5f 65   node.try_next_e
33f0: 76 28 29 20 7b 7d 0a 20 20 20 20 7d 0a 0a 20 20  v() {}.    }..  
3400: 20 20 2f 2f 20 53 74 61 72 74 20 65 6e 6f 75 67    // Start enoug
3410: 68 20 6e 65 77 20 6e 6f 64 65 73 20 75 6e 64 65  h new nodes unde
3420: 72 20 65 61 63 68 20 74 61 72 67 65 74 20 70 72  r each target pr
3430: 65 66 69 78 20 74 6f 20 74 72 69 67 67 65 72 20  efix to trigger 
3440: 61 20 73 70 6c 69 74 20 65 76 65 6e 74 75 61 6c  a split eventual
3450: 6c 79 2e 0a 20 20 20 20 66 6f 72 20 70 72 65 66  ly..    for pref
3460: 69 78 20 69 6e 20 26 70 72 65 66 69 78 65 73 20  ix in &prefixes 
3470: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 75  {.        let nu
3480: 6d 5f 69 6e 5f 73 65 63 74 69 6f 6e 20 3d 20 6e  m_in_section = n
3490: 6f 64 65 73 2e 69 74 65 72 28 29 2e 66 69 6c 74  odes.iter().filt
34a0: 65 72 28 7c 6e 6f 64 65 7c 20 70 72 65 66 69 78  er(|node| prefix
34b0: 2e 6d 61 74 63 68 65 73 28 26 6e 6f 64 65 2e 6e  .matches(&node.n
34c0: 61 6d 65 28 29 29 29 2e 63 6f 75 6e 74 28 29 3b  ame())).count();
34d0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 6f 20 65  .        // To e
34e0: 6e 73 75 72 65 20 79 6f 75 20 64 6f 6e 27 74 20  nsure you don't 
34f0: 68 69 74 20 74 68 69 73 20 61 73 73 65 72 74 2c  hit this assert,
3500: 20 64 6f 6e 27 74 20 68 61 76 65 20 6d 6f 72 65   don't have more
3510: 20 74 68 61 6e 20 60 6d 69 6e 5f 73 70 6c 69 74   than `min_split
3520: 5f 73 69 7a 65 28 29 60 20 65 6e 74 72 69 65 73  _size()` entries
3530: 20 69 6e 0a 20 20 20 20 20 20 20 20 2f 2f 20 60   in.        // `
3540: 6e 6f 64 65 73 60 20 77 68 65 6e 20 63 61 6c 6c  nodes` when call
3550: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
3560: 6e 2e 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n..        asser
3570: 74 21 28 6e 75 6d 5f 69 6e 5f 73 65 63 74 69 6f  t!(num_in_sectio
3580: 6e 20 3c 3d 20 6e 6f 64 65 73 5b 30 5d 2e 72 6f  n <= nodes[0].ro
3590: 75 74 69 6e 67 5f 74 61 62 6c 65 28 29 2e 6d 69  uting_table().mi
35a0: 6e 5f 73 70 6c 69 74 5f 73 69 7a 65 28 29 2c 0a  n_split_size(),.
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 22 54 68 65 20 65 78 69 73 74 69 6e 67 20 6e 6f  "The existing no
35d0: 64 65 73 27 20 6e 61 6d 65 73 20 64 69 73 61 6c  des' names disal
35e0: 6c 6f 77 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  low creation of 
35f0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 72  the requested pr
3600: 65 66 69 78 65 73 2e 20 54 68 65 72 65 20 5c 0a  efixes. There \.
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 61 72 65 20 7b 7d 20 6e 6f 64 65 73 20 77 68   are {} nodes wh
3630: 69 63 68 20 61 6c 6c 20 62 65 6c 6f 6e 67 20 69  ich all belong i
3640: 6e 20 7b 3a 3f 7d 20 77 68 69 63 68 20 65 78 63  n {:?} which exc
3650: 65 65 64 73 20 74 68 65 20 6c 69 6d 69 74 20 68  eeds the limit h
3660: 65 72 65 20 6f 66 20 7b 7d 2e 22 2c 0a 20 20 20  ere of {}.",.   
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
3680: 5f 69 6e 5f 73 65 63 74 69 6f 6e 2c 0a 20 20 20  _in_section,.   
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
36a0: 66 69 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fix,.           
36b0: 20 20 20 20 20 6e 6f 64 65 73 5b 30 5d 2e 72 6f       nodes[0].ro
36c0: 75 74 69 6e 67 5f 74 61 62 6c 65 28 29 2e 6d 69  uting_table().mi
36d0: 6e 5f 73 70 6c 69 74 5f 73 69 7a 65 28 29 29 3b  n_split_size());
36e0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 69 6e  .        let min
36f0: 5f 73 70 6c 69 74 5f 73 69 7a 65 20 3d 20 6e 6f  _split_size = no
3700: 64 65 73 5b 30 5d 2e 72 6f 75 74 69 6e 67 5f 74  des[0].routing_t
3710: 61 62 6c 65 28 29 2e 6d 69 6e 5f 73 70 6c 69 74  able().min_split
3720: 5f 73 69 7a 65 28 29 20 2d 20 6e 75 6d 5f 69 6e  _size() - num_in
3730: 5f 73 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  _section;.      
3740: 20 20 66 6f 72 20 5f 20 69 6e 20 30 2e 2e 6d 69    for _ in 0..mi
3750: 6e 5f 73 70 6c 69 74 5f 73 69 7a 65 20 7b 0a 20  n_split_size {. 
3760: 20 20 20 20 20 20 20 20 20 20 20 61 64 64 5f 6e             add_n
3770: 6f 64 65 5f 74 6f 5f 73 65 63 74 69 6f 6e 28 6e  ode_to_section(n
3780: 65 74 77 6f 72 6b 2c 20 6e 6f 64 65 73 2c 20 70  etwork, nodes, p
3790: 72 65 66 69 78 2c 20 26 6d 75 74 20 72 6e 67 2c  refix, &mut rng,
37a0: 20 75 73 65 5f 63 61 63 68 65 29 3b 0a 20 20 20   use_cache);.   
37b0: 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 64 65           if node
37c0: 73 2e 6c 65 6e 28 29 20 3d 3d 20 32 20 7b 0a 20  s.len() == 2 {. 
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
37e0: 78 70 65 63 74 5f 6e 65 78 74 5f 65 76 65 6e 74  xpect_next_event
37f0: 21 28 6e 6f 64 65 73 5b 30 5d 2c 20 45 76 65 6e  !(nodes[0], Even
3800: 74 3a 3a 43 6f 6e 6e 65 63 74 65 64 29 3b 0a 20  t::Connected);. 
3810: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
3820: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3830: 20 20 2f 2f 20 49 66 20 72 65 63 75 72 73 69 76    // If recursiv
3840: 65 20 73 70 6c 69 74 73 20 61 72 65 20 61 64 64  e splits are add
3850: 65 64 20 74 6f 20 52 6f 75 74 69 6e 67 20 28 68  ed to Routing (h
3860: 74 74 70 73 3a 2f 2f 6d 61 69 64 73 61 66 65 2e  ttps://maidsafe.
3870: 61 74 6c 61 73 73 69 61 6e 2e 6e 65 74 2f 62 72  atlassian.net/br
3880: 6f 77 73 65 2f 4d 41 49 44 2d 31 38 36 31 29 0a  owse/MAID-1861).
3890: 20 20 20 20 2f 2f 20 74 68 69 73 20 6e 65 78 74      // this next
38a0: 20 73 74 65 70 20 63 61 6e 20 62 65 20 72 65 6d   step can be rem
38b0: 6f 76 65 64 2e 0a 20 20 20 20 2f 2f 20 46 69 6e  oved..    // Fin
38c0: 64 20 61 6e 64 20 61 64 64 20 6e 6f 64 65 73 20  d and add nodes 
38d0: 74 6f 20 73 65 63 74 69 6f 6e 73 20 77 68 69 63  to sections whic
38e0: 68 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  h still need to 
38f0: 73 70 6c 69 74 20 74 6f 20 74 72 69 67 67 65 72  split to trigger
3900: 20 74 68 69 73 2e 0a 20 20 20 20 6c 6f 6f 70 20   this..    loop 
3910: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75  {.        let mu
3920: 74 20 66 6f 75 6e 64 5f 70 72 65 66 69 78 20 3d  t found_prefix =
3930: 20 4e 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 66   None;.        f
3940: 6f 72 20 6e 6f 64 65 20 69 6e 20 6e 6f 64 65 73  or node in nodes
3950: 2e 69 74 65 72 28 29 20 7b 0a 20 20 20 20 20 20  .iter() {.      
3960: 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d        if let Som
3970: 65 28 70 72 65 66 69 78 5f 74 6f 5f 73 70 6c 69  e(prefix_to_spli
3980: 74 29 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  t) =.           
3990: 20 20 20 20 20 75 6e 77 72 61 70 21 28 6e 6f 64       unwrap!(nod
39a0: 65 2e 69 6e 6e 65 72 2e 72 6f 75 74 69 6e 67 5f  e.inner.routing_
39b0: 74 61 62 6c 65 28 29 29 0a 20 20 20 20 20 20 20  table()).       
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 70 72               .pr
39d0: 65 66 69 78 65 73 28 29 0a 20 20 20 20 20 20 20  efixes().       
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 69 74               .it
39f0: 65 72 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  er().           
3a00: 20 20 20 20 20 20 20 20 20 2e 66 69 6e 64 28 7c           .find(|
3a10: 26 70 72 65 66 69 78 7c 20 21 70 72 65 66 69 78  &prefix| !prefix
3a20: 65 73 2e 63 6f 6e 74 61 69 6e 73 28 70 72 65 66  es.contains(pref
3a30: 69 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ix)) {.         
3a40: 20 20 20 20 20 20 20 2f 2f 20 41 73 73 65 72 74         // Assert
3a50: 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 62   that this can b
3a60: 65 20 73 70 6c 69 74 20 64 6f 77 6e 20 74 6f 20  e split down to 
3a70: 61 20 64 65 73 69 72 65 64 20 70 72 65 66 69 78  a desired prefix
3a80: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3a90: 20 20 6c 65 74 20 69 73 5f 76 61 6c 69 64 20 3d    let is_valid =
3aa0: 20 7c 70 72 65 66 69 78 3a 20 26 50 72 65 66 69   |prefix: &Prefi
3ab0: 78 3c 58 6f 72 4e 61 6d 65 3e 7c 20 7b 0a 20 20  x<XorName>| {.  
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 20 20 69 66 20 70 72 65 66 69 78 2e 69 73 5f 63    if prefix.is_c
3ae0: 6f 6d 70 61 74 69 62 6c 65 28 70 72 65 66 69 78  ompatible(prefix
3af0: 5f 74 6f 5f 73 70 6c 69 74 29 20 7b 0a 20 20 20  _to_split) {.   
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 20 20 20 61 73 73 65 72 74 21 28 70 72 65       assert!(pre
3b20: 66 69 78 2e 62 69 74 5f 63 6f 75 6e 74 28 29 20  fix.bit_count() 
3b30: 3e 20 70 72 65 66 69 78 5f 74 6f 5f 73 70 6c 69  > prefix_to_spli
3b40: 74 2e 62 69 74 5f 63 6f 75 6e 74 28 29 29 3b 0a  t.bit_count());.
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
3b70: 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
3b80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
3ba0: 61 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  alse.           
3bb0: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
3bc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 21 28          assert!(
3bd0: 70 72 65 66 69 78 65 73 2e 69 74 65 72 28 29 2e  prefixes.iter().
3be0: 61 6e 79 28 69 73 5f 76 61 6c 69 64 29 29 3b 0a  any(is_valid));.
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 66 6f 75 6e 64 5f 70 72 65 66 69 78 20 3d 20 53  found_prefix = S
3c10: 6f 6d 65 28 2a 70 72 65 66 69 78 5f 74 6f 5f 73  ome(*prefix_to_s
3c20: 70 6c 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20  plit);.         
3c30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3c40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3c60: 20 6c 65 74 20 53 6f 6d 65 28 70 72 65 66 69 78   let Some(prefix
3c70: 5f 74 6f 5f 73 70 6c 69 74 29 20 3d 20 66 6f 75  _to_split) = fou
3c80: 6e 64 5f 70 72 65 66 69 78 20 7b 0a 20 20 20 20  nd_prefix {.    
3c90: 20 20 20 20 20 20 20 20 61 64 64 5f 6e 6f 64 65          add_node
3ca0: 5f 74 6f 5f 73 65 63 74 69 6f 6e 28 6e 65 74 77  _to_section(netw
3cb0: 6f 72 6b 2c 20 6e 6f 64 65 73 2c 20 26 70 72 65  ork, nodes, &pre
3cc0: 66 69 78 5f 74 6f 5f 73 70 6c 69 74 2c 20 26 6d  fix_to_split, &m
3cd0: 75 74 20 72 6e 67 2c 20 75 73 65 5f 63 61 63 68  ut rng, use_cach
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  e);.        } el
3cf0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
3d00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20  }.    }..    // 
3d20: 47 61 74 68 65 72 20 61 6c 6c 20 74 68 65 20 61  Gather all the a
3d30: 63 74 75 61 6c 20 70 72 65 66 69 78 65 73 20 61  ctual prefixes a
3d40: 6e 64 20 63 68 65 63 6b 20 74 68 65 79 20 61 72  nd check they ar
3d50: 65 20 61 73 20 65 78 70 65 63 74 65 64 2e 0a 20  e as expected.. 
3d60: 20 20 20 6c 65 74 20 6d 75 74 20 61 63 74 75 61     let mut actua
3d70: 6c 5f 70 72 65 66 69 78 65 73 20 3d 20 42 54 72  l_prefixes = BTr
3d80: 65 65 53 65 74 3a 3a 3c 50 72 65 66 69 78 3c 58  eeSet::<Prefix<X
3d90: 6f 72 4e 61 6d 65 3e 3e 3a 3a 6e 65 77 28 29 3b  orName>>::new();
3da0: 0a 20 20 20 20 66 6f 72 20 6e 6f 64 65 20 69 6e  .    for node in
3db0: 20 6e 6f 64 65 73 2e 69 74 65 72 28 29 20 7b 0a   nodes.iter() {.
3dc0: 20 20 20 20 20 20 20 20 61 63 74 75 61 6c 5f 70          actual_p
3dd0: 72 65 66 69 78 65 73 2e 61 70 70 65 6e 64 28 26  refixes.append(&
3de0: 6d 75 74 20 75 6e 77 72 61 70 21 28 6e 6f 64 65  mut unwrap!(node
3df0: 2e 69 6e 6e 65 72 2e 72 6f 75 74 69 6e 67 5f 74  .inner.routing_t
3e00: 61 62 6c 65 28 29 29 2e 70 72 65 66 69 78 65 73  able()).prefixes
3e10: 28 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ());.    }.    a
3e20: 73 73 65 72 74 5f 65 71 21 28 70 72 65 66 69 78  ssert_eq!(prefix
3e30: 65 73 2e 69 74 65 72 28 29 2e 63 6c 6f 6e 65 64  es.iter().cloned
3e40: 28 29 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 42 54 72  ().collect::<BTr
3e50: 65 65 53 65 74 3c 5f 3e 3e 28 29 2c 0a 20 20 20  eeSet<_>>(),.   
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 61 63 74 75              actu
3e70: 61 6c 5f 70 72 65 66 69 78 65 73 29 3b 0a 20 20  al_prefixes);.  
3e80: 20 20 61 73 73 65 72 74 5f 65 71 21 28 70 72 65    assert_eq!(pre
3e90: 66 69 78 5f 6c 65 6e 67 74 68 73 2c 0a 20 20 20  fix_lengths,.   
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
3eb0: 69 78 65 73 2e 69 74 65 72 28 29 2e 6d 61 70 28  ixes.iter().map(
3ec0: 7c 70 72 65 66 69 78 7c 20 70 72 65 66 69 78 2e  |prefix| prefix.
3ed0: 62 69 74 5f 63 6f 75 6e 74 28 29 29 2e 63 6f 6c  bit_count()).col
3ee0: 6c 65 63 74 5f 76 65 63 28 29 29 3b 0a 0a 20 20  lect_vec());..  
3ef0: 20 20 2f 2f 20 43 6c 65 61 72 20 61 6c 6c 20 65    // Clear all e
3f00: 76 65 6e 74 20 71 75 65 75 65 73 20 61 6e 64 20  vent queues and 
3f10: 63 6c 65 61 72 20 74 68 65 20 60 6e 65 78 74 5f  clear the `next_
3f20: 6e 6f 64 65 5f 6e 61 6d 65 60 20 76 61 6c 75 65  node_name` value
3f30: 73 2e 0a 20 20 20 20 66 6f 72 20 6e 6f 64 65 20  s..    for node 
3f40: 69 6e 20 6e 6f 64 65 73 2e 69 74 65 72 5f 6d 75  in nodes.iter_mu
3f50: 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20 77 68  t() {.        wh
3f60: 69 6c 65 20 6c 65 74 20 4f 6b 28 65 76 65 6e 74  ile let Ok(event
3f70: 29 20 3d 20 6e 6f 64 65 2e 74 72 79 5f 6e 65 78  ) = node.try_nex
3f80: 74 5f 65 76 28 29 20 7b 0a 20 20 20 20 20 20 20  t_ev() {.       
3f90: 20 20 20 20 20 6d 61 74 63 68 20 65 76 65 6e 74       match event
3fa0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3fb0: 20 20 20 45 76 65 6e 74 3a 3a 4e 6f 64 65 41 64     Event::NodeAd
3fc0: 64 65 64 28 2e 2e 29 20 7c 0a 20 20 20 20 20 20  ded(..) |.      
3fd0: 20 20 20 20 20 20 20 20 20 20 45 76 65 6e 74 3a            Event:
3fe0: 3a 4e 6f 64 65 4c 6f 73 74 28 2e 2e 29 20 7c 0a  :NodeLost(..) |.
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 45 76 65 6e 74 3a 3a 54 69 63 6b 20 7c 0a 20 20  Event::Tick |.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 76                Ev
4020: 65 6e 74 3a 3a 53 65 63 74 69 6f 6e 53 70 6c 69  ent::SectionSpli
4030: 74 28 2e 2e 29 20 3d 3e 20 28 29 2c 0a 20 20 20  t(..) => (),.   
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65               eve
4050: 6e 74 20 3d 3e 20 70 61 6e 69 63 21 28 22 47 6f  nt => panic!("Go
4060: 74 20 75 6e 65 78 70 65 63 74 65 64 20 65 76 65  t unexpected eve
4070: 6e 74 3a 20 7b 3a 3f 7d 22 2c 20 65 76 65 6e 74  nt: {:?}", event
4080: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ),.            }
4090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
40a0: 20 20 20 6e 6f 64 65 2e 69 6e 6e 65 72 2e 63 6c     node.inner.cl
40b0: 65 61 72 5f 6e 65 78 74 5f 6e 6f 64 65 5f 6e 61  ear_next_node_na
40c0: 6d 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  me();.    }..   
40d0: 20 74 72 61 63 65 21 28 22 43 72 65 61 74 65 64   trace!("Created
40e0: 20 74 65 73 74 6e 65 74 20 63 6f 6d 70 72 69 73   testnet compris
40f0: 69 6e 67 20 7b 3a 3f 7d 22 2c 20 70 72 65 66 69  ing {:?}", prefi
4100: 78 65 73 29 3b 0a 7d 0a 0a 2f 2f 20 43 72 65 61  xes);.}..// Crea
4110: 74 65 20 60 73 69 7a 65 60 20 63 6c 69 65 6e 74  te `size` client
4120: 73 2c 20 61 6c 6c 20 6f 66 20 77 68 6f 6d 20 61  s, all of whom a
4130: 72 65 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  re connected to 
4140: 60 6e 6f 64 65 73 5b 30 5d 60 2e 0a 70 75 62 20  `nodes[0]`..pub 
4150: 66 6e 20 63 72 65 61 74 65 5f 63 6f 6e 6e 65 63  fn create_connec
4160: 74 65 64 5f 63 6c 69 65 6e 74 73 28 6e 65 74 77  ted_clients(netw
4170: 6f 72 6b 3a 20 26 4e 65 74 77 6f 72 6b 2c 0a 20  ork: &Network,. 
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
41a0: 6f 64 65 73 3a 20 26 6d 75 74 20 5b 54 65 73 74  odes: &mut [Test
41b0: 4e 6f 64 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Node],.         
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 20 20 20 20 73 69 7a 65 3a 20 75 73 69         size: usi
41e0: 7a 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze).            
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 20 2d 3e 20 56 65 63 3c 54 65 73 74 43      -> Vec<TestC
4210: 6c 69 65 6e 74 3e 20 7b 0a 20 20 20 20 6c 65 74  lient> {.    let
4220: 20 63 6f 6e 74 61 63 74 20 3d 20 6e 6f 64 65 73   contact = nodes
4230: 5b 30 5d 2e 68 61 6e 64 6c 65 2e 65 6e 64 70 6f  [0].handle.endpo
4240: 69 6e 74 28 29 3b 0a 20 20 20 20 6c 65 74 20 6d  int();.    let m
4250: 75 74 20 63 6c 69 65 6e 74 73 20 3d 20 56 65 63  ut clients = Vec
4260: 3a 3a 77 69 74 68 5f 63 61 70 61 63 69 74 79 28  ::with_capacity(
4270: 73 69 7a 65 29 3b 0a 0a 20 20 20 20 66 6f 72 20  size);..    for 
4280: 5f 20 69 6e 20 30 2e 2e 73 69 7a 65 20 7b 0a 20  _ in 0..size {. 
4290: 20 20 20 20 20 20 20 6c 65 74 20 63 6c 69 65 6e         let clien
42a0: 74 20 3d 20 54 65 73 74 43 6c 69 65 6e 74 3a 3a  t = TestClient::
42b0: 6e 65 77 28 6e 65 74 77 6f 72 6b 2c 20 53 6f 6d  new(network, Som
42c0: 65 28 43 6f 6e 66 69 67 3a 3a 77 69 74 68 5f 63  e(Config::with_c
42d0: 6f 6e 74 61 63 74 73 28 26 5b 63 6f 6e 74 61 63  ontacts(&[contac
42e0: 74 5d 29 29 2c 20 4e 6f 6e 65 29 3b 0a 20 20 20  t])), None);.   
42f0: 20 20 20 20 20 63 6c 69 65 6e 74 73 2e 70 75 73       clients.pus
4300: 68 28 63 6c 69 65 6e 74 29 3b 0a 0a 20 20 20 20  h(client);..    
4310: 20 20 20 20 6c 65 74 20 5f 20 3d 20 70 6f 6c 6c      let _ = poll
4320: 5f 61 6c 6c 28 6e 6f 64 65 73 2c 20 26 6d 75 74  _all(nodes, &mut
4330: 20 63 6c 69 65 6e 74 73 29 3b 0a 20 20 20 20 20   clients);.     
4340: 20 20 20 65 78 70 65 63 74 5f 6e 65 78 74 5f 65     expect_next_e
4350: 76 65 6e 74 21 28 75 6e 77 72 61 70 21 28 63 6c  vent!(unwrap!(cl
4360: 69 65 6e 74 73 2e 6c 61 73 74 5f 6d 75 74 28 29  ients.last_mut()
4370: 29 2c 20 45 76 65 6e 74 3a 3a 43 6f 6e 6e 65 63  ), Event::Connec
4380: 74 65 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ted);.    }..   
4390: 20 63 6c 69 65 6e 74 73 0a 7d 0a 0a 0a 2f 2f 20   clients.}...// 
43a0: 2d 2d 2d 2d 2d 20 20 53 6d 61 6c 6c 20 6d 69 73  -----  Small mis
43b0: 63 20 66 75 6e 63 74 69 6f 6e 73 20 20 2d 2d 2d  c functions  ---
43c0: 2d 2d 0a 0a 2f 2f 2f 20 53 6f 72 74 73 20 74 68  --../// Sorts th
43d0: 65 20 67 69 76 65 6e 20 6e 6f 64 65 73 20 62 79  e given nodes by
43e0: 20 74 68 65 69 72 20 64 69 73 74 61 6e 63 65 20   their distance 
43f0: 74 6f 20 60 6e 61 6d 65 60 2e 20 4e 6f 74 65 20  to `name`. Note 
4400: 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 63  that this will c
4410: 61 6c 6c 20 74 68 65 20 60 6e 61 6d 65 28 29 60  all the `name()`
4420: 0a 2f 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  ./// function on
4430: 20 74 68 65 6d 20 77 68 69 63 68 20 63 61 75 73   them which caus
4440: 65 73 20 70 6f 6c 6c 69 6e 67 2c 20 73 6f 20 69  es polling, so i
4450: 74 20 63 61 6c 6c 73 20 60 70 6f 6c 6c 5f 61 6c  t calls `poll_al
4460: 6c 60 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  l` to make sure 
4470: 74 68 61 74 20 61 6c 6c 20 6f 74 68 65 72 0a 2f  that all other./
4480: 2f 2f 20 65 76 65 6e 74 73 20 68 61 76 65 20 62  // events have b
4490: 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 62 65  een processed be
44a0: 66 6f 72 65 20 73 6f 72 74 69 6e 67 2e 0a 70 75  fore sorting..pu
44b0: 62 20 66 6e 20 73 6f 72 74 5f 6e 6f 64 65 73 5f  b fn sort_nodes_
44c0: 62 79 5f 64 69 73 74 61 6e 63 65 5f 74 6f 28 6e  by_distance_to(n
44d0: 6f 64 65 73 3a 20 26 6d 75 74 20 5b 54 65 73 74  odes: &mut [Test
44e0: 4e 6f 64 65 5d 2c 20 6e 61 6d 65 3a 20 26 58 6f  Node], name: &Xo
44f0: 72 4e 61 6d 65 29 20 7b 0a 20 20 20 20 6c 65 74  rName) {.    let
4500: 20 5f 20 3d 20 70 6f 6c 6c 5f 61 6c 6c 28 6e 6f   _ = poll_all(no
4510: 64 65 73 2c 20 26 6d 75 74 20 5b 5d 29 3b 20 2f  des, &mut []); /
4520: 2f 20 50 6f 6c 6c 0a 20 20 20 20 6e 6f 64 65 73  / Poll.    nodes
4530: 2e 73 6f 72 74 5f 62 79 28 7c 6e 6f 64 65 30 2c  .sort_by(|node0,
4540: 20 6e 6f 64 65 31 7c 20 6e 61 6d 65 2e 63 6d 70   node1| name.cmp
4550: 5f 64 69 73 74 61 6e 63 65 28 26 6e 6f 64 65 30  _distance(&node0
4560: 2e 6e 61 6d 65 28 29 2c 20 26 6e 6f 64 65 31 2e  .name(), &node1.
4570: 6e 61 6d 65 28 29 29 29 3b 0a 7d 0a 0a 70 75 62  name()));.}..pub
4580: 20 66 6e 20 76 65 72 69 66 79 5f 69 6e 76 61 72   fn verify_invar
4590: 69 61 6e 74 5f 66 6f 72 5f 61 6c 6c 5f 6e 6f 64  iant_for_all_nod
45a0: 65 73 28 6e 6f 64 65 73 3a 20 26 5b 54 65 73 74  es(nodes: &[Test
45b0: 4e 6f 64 65 5d 29 20 7b 0a 20 20 20 20 6c 65 74  Node]) {.    let
45c0: 20 72 6f 75 74 69 6e 67 5f 74 61 62 6c 65 73 20   routing_tables 
45d0: 3d 20 6e 6f 64 65 73 2e 69 74 65 72 28 29 2e 6d  = nodes.iter().m
45e0: 61 70 28 7c 6e 7c 20 6e 2e 72 6f 75 74 69 6e 67  ap(|n| n.routing
45f0: 5f 74 61 62 6c 65 28 29 29 2e 63 6f 6c 6c 65 63  _table()).collec
4600: 74 5f 76 65 63 28 29 3b 0a 20 20 20 20 76 65 72  t_vec();.    ver
4610: 69 66 79 5f 6e 65 74 77 6f 72 6b 5f 69 6e 76 61  ify_network_inva
4620: 72 69 61 6e 74 28 72 6f 75 74 69 6e 67 5f 74 61  riant(routing_ta
4630: 62 6c 65 73 2e 69 74 65 72 28 29 29 3b 0a 7d 0a  bles.iter());.}.
4640: 0a 2f 2f 20 47 65 6e 65 72 61 74 65 20 61 20 76  .// Generate a v
4650: 65 63 74 6f 72 20 6f 66 20 72 61 6e 64 6f 6d 20  ector of random 
4660: 62 79 74 65 73 20 6f 66 20 74 68 65 20 67 69 76  bytes of the giv
4670: 65 6e 20 6c 65 6e 67 74 68 2e 0a 70 75 62 20 66  en length..pub f
4680: 6e 20 67 65 6e 5f 62 79 74 65 73 3c 52 3a 20 52  n gen_bytes<R: R
4690: 6e 67 3e 28 72 6e 67 3a 20 26 6d 75 74 20 52 2c  ng>(rng: &mut R,
46a0: 20 73 69 7a 65 3a 20 75 73 69 7a 65 29 20 2d 3e   size: usize) ->
46b0: 20 56 65 63 3c 75 38 3e 20 7b 0a 20 20 20 20 72   Vec<u8> {.    r
46c0: 6e 67 2e 67 65 6e 5f 69 74 65 72 28 29 2e 74 61  ng.gen_iter().ta
46d0: 6b 65 28 73 69 7a 65 29 2e 63 6f 6c 6c 65 63 74  ke(size).collect
46e0: 28 29 0a 7d 0a 0a 2f 2f 20 47 65 6e 65 72 61 74  ().}..// Generat
46f0: 65 20 72 61 6e 64 6f 6d 20 69 6d 6d 75 74 61 62  e random immutab
4700: 6c 65 20 64 61 74 61 20 77 69 74 68 20 74 68 65  le data with the
4710: 20 67 69 76 65 6e 20 70 61 79 6c 6f 61 64 20 6c   given payload l
4720: 65 6e 67 74 68 2e 0a 70 75 62 20 66 6e 20 67 65  ength..pub fn ge
4730: 6e 5f 69 6d 6d 75 74 61 62 6c 65 5f 64 61 74 61  n_immutable_data
4740: 3c 52 3a 20 52 6e 67 3e 28 72 6e 67 3a 20 26 6d  <R: Rng>(rng: &m
4750: 75 74 20 52 2c 20 73 69 7a 65 3a 20 75 73 69 7a  ut R, size: usiz
4760: 65 29 20 2d 3e 20 44 61 74 61 20 7b 0a 20 20 20  e) -> Data {.   
4770: 20 44 61 74 61 3a 3a 49 6d 6d 75 74 61 62 6c 65   Data::Immutable
4780: 28 49 6d 6d 75 74 61 62 6c 65 44 61 74 61 3a 3a  (ImmutableData::
4790: 6e 65 77 28 67 65 6e 5f 62 79 74 65 73 28 72 6e  new(gen_bytes(rn
47a0: 67 2c 20 73 69 7a 65 29 29 29 0a 7d 0a 0a 2f 2f  g, size))).}..//
47b0: 2f 20 52 65 73 65 6e 64 73 20 61 6c 6c 20 75 6e  / Resends all un
47c0: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 20 6d 65 73  acknowledged mes
47d0: 73 61 67 65 73 2e 20 52 65 74 75 72 6e 73 20 60  sages. Returns `
47e0: 66 61 6c 73 65 60 20 69 66 20 6e 6f 6e 65 20 6f  false` if none o
47f0: 66 20 74 68 65 20 6e 6f 64 65 73 20 6f 72 20 63  f the nodes or c
4800: 6c 69 65 6e 74 73 20 68 61 64 20 61 6e 79 0a 2f  lients had any./
4810: 2f 2f 20 75 6e 61 63 6b 6e 6f 77 6c 65 64 67 65  // unacknowledge
4820: 64 20 6d 65 73 73 61 67 65 73 20 6c 65 66 74 2e  d messages left.
4830: 0a 66 6e 20 72 65 73 65 6e 64 5f 75 6e 61 63 6b  .fn resend_unack
4840: 6e 6f 77 6c 65 64 67 65 64 28 6e 6f 64 65 73 3a  nowledged(nodes:
4850: 20 26 6d 75 74 20 5b 54 65 73 74 4e 6f 64 65 5d   &mut [TestNode]
4860: 2c 20 63 6c 69 65 6e 74 73 3a 20 26 6d 75 74 20  , clients: &mut 
4870: 5b 54 65 73 74 43 6c 69 65 6e 74 5d 29 20 2d 3e  [TestClient]) ->
4880: 20 62 6f 6f 6c 20 7b 0a 20 20 20 20 6c 65 74 20   bool {.    let 
4890: 6e 6f 64 65 5f 72 65 73 65 6e 64 20 3d 20 7c 6e  node_resend = |n
48a0: 6f 64 65 3a 20 26 6d 75 74 20 54 65 73 74 4e 6f  ode: &mut TestNo
48b0: 64 65 7c 20 6e 6f 64 65 2e 69 6e 6e 65 72 2e 72  de| node.inner.r
48c0: 65 73 65 6e 64 5f 75 6e 61 63 6b 6e 6f 77 6c 65  esend_unacknowle
48d0: 64 67 65 64 28 29 3b 0a 20 20 20 20 6c 65 74 20  dged();.    let 
48e0: 63 6c 69 65 6e 74 5f 72 65 73 65 6e 64 20 3d 20  client_resend = 
48f0: 7c 63 6c 69 65 6e 74 3a 20 26 6d 75 74 20 54 65  |client: &mut Te
4900: 73 74 43 6c 69 65 6e 74 7c 20 63 6c 69 65 6e 74  stClient| client
4910: 2e 69 6e 6e 65 72 2e 72 65 73 65 6e 64 5f 75 6e  .inner.resend_un
4920: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 28 29 3b 0a  acknowledged();.
4930: 20 20 20 20 6c 65 74 20 6f 72 20 3d 20 7c 78 2c      let or = |x,
4940: 20 79 7c 20 78 20 7c 7c 20 79 3b 0a 20 20 20 20   y| x || y;.    
4950: 6e 6f 64 65 73 2e 69 74 65 72 5f 6d 75 74 28 29  nodes.iter_mut()
4960: 2e 6d 61 70 28 6e 6f 64 65 5f 72 65 73 65 6e 64  .map(node_resend
4970: 29 2e 63 68 61 69 6e 28 63 6c 69 65 6e 74 73 2e  ).chain(clients.
4980: 69 74 65 72 5f 6d 75 74 28 29 2e 6d 61 70 28 63  iter_mut().map(c
4990: 6c 69 65 6e 74 5f 72 65 73 65 6e 64 29 29 2e 66  lient_resend)).f
49a0: 6f 6c 64 28 66 61 6c 73 65 2c 20 6f 72 29 0a 7d  old(false, or).}
49b0: 0a 0a 66 6e 20 73 61 6e 69 74 79 5f 63 68 65 63  ..fn sanity_chec
49c0: 6b 28 70 72 65 66 69 78 5f 6c 65 6e 67 74 68 73  k(prefix_lengths
49d0: 3a 20 26 5b 75 73 69 7a 65 5d 29 20 7b 0a 20 20  : &[usize]) {.  
49e0: 20 20 61 73 73 65 72 74 21 28 70 72 65 66 69 78    assert!(prefix
49f0: 5f 6c 65 6e 67 74 68 73 2e 6c 65 6e 28 29 20 3e  _lengths.len() >
4a00: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
4a10: 22 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65  "There should be
4a20: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 73 70   at least two sp
4a30: 65 63 69 66 69 65 64 20 70 72 65 66 69 78 20 6c  ecified prefix l
4a40: 65 6e 67 74 68 73 22 29 3b 0a 20 20 20 20 6c 65  engths");.    le
4a50: 74 20 73 75 6d 20 3d 20 70 72 65 66 69 78 5f 6c  t sum = prefix_l
4a60: 65 6e 67 74 68 73 2e 69 74 65 72 28 29 2e 66 6f  engths.iter().fo
4a70: 6c 64 28 30 2c 20 7c 61 63 63 75 6d 75 6c 61 74  ld(0, |accumulat
4a80: 65 64 2c 20 26 62 69 74 5f 63 6f 75 6e 74 7c 20  ed, &bit_count| 
4a90: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4aa0: 21 28 62 69 74 5f 63 6f 75 6e 74 20 3c 3d 20 38  !(bit_count <= 8
4ab0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ac0: 20 20 22 54 68 65 20 73 70 65 63 69 66 69 65 64    "The specified
4ad0: 20 70 72 65 66 69 78 20 6c 65 6e 67 74 68 73 20   prefix lengths 
4ae0: 7b 3a 3f 7d 20 6d 75 73 74 20 65 61 63 68 20 62  {:?} must each b
4af0: 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38  e no more than 8
4b00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4b10: 20 20 20 70 72 65 66 69 78 5f 6c 65 6e 67 74 68     prefix_length
4b20: 73 29 3b 0a 20 20 20 20 20 20 20 20 61 63 63 75  s);.        accu
4b30: 6d 75 6c 61 74 65 64 20 2b 20 28 31 20 3c 3c 20  mulated + (1 << 
4b40: 28 38 20 2d 20 62 69 74 5f 63 6f 75 6e 74 29 29  (8 - bit_count))
4b50: 0a 20 20 20 20 7d 29 3b 0a 20 20 20 20 69 66 20  .    });.    if 
4b60: 73 75 6d 20 3c 20 32 35 36 20 7b 0a 20 20 20 20  sum < 256 {.    
4b70: 20 20 20 20 70 61 6e 69 63 21 28 22 54 68 65 20      panic!("The 
4b80: 73 70 65 63 69 66 69 65 64 20 70 72 65 66 69 78  specified prefix
4b90: 20 6c 65 6e 67 74 68 73 20 7b 3a 3f 7d 20 77 6f   lengths {:?} wo
4ba0: 75 6c 64 20 6e 6f 74 20 63 6f 76 65 72 20 74 68  uld not cover th
4bb0: 65 20 65 6e 74 69 72 65 20 61 64 64 72 65 73 73  e entire address
4bc0: 20 73 70 61 63 65 22 2c 0a 20 20 20 20 20 20 20   space",.       
4bd0: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 5f 6c          prefix_l
4be0: 65 6e 67 74 68 73 29 3b 0a 20 20 20 20 7d 20 65  engths);.    } e
4bf0: 6c 73 65 20 69 66 20 73 75 6d 20 3e 20 32 35 36  lse if sum > 256
4c00: 20 7b 0a 20 20 20 20 20 20 20 20 70 61 6e 69 63   {.        panic
4c10: 21 28 22 54 68 65 20 73 70 65 63 69 66 69 65 64  !("The specified
4c20: 20 70 72 65 66 69 78 20 6c 65 6e 67 74 68 73 20   prefix lengths 
4c30: 7b 3a 3f 7d 20 77 6f 75 6c 64 20 72 65 71 75 69  {:?} would requi
4c40: 72 65 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73  re overlapping s
4c50: 65 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20 20 20  ections",.      
4c60: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 5f           prefix_
4c70: 6c 65 6e 67 74 68 73 29 3b 0a 20 20 20 20 7d 0a  lengths);.    }.
4c80: 7d 0a 0a 66 6e 20 70 72 65 66 69 78 65 73 3c 54  }..fn prefixes<T
4c90: 3a 20 52 6e 67 3e 28 70 72 65 66 69 78 5f 6c 65  : Rng>(prefix_le
4ca0: 6e 67 74 68 73 3a 20 26 5b 75 73 69 7a 65 5d 2c  ngths: &[usize],
4cb0: 20 72 6e 67 3a 20 26 6d 75 74 20 54 29 20 2d 3e   rng: &mut T) ->
4cc0: 20 56 65 63 3c 50 72 65 66 69 78 3c 58 6f 72 4e   Vec<Prefix<XorN
4cd0: 61 6d 65 3e 3e 20 7b 0a 20 20 20 20 6c 65 74 20  ame>> {.    let 
4ce0: 5f 20 3d 20 70 72 65 66 69 78 5f 6c 65 6e 67 74  _ = prefix_lengt
4cf0: 68 73 2e 69 74 65 72 28 29 2e 66 6f 6c 64 28 30  hs.iter().fold(0
4d00: 2c 20 7c 70 72 65 76 69 6f 75 73 2c 20 26 63 75  , |previous, &cu
4d10: 72 72 65 6e 74 7c 20 7b 0a 20 20 20 20 20 20 20  rrent| {.       
4d20: 20 61 73 73 65 72 74 21 28 70 72 65 76 69 6f 75   assert!(previou
4d30: 73 20 3c 3d 20 63 75 72 72 65 6e 74 2c 0a 20 20  s <= current,.  
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
4d50: 6c 69 63 65 20 7b 3a 3f 7d 20 73 68 6f 75 6c 64  lice {:?} should
4d60: 20 62 65 20 73 6f 72 74 65 64 2e 22 2c 0a 20 20   be sorted.",.  
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
4d80: 65 66 69 78 5f 6c 65 6e 67 74 68 73 29 3b 0a 20  efix_lengths);. 
4d90: 20 20 20 20 20 20 20 63 75 72 72 65 6e 74 0a 20         current. 
4da0: 20 20 20 7d 29 3b 0a 20 20 20 20 6c 65 74 20 6d     });.    let m
4db0: 75 74 20 70 72 65 66 69 78 65 73 20 3d 20 76 65  ut prefixes = ve
4dc0: 63 21 5b 50 72 65 66 69 78 3a 3a 6e 65 77 28 70  c![Prefix::new(p
4dd0: 72 65 66 69 78 5f 6c 65 6e 67 74 68 73 5b 30 5d  refix_lengths[0]
4de0: 2c 20 72 6e 67 2e 67 65 6e 28 29 29 5d 3b 0a 20  , rng.gen())];. 
4df0: 20 20 20 77 68 69 6c 65 20 70 72 65 66 69 78 65     while prefixe
4e00: 73 2e 6c 65 6e 28 29 20 3c 20 70 72 65 66 69 78  s.len() < prefix
4e10: 5f 6c 65 6e 67 74 68 73 2e 6c 65 6e 28 29 20 7b  _lengths.len() {
4e20: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 65 77  .        let new
4e30: 5f 70 72 65 66 69 78 20 3d 20 50 72 65 66 69 78  _prefix = Prefix
4e40: 3a 3a 6e 65 77 28 70 72 65 66 69 78 5f 6c 65 6e  ::new(prefix_len
4e50: 67 74 68 73 5b 70 72 65 66 69 78 65 73 2e 6c 65  gths[prefixes.le
4e60: 6e 28 29 5d 2c 20 72 6e 67 2e 67 65 6e 28 29 29  n()], rng.gen())
4e70: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 70 72 65  ;.        if pre
4e80: 66 69 78 65 73 2e 69 74 65 72 28 29 2e 61 6c 6c  fixes.iter().all
4e90: 28 7c 70 72 65 66 69 78 7c 20 21 70 72 65 66 69  (|prefix| !prefi
4ea0: 78 2e 69 73 5f 63 6f 6d 70 61 74 69 62 6c 65 28  x.is_compatible(
4eb0: 26 6e 65 77 5f 70 72 65 66 69 78 29 29 20 7b 0a  &new_prefix)) {.
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
4ed0: 69 78 65 73 2e 70 75 73 68 28 6e 65 77 5f 70 72  ixes.push(new_pr
4ee0: 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  efix);.        }
4ef0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 65 66 69  .    }.    prefi
4f00: 78 65 73 0a 7d 0a 0a 66 6e 20 61 64 64 5f 6e 6f  xes.}..fn add_no
4f10: 64 65 5f 74 6f 5f 73 65 63 74 69 6f 6e 3c 54 3a  de_to_section<T:
4f20: 20 52 6e 67 3e 28 6e 65 74 77 6f 72 6b 3a 20 26   Rng>(network: &
4f30: 4e 65 74 77 6f 72 6b 2c 0a 20 20 20 20 20 20 20  Network,.       
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 20 20 20 20 20 6e 6f 64 65 73 3a 20 26          nodes: &
4f60: 6d 75 74 20 56 65 63 3c 54 65 73 74 4e 6f 64 65  mut Vec<TestNode
4f70: 3e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  >,.             
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 70 72 65 66 69 78 3a 20 26 50 72 65 66 69    prefix: &Prefi
4fa0: 78 3c 58 6f 72 4e 61 6d 65 3e 2c 0a 20 20 20 20  x<XorName>,.    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 20 20 20 20 20 20 20 20 20 20 20 72 6e 67 3a 20             rng: 
4fd0: 26 6d 75 74 20 54 2c 0a 20 20 20 20 20 20 20 20  &mut T,.        
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 20 20 20 75 73 65 5f 63 61 63 68 65         use_cache
5000: 3a 20 62 6f 6f 6c 29 20 7b 0a 20 20 20 20 6c 65  : bool) {.    le
5010: 74 20 72 65 6c 6f 63 61 74 69 6f 6e 5f 6e 61 6d  t relocation_nam
5020: 65 20 3d 20 70 72 65 66 69 78 2e 73 75 62 73 74  e = prefix.subst
5030: 69 74 75 74 65 64 5f 69 6e 28 72 6e 67 2e 67 65  ituted_in(rng.ge
5040: 6e 28 29 29 3b 0a 20 20 20 20 6e 6f 64 65 73 2e  n());.    nodes.
5050: 69 74 65 72 5f 6d 75 74 28 29 2e 66 6f 72 65 61  iter_mut().forea
5060: 63 68 28 7c 6e 6f 64 65 7c 20 6e 6f 64 65 2e 69  ch(|node| node.i
5070: 6e 6e 65 72 2e 73 65 74 5f 6e 65 78 74 5f 6e 6f  nner.set_next_no
5080: 64 65 5f 6e 61 6d 65 28 72 65 6c 6f 63 61 74 69  de_name(relocati
5090: 6f 6e 5f 6e 61 6d 65 29 29 3b 0a 0a 20 20 20 20  on_name));..    
50a0: 6c 65 74 20 63 6f 6e 66 69 67 20 3d 20 43 6f 6e  let config = Con
50b0: 66 69 67 3a 3a 77 69 74 68 5f 63 6f 6e 74 61 63  fig::with_contac
50c0: 74 73 28 26 5b 6e 6f 64 65 73 5b 30 5d 2e 68 61  ts(&[nodes[0].ha
50d0: 6e 64 6c 65 2e 65 6e 64 70 6f 69 6e 74 28 29 5d  ndle.endpoint()]
50e0: 29 3b 0a 20 20 20 20 6c 65 74 20 65 6e 64 70 6f  );.    let endpo
50f0: 69 6e 74 20 3d 20 45 6e 64 70 6f 69 6e 74 28 6e  int = Endpoint(n
5100: 6f 64 65 73 2e 6c 65 6e 28 29 29 3b 0a 20 20 20  odes.len());.   
5110: 20 6e 6f 64 65 73 2e 70 75 73 68 28 54 65 73 74   nodes.push(Test
5120: 4e 6f 64 65 3a 3a 62 75 69 6c 64 65 72 28 6e 65  Node::builder(ne
5130: 74 77 6f 72 6b 29 0a 20 20 20 20 20 20 20 20 2e  twork).        .
5140: 63 6f 6e 66 69 67 28 63 6f 6e 66 69 67 2e 63 6c  config(config.cl
5150: 6f 6e 65 28 29 29 0a 20 20 20 20 20 20 20 20 2e  one()).        .
5160: 65 6e 64 70 6f 69 6e 74 28 65 6e 64 70 6f 69 6e  endpoint(endpoin
5170: 74 29 0a 20 20 20 20 20 20 20 20 2e 63 61 63 68  t).        .cach
5180: 65 28 75 73 65 5f 63 61 63 68 65 29 0a 20 20 20  e(use_cache).   
5190: 20 20 20 20 20 2e 63 72 65 61 74 65 28 29 29 3b       .create());
51a0: 0a 20 20 20 20 70 6f 6c 6c 5f 61 6e 64 5f 72 65  .    poll_and_re
51b0: 73 65 6e 64 28 6e 6f 64 65 73 2c 20 26 6d 75 74  send(nodes, &mut
51c0: 20 5b 5d 29 3b 0a 20 20 20 20 65 78 70 65 63 74   []);.    expect
51d0: 5f 61 6e 79 5f 65 76 65 6e 74 21 28 75 6e 77 72  _any_event!(unwr
51e0: 61 70 21 28 6e 6f 64 65 73 2e 6c 61 73 74 5f 6d  ap!(nodes.last_m
51f0: 75 74 28 29 29 2c 20 45 76 65 6e 74 3a 3a 43 6f  ut()), Event::Co
5200: 6e 6e 65 63 74 65 64 29 3b 0a 20 20 20 20 61 73  nnected);.    as
5210: 73 65 72 74 5f 65 71 21 28 72 65 6c 6f 63 61 74  sert_eq!(relocat
5220: 69 6f 6e 5f 6e 61 6d 65 2c 20 6e 6f 64 65 73 5b  ion_name, nodes[
5230: 6e 6f 64 65 73 2e 6c 65 6e 28 29 20 2d 20 31 5d  nodes.len() - 1]
5240: 2e 6e 61 6d 65 28 29 29 3b 0a 7d 0a 0a 6d 6f 64  .name());.}..mod
5250: 20 74 65 73 74 73 20 7b 0a 20 20 20 20 75 73 65   tests {.    use
5260: 20 73 75 70 65 72 3a 3a 73 61 6e 69 74 79 5f 63   super::sanity_c
5270: 68 65 63 6b 3b 0a 0a 20 20 20 20 23 5b 74 65 73  heck;..    #[tes
5280: 74 5d 0a 20 20 20 20 66 6e 20 73 61 6e 69 74 79  t].    fn sanity
5290: 5f 63 68 65 63 6b 5f 76 61 6c 69 64 28 29 20 7b  _check_valid() {
52a0: 0a 20 20 20 20 20 20 20 20 73 61 6e 69 74 79 5f  .        sanity_
52b0: 63 68 65 63 6b 28 26 5b 31 2c 20 31 5d 29 3b 0a  check(&[1, 1]);.
52c0: 20 20 20 20 20 20 20 20 73 61 6e 69 74 79 5f 63          sanity_c
52d0: 68 65 63 6b 28 26 5b 31 2c 20 32 2c 20 33 2c 20  heck(&[1, 2, 3, 
52e0: 34 2c 20 35 2c 20 36 2c 20 37 2c 20 38 2c 20 38  4, 5, 6, 7, 8, 8
52f0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 61 6e 69  ]);.        sani
5300: 74 79 5f 63 68 65 63 6b 28 26 5b 38 3b 20 32 35  ty_check(&[8; 25
5310: 36 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  6]);.    }..    
5320: 23 5b 74 65 73 74 5d 0a 20 20 20 20 23 5b 73 68  #[test].    #[sh
5330: 6f 75 6c 64 5f 70 61 6e 69 63 28 65 78 70 65 63  ould_panic(expec
5340: 74 65 64 20 3d 20 22 54 68 65 72 65 20 73 68 6f  ted = "There sho
5350: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
5360: 74 77 6f 20 73 70 65 63 69 66 69 65 64 20 70 72  two specified pr
5370: 65 66 69 78 20 6c 65 6e 67 74 68 73 22 29 5d 0a  efix lengths")].
5380: 20 20 20 20 66 6e 20 73 61 6e 69 74 79 5f 63 68      fn sanity_ch
5390: 65 63 6b 5f 6e 6f 5f 73 70 6c 69 74 28 29 20 7b  eck_no_split() {
53a0: 0a 20 20 20 20 20 20 20 20 73 61 6e 69 74 79 5f  .        sanity_
53b0: 63 68 65 63 6b 28 26 5b 30 5d 29 3b 0a 20 20 20  check(&[0]);.   
53c0: 20 7d 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a   }..    #[test].
53d0: 20 20 20 20 23 5b 73 68 6f 75 6c 64 5f 70 61 6e      #[should_pan
53e0: 69 63 28 65 78 70 65 63 74 65 64 20 3d 20 22 77  ic(expected = "w
53f0: 6f 75 6c 64 20 72 65 71 75 69 72 65 20 6f 76 65  ould require ove
5400: 72 6c 61 70 70 69 6e 67 20 73 65 63 74 69 6f 6e  rlapping section
5410: 73 22 29 5d 0a 20 20 20 20 66 6e 20 73 61 6e 69  s")].    fn sani
5420: 74 79 5f 63 68 65 63 6b 5f 6f 76 65 72 6c 61 70  ty_check_overlap
5430: 70 69 6e 67 5f 73 65 63 74 69 6f 6e 73 28 29 20  ping_sections() 
5440: 7b 0a 20 20 20 20 20 20 20 20 73 61 6e 69 74 79  {.        sanity
5450: 5f 63 68 65 63 6b 28 26 5b 31 2c 20 32 2c 20 32  _check(&[1, 2, 2
5460: 2c 20 32 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , 2]);.    }..  
5470: 20 20 23 5b 74 65 73 74 5d 0a 20 20 20 20 23 5b    #[test].    #[
5480: 73 68 6f 75 6c 64 5f 70 61 6e 69 63 28 65 78 70  should_panic(exp
5490: 65 63 74 65 64 20 3d 20 22 77 6f 75 6c 64 20 6e  ected = "would n
54a0: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 65 6e 74  ot cover the ent
54b0: 69 72 65 20 61 64 64 72 65 73 73 20 73 70 61 63  ire address spac
54c0: 65 22 29 5d 0a 20 20 20 20 66 6e 20 73 61 6e 69  e")].    fn sani
54d0: 74 79 5f 63 68 65 63 6b 5f 6d 69 73 73 69 6e 67  ty_check_missing
54e0: 5f 73 65 63 74 69 6f 6e 73 28 29 20 7b 0a 20 20  _sections() {.  
54f0: 20 20 20 20 20 20 73 61 6e 69 74 79 5f 63 68 65        sanity_che
5500: 63 6b 28 26 5b 31 2c 20 32 5d 29 3b 0a 20 20 20  ck(&[1, 2]);.   
5510: 20 7d 0a 0a 20 20 20 20 23 5b 74 65 73 74 5d 0a   }..    #[test].
5520: 20 20 20 20 23 5b 73 68 6f 75 6c 64 5f 70 61 6e      #[should_pan
5530: 69 63 28 65 78 70 65 63 74 65 64 20 3d 20 22 6d  ic(expected = "m
5540: 75 73 74 20 65 61 63 68 20 62 65 20 6e 6f 20 6d  ust each be no m
5550: 6f 72 65 20 74 68 61 6e 20 38 22 29 5d 0a 20 20  ore than 8")].  
5560: 20 20 66 6e 20 73 61 6e 69 74 79 5f 63 68 65 63    fn sanity_chec
5570: 6b 5f 74 6f 6f 5f 6d 61 6e 79 5f 73 65 63 74 69  k_too_many_secti
5580: 6f 6e 73 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ons() {.        
5590: 73 61 6e 69 74 79 5f 63 68 65 63 6b 28 26 5b 31  sanity_check(&[1
55a0: 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
55b0: 20 37 2c 20 38 2c 20 39 2c 20 39 5d 29 3b 0a 20   7, 8, 9, 9]);. 
55c0: 20 20 20 7d 0a 7d 0a                                }.}.