github.com/shyftnetwork/go-empyrean@v1.8.3-0.20191127201940-fbfca9338f04/swarm/network/kademlia_test.go (about)

     1  // Copyright 2018 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package network
    18  
    19  import (
    20  	"bytes"
    21  	"fmt"
    22  	"os"
    23  	"testing"
    24  	"time"
    25  
    26  	"github.com/ShyftNetwork/go-empyrean/common"
    27  	"github.com/ShyftNetwork/go-empyrean/log"
    28  	"github.com/ShyftNetwork/go-empyrean/p2p"
    29  	"github.com/ShyftNetwork/go-empyrean/p2p/enode"
    30  	"github.com/ShyftNetwork/go-empyrean/p2p/protocols"
    31  	"github.com/ShyftNetwork/go-empyrean/swarm/pot"
    32  )
    33  
    34  func init() {
    35  	h := log.LvlFilterHandler(log.LvlWarn, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))
    36  	log.Root().SetHandler(h)
    37  }
    38  
    39  func testKadPeerAddr(s string) *BzzAddr {
    40  	a := pot.NewAddressFromString(s)
    41  	return &BzzAddr{OAddr: a, UAddr: a}
    42  }
    43  
    44  func newTestKademliaParams() *KadParams {
    45  	params := NewKadParams()
    46  	// TODO why is this 1?
    47  	params.MinBinSize = 1
    48  	params.NeighbourhoodSize = 2
    49  	return params
    50  }
    51  
    52  func newTestKademlia(b string) *Kademlia {
    53  	base := pot.NewAddressFromString(b)
    54  	return NewKademlia(base, newTestKademliaParams())
    55  }
    56  
    57  func newTestKadPeer(k *Kademlia, s string, lightNode bool) *Peer {
    58  	return NewPeer(&BzzPeer{BzzAddr: testKadPeerAddr(s), LightNode: lightNode}, k)
    59  }
    60  
    61  func On(k *Kademlia, ons ...string) {
    62  	for _, s := range ons {
    63  		k.On(newTestKadPeer(k, s, false))
    64  	}
    65  }
    66  
    67  func Off(k *Kademlia, offs ...string) {
    68  	for _, s := range offs {
    69  		k.Off(newTestKadPeer(k, s, false))
    70  	}
    71  }
    72  
    73  func Register(k *Kademlia, regs ...string) {
    74  	var as []*BzzAddr
    75  	for _, s := range regs {
    76  		as = append(as, testKadPeerAddr(s))
    77  	}
    78  	err := k.Register(as...)
    79  	if err != nil {
    80  		panic(err.Error())
    81  	}
    82  }
    83  
    84  // tests the validity of neighborhood depth calculations
    85  //
    86  // in particular, it tests that if there are one or more consecutive
    87  // empty bins above the farthest "nearest neighbor-peer" then
    88  // the depth should be set at the farthest of those empty bins
    89  //
    90  // TODO: Make test adapt to change in NeighbourhoodSize
    91  func TestNeighbourhoodDepth(t *testing.T) {
    92  	baseAddressBytes := RandomAddr().OAddr
    93  	kad := NewKademlia(baseAddressBytes, NewKadParams())
    94  
    95  	baseAddress := pot.NewAddressFromBytes(baseAddressBytes)
    96  
    97  	// generate the peers
    98  	var peers []*Peer
    99  	for i := 0; i < 7; i++ {
   100  		addr := pot.RandomAddressAt(baseAddress, i)
   101  		peers = append(peers, newTestDiscoveryPeer(addr, kad))
   102  	}
   103  	var sevenPeers []*Peer
   104  	for i := 0; i < 2; i++ {
   105  		addr := pot.RandomAddressAt(baseAddress, 7)
   106  		sevenPeers = append(sevenPeers, newTestDiscoveryPeer(addr, kad))
   107  	}
   108  
   109  	testNum := 0
   110  	// first try with empty kademlia
   111  	depth := kad.NeighbourhoodDepth()
   112  	if depth != 0 {
   113  		t.Fatalf("%d expected depth 0, was %d", testNum, depth)
   114  	}
   115  	testNum++
   116  
   117  	// add one peer on 7
   118  	kad.On(sevenPeers[0])
   119  	depth = kad.NeighbourhoodDepth()
   120  	if depth != 0 {
   121  		t.Fatalf("%d expected depth 0, was %d", testNum, depth)
   122  	}
   123  	testNum++
   124  
   125  	// add a second on 7
   126  	kad.On(sevenPeers[1])
   127  	depth = kad.NeighbourhoodDepth()
   128  	if depth != 0 {
   129  		t.Fatalf("%d expected depth 0, was %d", testNum, depth)
   130  	}
   131  	testNum++
   132  
   133  	// add from 0 to 6
   134  	for i, p := range peers {
   135  		kad.On(p)
   136  		depth = kad.NeighbourhoodDepth()
   137  		if depth != i+1 {
   138  			t.Fatalf("%d.%d expected depth %d, was %d", i+1, testNum, i, depth)
   139  		}
   140  	}
   141  	testNum++
   142  
   143  	kad.Off(sevenPeers[1])
   144  	depth = kad.NeighbourhoodDepth()
   145  	if depth != 6 {
   146  		t.Fatalf("%d expected depth 6, was %d", testNum, depth)
   147  	}
   148  	testNum++
   149  
   150  	kad.Off(peers[4])
   151  	depth = kad.NeighbourhoodDepth()
   152  	if depth != 4 {
   153  		t.Fatalf("%d expected depth 4, was %d", testNum, depth)
   154  	}
   155  	testNum++
   156  
   157  	kad.Off(peers[3])
   158  	depth = kad.NeighbourhoodDepth()
   159  	if depth != 3 {
   160  		t.Fatalf("%d expected depth 3, was %d", testNum, depth)
   161  	}
   162  	testNum++
   163  }
   164  
   165  // TestHealthStrict tests the simplest definition of health
   166  // Which means whether we are connected to all neighbors we know of
   167  func TestHealthStrict(t *testing.T) {
   168  
   169  	// base address is all zeros
   170  	// no peers
   171  	// unhealthy (and lonely)
   172  	k := newTestKademlia("11111111")
   173  	assertHealth(t, k, false, false)
   174  
   175  	// know one peer but not connected
   176  	// unhealthy
   177  	Register(k, "11100000")
   178  	log.Trace(k.String())
   179  	assertHealth(t, k, false, false)
   180  
   181  	// know one peer and connected
   182  	// healthy
   183  	On(k, "11100000")
   184  	assertHealth(t, k, true, false)
   185  
   186  	// know two peers, only one connected
   187  	// unhealthy
   188  	Register(k, "11111100")
   189  	log.Trace(k.String())
   190  	assertHealth(t, k, false, false)
   191  
   192  	// know two peers and connected to both
   193  	// healthy
   194  	On(k, "11111100")
   195  	assertHealth(t, k, true, false)
   196  
   197  	// know three peers, connected to the two deepest
   198  	// healthy
   199  	Register(k, "00000000")
   200  	log.Trace(k.String())
   201  	assertHealth(t, k, true, false)
   202  
   203  	// know three peers, connected to all three
   204  	// healthy
   205  	On(k, "00000000")
   206  	assertHealth(t, k, true, false)
   207  
   208  	// add fourth peer deeper than current depth
   209  	// unhealthy
   210  	Register(k, "11110000")
   211  	log.Trace(k.String())
   212  	assertHealth(t, k, false, false)
   213  
   214  	// connected to three deepest peers
   215  	// healthy
   216  	On(k, "11110000")
   217  	assertHealth(t, k, true, false)
   218  
   219  	// add additional peer in same bin as deepest peer
   220  	// unhealthy
   221  	Register(k, "11111101")
   222  	log.Trace(k.String())
   223  	assertHealth(t, k, false, false)
   224  
   225  	// four deepest of five peers connected
   226  	// healthy
   227  	On(k, "11111101")
   228  	assertHealth(t, k, true, false)
   229  }
   230  
   231  func assertHealth(t *testing.T, k *Kademlia, expectHealthy bool, expectSaturation bool) {
   232  	t.Helper()
   233  	kid := common.Bytes2Hex(k.BaseAddr())
   234  	addrs := [][]byte{k.BaseAddr()}
   235  	k.EachAddr(nil, 255, func(addr *BzzAddr, po int) bool {
   236  		addrs = append(addrs, addr.Address())
   237  		return true
   238  	})
   239  
   240  	pp := NewPeerPotMap(k.NeighbourhoodSize, addrs)
   241  	healthParams := k.Healthy(pp[kid])
   242  
   243  	// definition of health, all conditions but be true:
   244  	// - we at least know one peer
   245  	// - we know all neighbors
   246  	// - we are connected to all known neighbors
   247  	health := healthParams.KnowNN && healthParams.ConnectNN && healthParams.CountKnowNN > 0
   248  	if expectHealthy != health {
   249  		t.Fatalf("expected kademlia health %v, is %v\n%v", expectHealthy, health, k.String())
   250  	}
   251  }
   252  
   253  func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error {
   254  	addr, o, want := k.SuggestPeer()
   255  	log.Trace("suggestpeer return", "a", addr, "o", o, "want", want)
   256  	if binStr(addr) != expAddr {
   257  		return fmt.Errorf("incorrect peer address suggested. expected %v, got %v", expAddr, binStr(addr))
   258  	}
   259  	if o != expPo {
   260  		return fmt.Errorf("incorrect prox order suggested. expected %v, got %v", expPo, o)
   261  	}
   262  	if want != expWant {
   263  		return fmt.Errorf("expected SuggestPeer to want peers: %v", expWant)
   264  	}
   265  	return nil
   266  }
   267  
   268  func binStr(a *BzzAddr) string {
   269  	if a == nil {
   270  		return "<nil>"
   271  	}
   272  	return pot.ToBin(a.Address())[:8]
   273  }
   274  
   275  // TODO explain why this bug occurred and how it should have been mitigated
   276  func TestSuggestPeerBug(t *testing.T) {
   277  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
   278  	k := newTestKademlia("00000000")
   279  	On(k,
   280  		"10000000", "11000000",
   281  		"01000000",
   282  
   283  		"00010000", "00011000",
   284  	)
   285  	Off(k,
   286  		"01000000",
   287  	)
   288  	err := testSuggestPeer(k, "01000000", 0, false)
   289  	if err != nil {
   290  		t.Fatal(err.Error())
   291  	}
   292  }
   293  
   294  func TestSuggestPeerFindPeers(t *testing.T) {
   295  	t.Skip("The SuggestPeers implementation seems to have weaknesses exposed by the change in the new depth calculation. The results are no longer predictable")
   296  
   297  	testnum := 0
   298  	// test 0
   299  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
   300  	k := newTestKademlia("00000000")
   301  	On(k, "00100000")
   302  	err := testSuggestPeer(k, "<nil>", 0, false)
   303  	if err != nil {
   304  		t.Fatalf("%d %v", testnum, err.Error())
   305  	}
   306  	testnum++
   307  
   308  	// test 1
   309  	// 2 row gap, saturated proxbin, no callables -> want PO 0
   310  	On(k, "00010000")
   311  	err = testSuggestPeer(k, "<nil>", 0, false)
   312  	if err != nil {
   313  		t.Fatalf("%d %v", testnum, err.Error())
   314  	}
   315  	testnum++
   316  
   317  	// test 2
   318  	// 1 row gap (1 less), saturated proxbin, no callables -> want PO 1
   319  	On(k, "10000000")
   320  	err = testSuggestPeer(k, "<nil>", 1, false)
   321  	if err != nil {
   322  		t.Fatalf("%d %v", testnum, err.Error())
   323  	}
   324  	testnum++
   325  
   326  	// test 3
   327  	// no gap (1 less), saturated proxbin, no callables -> do not want more
   328  	On(k, "01000000", "00100001")
   329  	err = testSuggestPeer(k, "<nil>", 0, false)
   330  	if err != nil {
   331  		t.Fatalf("%d %v", testnum, err.Error())
   332  	}
   333  	testnum++
   334  
   335  	// test 4
   336  	// oversaturated proxbin, > do not want more
   337  	On(k, "00100001")
   338  	err = testSuggestPeer(k, "<nil>", 0, false)
   339  	if err != nil {
   340  		t.Fatalf("%d %v", testnum, err.Error())
   341  	}
   342  	testnum++
   343  
   344  	// test 5
   345  	// reintroduce gap, disconnected peer callable
   346  	Off(k, "01000000")
   347  	log.Trace(k.String())
   348  	err = testSuggestPeer(k, "01000000", 0, false)
   349  	if err != nil {
   350  		t.Fatalf("%d %v", testnum, err.Error())
   351  	}
   352  	testnum++
   353  
   354  	// test 6
   355  	// second time disconnected peer not callable
   356  	// with reasonably set Interval
   357  	log.Trace("foo")
   358  	log.Trace(k.String())
   359  	err = testSuggestPeer(k, "<nil>", 1, false)
   360  	if err != nil {
   361  		t.Fatalf("%d %v", testnum, err.Error())
   362  	}
   363  	testnum++
   364  
   365  	// test 6
   366  	// on and off again, peer callable again
   367  	On(k, "01000000")
   368  	Off(k, "01000000")
   369  	log.Trace(k.String())
   370  	err = testSuggestPeer(k, "01000000", 0, false)
   371  	if err != nil {
   372  		t.Fatalf("%d %v", testnum, err.Error())
   373  	}
   374  	testnum++
   375  
   376  	// test 7
   377  	// new closer peer appears, it is immediately wanted
   378  	On(k, "01000000")
   379  	Register(k, "00010001")
   380  	err = testSuggestPeer(k, "00010001", 0, false)
   381  	if err != nil {
   382  		t.Fatalf("%d %v", testnum, err.Error())
   383  	}
   384  	testnum++
   385  
   386  	// test 8
   387  	// PO1 disconnects
   388  	On(k, "00010001")
   389  	log.Info(k.String())
   390  	Off(k, "01000000")
   391  	log.Info(k.String())
   392  	// second time, gap filling
   393  	err = testSuggestPeer(k, "01000000", 0, false)
   394  	if err != nil {
   395  		t.Fatalf("%d %v", testnum, err.Error())
   396  	}
   397  	testnum++
   398  
   399  	// test 9
   400  	On(k, "01000000")
   401  	log.Info(k.String())
   402  	err = testSuggestPeer(k, "<nil>", 0, false)
   403  	if err != nil {
   404  		t.Fatalf("%d %v", testnum, err.Error())
   405  	}
   406  	testnum++
   407  
   408  	// test 10
   409  	k.MinBinSize = 2
   410  	log.Info(k.String())
   411  	err = testSuggestPeer(k, "<nil>", 0, true)
   412  	if err != nil {
   413  		t.Fatalf("%d %v", testnum, err.Error())
   414  	}
   415  	testnum++
   416  
   417  	// test 11
   418  	Register(k, "01000001")
   419  	log.Info(k.String())
   420  	err = testSuggestPeer(k, "01000001", 0, false)
   421  	if err != nil {
   422  		t.Fatalf("%d %v", testnum, err.Error())
   423  	}
   424  	testnum++
   425  
   426  	// test 12
   427  	On(k, "10000001")
   428  	log.Trace(fmt.Sprintf("Kad:\n%v", k.String()))
   429  	err = testSuggestPeer(k, "<nil>", 1, true)
   430  	if err != nil {
   431  		t.Fatalf("%d %v", testnum, err.Error())
   432  	}
   433  	testnum++
   434  
   435  	// test 13
   436  	On(k, "01000001")
   437  	err = testSuggestPeer(k, "<nil>", 0, false)
   438  	if err != nil {
   439  		t.Fatalf("%d %v", testnum, err.Error())
   440  	}
   441  	testnum++
   442  
   443  	// test 14
   444  	k.MinBinSize = 3
   445  	Register(k, "10000010")
   446  	err = testSuggestPeer(k, "10000010", 0, false)
   447  	if err != nil {
   448  		t.Fatalf("%d %v", testnum, err.Error())
   449  	}
   450  	testnum++
   451  
   452  	// test 15
   453  	On(k, "10000010")
   454  	err = testSuggestPeer(k, "<nil>", 1, false)
   455  	if err != nil {
   456  		t.Fatalf("%d %v", testnum, err.Error())
   457  	}
   458  	testnum++
   459  
   460  	// test 16
   461  	On(k, "01000010")
   462  	err = testSuggestPeer(k, "<nil>", 2, false)
   463  	if err != nil {
   464  		t.Fatalf("%d %v", testnum, err.Error())
   465  	}
   466  	testnum++
   467  
   468  	// test 17
   469  	On(k, "00100010")
   470  	err = testSuggestPeer(k, "<nil>", 3, false)
   471  	if err != nil {
   472  		t.Fatalf("%d %v", testnum, err.Error())
   473  	}
   474  	testnum++
   475  
   476  	// test 18
   477  	On(k, "00010010")
   478  	err = testSuggestPeer(k, "<nil>", 0, false)
   479  	if err != nil {
   480  		t.Fatalf("%d %v", testnum, err.Error())
   481  	}
   482  	testnum++
   483  
   484  }
   485  
   486  // a node should stay in the address book if it's removed from the kademlia
   487  func TestOffEffectingAddressBookNormalNode(t *testing.T) {
   488  	k := newTestKademlia("00000000")
   489  	// peer added to kademlia
   490  	k.On(newTestKadPeer(k, "01000000", false))
   491  	// peer should be in the address book
   492  	if k.addrs.Size() != 1 {
   493  		t.Fatal("known peer addresses should contain 1 entry")
   494  	}
   495  	// peer should be among live connections
   496  	if k.conns.Size() != 1 {
   497  		t.Fatal("live peers should contain 1 entry")
   498  	}
   499  	// remove peer from kademlia
   500  	k.Off(newTestKadPeer(k, "01000000", false))
   501  	// peer should be in the address book
   502  	if k.addrs.Size() != 1 {
   503  		t.Fatal("known peer addresses should contain 1 entry")
   504  	}
   505  	// peer should not be among live connections
   506  	if k.conns.Size() != 0 {
   507  		t.Fatal("live peers should contain 0 entry")
   508  	}
   509  }
   510  
   511  // a light node should not be in the address book
   512  func TestOffEffectingAddressBookLightNode(t *testing.T) {
   513  	k := newTestKademlia("00000000")
   514  	// light node peer added to kademlia
   515  	k.On(newTestKadPeer(k, "01000000", true))
   516  	// peer should not be in the address book
   517  	if k.addrs.Size() != 0 {
   518  		t.Fatal("known peer addresses should contain 0 entry")
   519  	}
   520  	// peer should be among live connections
   521  	if k.conns.Size() != 1 {
   522  		t.Fatal("live peers should contain 1 entry")
   523  	}
   524  	// remove peer from kademlia
   525  	k.Off(newTestKadPeer(k, "01000000", true))
   526  	// peer should not be in the address book
   527  	if k.addrs.Size() != 0 {
   528  		t.Fatal("known peer addresses should contain 0 entry")
   529  	}
   530  	// peer should not be among live connections
   531  	if k.conns.Size() != 0 {
   532  		t.Fatal("live peers should contain 0 entry")
   533  	}
   534  }
   535  
   536  func TestSuggestPeerRetries(t *testing.T) {
   537  	k := newTestKademlia("00000000")
   538  	k.RetryInterval = int64(300 * time.Millisecond) // cycle
   539  	k.MaxRetries = 50
   540  	k.RetryExponent = 2
   541  	sleep := func(n int) {
   542  		ts := k.RetryInterval
   543  		for i := 1; i < n; i++ {
   544  			ts *= int64(k.RetryExponent)
   545  		}
   546  		time.Sleep(time.Duration(ts))
   547  	}
   548  
   549  	Register(k, "01000000")
   550  	On(k, "00000001", "00000010")
   551  	err := testSuggestPeer(k, "01000000", 0, false)
   552  	if err != nil {
   553  		t.Fatal(err.Error())
   554  	}
   555  
   556  	err = testSuggestPeer(k, "<nil>", 0, false)
   557  	if err != nil {
   558  		t.Fatal(err.Error())
   559  	}
   560  
   561  	sleep(1)
   562  	err = testSuggestPeer(k, "01000000", 0, false)
   563  	if err != nil {
   564  		t.Fatal(err.Error())
   565  	}
   566  
   567  	err = testSuggestPeer(k, "<nil>", 0, false)
   568  	if err != nil {
   569  		t.Fatal(err.Error())
   570  	}
   571  
   572  	sleep(1)
   573  	err = testSuggestPeer(k, "01000000", 0, false)
   574  	if err != nil {
   575  		t.Fatal(err.Error())
   576  	}
   577  
   578  	err = testSuggestPeer(k, "<nil>", 0, false)
   579  	if err != nil {
   580  		t.Fatal(err.Error())
   581  	}
   582  
   583  	sleep(2)
   584  	err = testSuggestPeer(k, "01000000", 0, false)
   585  	if err != nil {
   586  		t.Fatal(err.Error())
   587  	}
   588  
   589  	err = testSuggestPeer(k, "<nil>", 0, false)
   590  	if err != nil {
   591  		t.Fatal(err.Error())
   592  	}
   593  
   594  	sleep(2)
   595  	err = testSuggestPeer(k, "<nil>", 0, false)
   596  	if err != nil {
   597  		t.Fatal(err.Error())
   598  	}
   599  
   600  }
   601  
   602  func TestKademliaHiveString(t *testing.T) {
   603  	k := newTestKademlia("00000000")
   604  	On(k, "01000000", "00100000")
   605  	Register(k, "10000000", "10000001")
   606  	k.MaxProxDisplay = 8
   607  	h := k.String()
   608  	expH := "\n=========================================================================\nMon Feb 27 12:10:28 UTC 2017 KΛÐΞMLIΛ hive: queen's address: 000000\npopulation: 2 (4), NeighbourhoodSize: 2, MinBinSize: 1, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000  0                              |  2 8100 (0) 8000 (0)\n001  1 4000                         |  1 4000 (0)\n002  1 2000                         |  1 2000 (0)\n003  0                              |  0\n004  0                              |  0\n005  0                              |  0\n006  0                              |  0\n007  0                              |  0\n========================================================================="
   609  	if expH[104:] != h[104:] {
   610  		t.Fatalf("incorrect hive output. expected %v, got %v", expH, h)
   611  	}
   612  }
   613  
   614  // testKademliaCase constructs the kademlia and PeerPot map to validate
   615  // the SuggestPeer and Healthy methods for provided hex-encoded addresses.
   616  // Argument pivotAddr is the address of the kademlia.
   617  func testKademliaCase(t *testing.T, pivotAddr string, addrs ...string) {
   618  
   619  	t.Skip("this test relies on SuggestPeer which is now not reliable. See description in TestSuggestPeerFindPeers")
   620  	addr := common.Hex2Bytes(pivotAddr)
   621  	var byteAddrs [][]byte
   622  	for _, ahex := range addrs {
   623  		byteAddrs = append(byteAddrs, common.Hex2Bytes(ahex))
   624  	}
   625  
   626  	k := NewKademlia(addr, NewKadParams())
   627  
   628  	// our pivot kademlia is the last one in the array
   629  	for _, a := range byteAddrs {
   630  		if bytes.Equal(a, addr) {
   631  			continue
   632  		}
   633  		p := &BzzAddr{OAddr: a, UAddr: a}
   634  		if err := k.Register(p); err != nil {
   635  			t.Fatalf("a %x addr %x: %v", a, addr, err)
   636  		}
   637  	}
   638  
   639  	ppmap := NewPeerPotMap(k.NeighbourhoodSize, byteAddrs)
   640  
   641  	pp := ppmap[pivotAddr]
   642  
   643  	for {
   644  		a, _, _ := k.SuggestPeer()
   645  		if a == nil {
   646  			break
   647  		}
   648  		k.On(NewPeer(&BzzPeer{BzzAddr: a}, k))
   649  	}
   650  
   651  	h := k.Healthy(pp)
   652  	if !(h.ConnectNN && h.KnowNN && h.CountKnowNN > 0) {
   653  		t.Fatalf("not healthy: %#v\n%v", h, k.String())
   654  	}
   655  }
   656  
   657  /*
   658  The regression test for the following invalid kademlia edge case.
   659  
   660  Addresses used in this test are discovered as part of the simulation network
   661  in higher level tests for streaming. They were generated randomly.
   662  
   663  =========================================================================
   664  Mon Apr  9 12:18:24 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1
   665  population: 9 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
   666  000  2 d7e5 ec56                    | 18 ec56 (0) d7e5 (0) d9e0 (0) c735 (0)
   667  001  2 18f1 3176                    | 14 18f1 (0) 10bb (0) 10d1 (0) 0421 (0)
   668  002  2 52aa 47cd                    | 11 52aa (0) 51d9 (0) 5161 (0) 5130 (0)
   669  003  1 646e                         |  1 646e (0)
   670  004  0                              |  3 769c (0) 76d1 (0) 7656 (0)
   671  ============ DEPTH: 5 ==========================================
   672  005  1 7a48                         |  1 7a48 (0)
   673  006  1 7cbd                         |  1 7cbd (0)
   674  007  0                              |  0
   675  008  0                              |  0
   676  009  0                              |  0
   677  010  0                              |  0
   678  011  0                              |  0
   679  012  0                              |  0
   680  013  0                              |  0
   681  014  0                              |  0
   682  015  0                              |  0
   683  =========================================================================
   684  */
   685  func TestKademliaCase1(t *testing.T) {
   686  	testKademliaCase(t,
   687  		"7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e",
   688  		"ec560e6a4806aa37f147ee83687f3cf044d9953e61eedb8c34b6d50d9e2c5623",
   689  		"646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d",
   690  		"18f13c5fba653781019025ab10e8d2fdc916d6448729268afe9e928ffcdbb8e8",
   691  		"317617acf99b4ffddda8a736f8fc6c6ede0bf690bc23d834123823e6d03e2f69",
   692  		"d7e52d9647a5d1c27a68c3ee65d543be3947ae4b68537b236d71ef9cb15fb9ab",
   693  		"7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8",
   694  		"7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0",
   695  		"52aa3ddec61f4d48dd505a2385403c634f6ad06ee1d99c5c90a5ba6006f9af9c",
   696  		"47cdb6fa93eeb8bc91a417ff4e3b14a9c2ea85137462e2f575fae97f0c4be60d",
   697  		"5161943eb42e2a03e715fe8afa1009ff5200060c870ead6ab103f63f26cb107f",
   698  		"a38eaa1255f76bf883ca0830c86e8c4bb7eed259a8348aae9b03f21f90105bee",
   699  		"b2522bdf1ab26f324e75424fdf6e493b47e8a27687fe76347607b344fc010075",
   700  		"5bd7213964efb2580b91d02ac31ef126838abeba342f5dbdbe8d4d03562671a2",
   701  		"0b531adb82744768b694d7f94f73d4f0c9de591266108daeb8c74066bfc9c9ca",
   702  		"28501f59f70e888d399570145ed884353e017443c675aa12731ada7c87ea14f7",
   703  		"4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51",
   704  		"b193431ee35cd32de95805e7c1c749450c47486595aae7195ea6b6019a64fd61",
   705  		"baebf36a1e35a7ed834e1c72faf44ba16c159fa47d3289ceb3ca35fefa8739b5",
   706  		"a3659bd32e05fa36c8d20dbaaed8362bf1a8a7bd116aed62d8a43a2efbdf513f",
   707  		"10d1b50881a4770ebebdd0a75589dabb931e6716747b0f65fd6b080b88c4fdb6",
   708  		"3c76b8ca5c7ce6a03320646826213f59229626bf5b9d25da0c3ec0662dcb8ff3",
   709  		"4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112",
   710  		"c7353d320987956075b5bc1668571c7a36c800d5598fdc4832ec6569561e15d1",
   711  		"d9e0c7c90878c20ab7639d5954756f54775404b3483407fe1b483635182734f6",
   712  		"8fca67216b7939c0824fb06c5279901a94da41da9482b000f56df9906736ee75",
   713  		"460719d7f7aa7d7438f0eaf30333484fa3bd0f233632c10ba89e6e46dd3604be",
   714  		"0421d92c8a1c79ed5d01305a3d25aaf22a8f5f9e3d4bc80da47ee16ce20465fe",
   715  		"3441d9d9c0f05820a1bb6459fc7d8ef266a1bd929e7db939a10f544efe8261ea",
   716  		"ab198a66c293586746758468c610e5d3914d4ce629147eff6dd55a31f863ff8f",
   717  		"3a1c8c16b0763f3d2c35269f454ff779d1255e954d2deaf6c040fb3f0bcdc945",
   718  		"5561c0ea3b203e173b11e6aa9d0e621a4e10b1d8b178b8fe375220806557b823",
   719  		"7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3",
   720  		"5130594fd54c1652cf2debde2c4204573ed76555d1e26757fe345b409af1544a",
   721  		"76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0",
   722  		"89580231962624c53968c1b0095b4a2732b2a2640a19fdd7d21fd064fcc0a5ef",
   723  		"3d10d001fff44680c7417dd66ecf2e984f0baa20a9bbcea348583ba5ff210c4f",
   724  		"43754e323f0f3a1155b1852bd6edd55da86b8c4cfe3df8b33733fca50fc202b8",
   725  		"a9e7b1bb763ae6452ddcacd174993f82977d81a85206bb2ae3c842e2d8e19b4c",
   726  		"10bb07da7bc7c7757f74149eff167d528a94a253cdc694a863f4d50054c00b6d",
   727  		"28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19",
   728  		"835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc",
   729  		"8e236c56a77d7f46e41e80f7092b1a68cd8e92f6156365f41813ad1ca2c6b6f3",
   730  		"51d9c857e9238c49186e37b4eccf17a82de3d5739f026f6043798ab531456e73",
   731  		"bbddf7db6a682225301f36a9fd5b0d0121d2951753e1681295f3465352ad511f",
   732  		"2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e",
   733  		"769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a",
   734  		"ba3bebec689ce51d3e12776c45f80d25164fdfb694a8122d908081aaa2e7122c",
   735  		"3a51f4146ea90a815d0d283d1ceb20b928d8b4d45875e892696986a3c0d8fb9b",
   736  		"81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009",
   737  	)
   738  }
   739  
   740  /*
   741  The regression test for the following invalid kademlia edge case.
   742  
   743  Addresses used in this test are discovered as part of the simulation network
   744  in higher level tests for streaming. They were generated randomly.
   745  
   746  =========================================================================
   747  Mon Apr  9 18:43:48 UTC 2018 KΛÐΞMLIΛ hive: queen's address: bc7f3b
   748  population: 9 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
   749  000  2 0f49 67ff                    | 28 0f49 (0) 0211 (0) 07b2 (0) 0703 (0)
   750  001  2 e84b f3a4                    | 13 f3a4 (0) e84b (0) e58b (0) e60b (0)
   751  002  1 8dba                         |  1 8dba (0)
   752  003  2 a008 ad72                    |  2 ad72 (0) a008 (0)
   753  004  0                              |  3 b61f (0) b27f (0) b027 (0)
   754  ============ DEPTH: 5 ==========================================
   755  005  1 ba19                         |  1 ba19 (0)
   756  006  0                              |  0
   757  007  1 bdd6                         |  1 bdd6 (0)
   758  008  0                              |  0
   759  009  0                              |  0
   760  010  0                              |  0
   761  011  0                              |  0
   762  012  0                              |  0
   763  013  0                              |  0
   764  014  0                              |  0
   765  015  0                              |  0
   766  =========================================================================
   767  */
   768  func TestKademliaCase2(t *testing.T) {
   769  	testKademliaCase(t,
   770  		"bc7f3b6a4a7e3c91b100ca6680b6c06ff407972b88956324ca853295893e0237", "67ffb61d3aa27449d277016188f35f19e2321fbda5008c68cf6303faa080534f", "600cd54c842eadac1729c04abfc369bc244572ca76117105b9dd910283b82730", "d955a05409650de151218557425105a8aa2867bb6a0e0462fa1cf90abcf87ad6", "7a6b726de45abdf7bb3e5fd9fb0dc8932270ca4dedef92238c80c05bcdb570e3", "263e99424ebfdb652adb4e3dcd27d59e11bb7ae1c057b3ef6f390d0228006254", "ba195d1a53aafde68e661c64d39db8c2a73505bf336125c15c3560de3b48b7ed", "3458c762169937115f67cabc35a6c384ed70293a8aec37b077a6c1b8e02d510e", "4ef4dc2e28ac6efdba57e134ac24dd4e0be68b9d54f7006515eb9509105f700c", "2a8782b79b0c24b9714dfd2c8ff1932bebc08aa6520b4eaeaa59ff781238890c", "625d02e960506f4524e9cdeac85b33faf3ea437fceadbd478b62b78720cf24fc", "e051a36a8c8637f520ba259c9ed3fadaf740dadc6a04c3f0e21778ebd4cd6ac4", "e34bc014fa2504f707bb3d904872b56c2fa250bee3cb19a147a0418541f1bd90", "28036dc79add95799916893890add5d8972f3b95325a509d6ded3d448f4dc652", "1b013c407794fa2e4c955d8f51cbc6bd78588a174b6548246b291281304b5409", "34f71b68698e1534095ff23ee9c35bf64c7f12b8463e7c6f6b19c25cf03928b4", "c712c6e9bbb7076832972a95890e340b94ed735935c3c0bb788e61f011b59479", "a008d5becdcda4b9dbfdaafc3cec586cf61dcf2d4b713b6168fff02e3b9f0b08", "29de15555cdbebaab214009e416ee92f947dcec5dab9894129f50f1b17138f34", "5df9449f700bd4b5a23688b68b293f2e92fa6ca524c93bc6bb9936efba9d9ada", "3ab0168a5f87fedc6a39b53c628256ac87a98670d8691bbdaaecec22418d13a2", "1ee299b2d2a74a568494130e6869e66d57982d345c482a0e0eeb285ac219ae3b", "e0e0e3b860cea9b7a74cf1b0675cc632dc64e80a02f20bbc5e96e2e8bb670606", "dc1ba6f169b0fcdcca021dcebaf39fe5d4875e7e69b854fad65687c1d7719ec0", "d321f73e42fcfb1d3a303eddf018ca5dffdcfd5567cd5ec1212f045f6a07e47d", "070320c3da7b542e5ca8aaf6a0a53d2bb5113ed264ab1db2dceee17c729edcb1", "17d314d65fdd136b50d182d2c8f5edf16e7838c2be8cf2c00abe4b406dbcd1d8", "e60b99e0a06f7d2d99d84085f67cdf8cc22a9ae22c339365d80f90289834a2b4", "02115771e18932e1f67a45f11f5bf743c5dae97fbc477d34d35c996012420eac", "3102a40eb2e5060353dd19bf61eeec8782dd1bebfcb57f4c796912252b591827", "8dbaf231062f2dc7ddaba5f9c7761b0c21292be51bf8c2ef503f31d4a2f63f79", "b02787b713c83a9f9183216310f04251994e04c2763a9024731562e8978e7cc4", "b27fe6cd33989e10909ce794c4b0b88feae286b614a59d49a3444c1a7b51ea82", "07b2d2c94fdc6fd148fe23be2ed9eff54f5e12548f29ed8416e6860fc894466f", "e58bf9f451ef62ac44ff0a9bb0610ec0fd14d423235954f0d3695e83017cbfc4", "bdd600b91bb79d1ee0053b854de308cfaa7e2abce575ea6815a0a7b3449609c2", "0f49c93c1edc7999920b21977cedd51a763940dac32e319feb9c1df2da0f3071", "7cbf0297cd41acf655cd6f960d7aaf61479edb4189d5c001cbc730861f0deb41", "79265193778d87ad626a5f59397bc075872d7302a12634ce2451a767d0a82da2", "2fe7d705f7c370b9243dbaafe007d555ff58d218822fca49d347b12a0282457c", "e84bc0c83d05e55a0080eed41dda5a795da4b9313a4da697142e69a65834cbb3", "cc4d278bd9aa0e9fb3cd8d2e0d68fb791aab5de4b120b845c409effbed47a180", "1a2317a8646cd4b6d3c4aa4cc25f676533abb689cf180787db216880a1239ad8", "cbafd6568cf8e99076208e6b6843f5808a7087897c67aad0c54694669398f889", "7b7c8357255fc37b4dae0e1af61589035fd39ff627e0938c6b3da8b4e4ec5d23", "2b8d782c1f5bac46c922cf439f6aa79f91e9ba5ffc0020d58455188a2075b334", "b61f45af2306705740742e76197a119235584ced01ef3f7cf3d4370f6c557cd1", "2775612e7cdae2780bf494c370bdcbe69c55e4a1363b1dc79ea0135e61221cce", "f3a49bb22f40885e961299abfa697a7df690a79f067bf3a4847a3ad48d826c9f", "ad724ac218dc133c0aadf4618eae21fdd0c2f3787af279846b49e2b4f97ff167",
   771  	)
   772  }
   773  
   774  /*
   775  The regression test for the following invalid kademlia edge case.
   776  
   777  Addresses used in this test are discovered as part of the simulation network
   778  in higher level tests for streaming. They were generated randomly.
   779  
   780  =========================================================================
   781  Mon Apr  9 19:04:35 UTC 2018 KΛÐΞMLIΛ hive: queen's address: b4822e
   782  population: 8 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
   783  000  2 786c 774b                    | 29 774b (0) 786c (0) 7a79 (0) 7d2f (0)
   784  001  2 d9de cf19                    | 10 cf19 (0) d9de (0) d2ff (0) d2a2 (0)
   785  002  2 8ca1 8d74                    |  5 8d74 (0) 8ca1 (0) 9793 (0) 9f51 (0)
   786  003  0                              |  0
   787  004  0                              |  3 bfac (0) bcbb (0) bde9 (0)
   788  005  0                              |  0
   789  ============ DEPTH: 6 ==========================================
   790  006  1 b660                         |  1 b660 (0)
   791  007  0                              |  0
   792  008  1 b450                         |  1 b450 (0)
   793  009  0                              |  0
   794  010  0                              |  0
   795  011  0                              |  0
   796  012  0                              |  0
   797  013  0                              |  0
   798  014  0                              |  0
   799  015  0                              |  0
   800  =========================================================================
   801  */
   802  func TestKademliaCase3(t *testing.T) {
   803  	testKademliaCase(t,
   804  		"b4822e874a01b94ac3a35c821e6db131e785c2fcbb3556e84b36102caf09b091", "2ecf54ea38d58f9cfc3862e54e5854a7c506fbc640e0b38e46d7d45a19794999", "442374092be50fc7392e8dd3f6fab3158ff7f14f26ff98060aed9b2eecf0b97d", "b450a4a67fcfa3b976cf023d8f1f15052b727f712198ce901630efe2f95db191", "9a7291638eb1c989a6dd6661a42c735b23ac6605b5d3e428aa5ffe650e892c85", "67f62eeab9804cfcac02b25ebeab9113d1b9d03dd5200b1c5a324cc0163e722f", "2e4a0e4b53bca4a9d7e2734150e9f579f29a255ade18a268461b20d026c9ee90", "30dd79c5fcdaa1b106f6960c45c9fde7c046aa3d931088d98c52ab759d0b2ac4", "97936fb5a581e59753c54fa5feec493714f2218245f61f97a62eafd4699433e4", "3a2899b6e129e3e193f6e2aefb82589c948c246d2ec1d4272af32ef3b2660f44", "f0e2a8aa88e67269e9952431ef12e5b29b7f41a1871fbfc38567fad95655d607", "7fa12b3f3c5f8383bfc644b958f72a486969733fa097d8952b3eb4f7b4f73192", "360c167aad5fc992656d6010ec45fdce5bcd492ad9608bc515e2be70d4e430c1", "fe21bc969b3d8e5a64a6484a829c1e04208f26f3cd4de6afcbc172a5bd17f1f1", "b660a1f40141d7ccd282fe5bd9838744119bd1cb3780498b5173578cc5ad308f", "44dcb3370e76680e2fba8cd986ad45ff0b77ca45680ee8d950e47922c4af6226", "8ca126923d17fccb689647307b89f38aa14e2a7b9ebcf3c1e31ccf3d2291a3bc", "f0ae19ae9ce6329327cbf42baf090e084c196b0877d8c7b69997e0123be23ef8", "d2a2a217385158e3e1e348883a14bc423e57daa12077e8c49797d16121ea0810", "f5467ccd85bb4ebe768527db520a210459969a5f1fae6e07b43f519799f0b224", "68be5fd9f9d142a5099e3609011fe3bab7bb992c595999e31e0b3d1668dfb3cf", "4d49a8a476e4934afc6b5c36db9bece3ed1804f20b952da5a21b2b0de766aa73", "ea7155745ef3fb2d099513887a2ba279333ced65c65facbd890ce58bd3fce772", "cf19f51f4e848053d289ac95a9138cdd23fc3077ae913cd58cda8cc7a521b2e1", "590b1cd41c7e6144e76b5cd515a3a4d0a4317624620a3f1685f43ae68bdcd890", "d2ffe0626b5f94a7e00fa0b506e7455a3d9399c15800db108d5e715ef5f6e346", "69630878c50a91f6c2edd23a706bfa0b50bd5661672a37d67bab38e6bca3b698", "445e9067079899bb5faafaca915ae6c0f6b1b730a5a628835dd827636f7feb1e", "6461c77491f1c4825958949f23c153e6e1759a5be53abbcee17c9da3867f3141", "23a235f4083771ccc207771daceda700b525a59ab586788d4f6892e69e34a6e2", "bde99f79ef41a81607ddcf92b9f95dcbc6c3537e91e8bf740e193dc73b19485e", "177957c0e5f0fbd12b88022a91768095d193830986caec8d888097d3ff4310b8", "bcbbdbaa4cdf8352422072f332e05111b732354a35c4d7c617ce1fc3b8b42a5a", "774b6717fdfb0d1629fb9d4c04a9ca40079ae2955d7f82e897477055ed017abb", "16443bf625be6d39ecaa6f114e5d2c1d47a64bfd3c13808d94b55b6b6acef2ee", "8d7495d9008066505ed00ce8198af82bfa5a6b4c08768b4c9fb3aa4eb0b0cca2", "15800849a53349508cb382959527f6c3cf1a46158ff1e6e2316b7dea7967e35f", "7a792f0f4a2b731781d1b244b2a57947f1a2e32900a1c0793449f9f7ae18a7b7", "5e517c2832c9deaa7df77c7bad4d20fd6eda2b7815e155e68bc48238fac1416f", "9f51a14f0019c72bd1d472706d8c80a18c1873c6a0663e754b60eae8094483d7", "7d2fabb565122521d22ba99fed9e5be6a458fbc93156d54db27d97a00b8c3a97", "786c9e412a7db4ec278891fa534caa9a1d1a028c631c6f3aeb9c4d96ad895c36", "3bd6341d40641c2632a5a0cd7a63553a04e251efd7195897a1d27e02a7a8bfde", "31efd1f5fb57b8cff0318d77a1a9e8d67e1d1c8d18ce90f99c3a240dff48cdc8", "d9de3e1156ce1380150948acbcfecd99c96e7f4b0bc97745f4681593d017f74f", "427a2201e09f9583cd990c03b81b58148c297d474a3b50f498d83b1c7a9414cd", "bfaca11596d3dec406a9fcf5d97536516dfe7f0e3b12078428a7e1700e25218a", "351c4770a097248a650008152d0cab5825d048bef770da7f3364f59d1e721bc0", "ee00f205d1486b2be7381d962bd2867263758e880529e4e2bfedfa613bbc0e71", "6aa3b6418d89e3348e4859c823ef4d6d7cd46aa7f7e77aba586c4214d760d8f8",
   805  	)
   806  }
   807  
   808  /*
   809  The regression test for the following invalid kademlia edge case.
   810  
   811  Addresses used in this test are discovered as part of the simulation network
   812  in higher level tests for streaming. They were generated randomly.
   813  
   814  =========================================================================
   815  Mon Apr  9 19:16:25 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 9a90fe
   816  population: 8 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
   817  000  2 72ef 4e6c                    | 24 0b1e (0) 0d66 (0) 17f5 (0) 17e8 (0)
   818  001  2 fc2b fa47                    | 13 fa47 (0) fc2b (0) fffd (0) ecef (0)
   819  002  2 b847 afa8                    |  6 afa8 (0) ad77 (0) bb7c (0) b847 (0)
   820  003  0                              |  0
   821  004  0                              |  4 91fc (0) 957d (0) 9482 (0) 949a (0)
   822  ============ DEPTH: 5 ==========================================
   823  005  1 9ccf                         |  1 9ccf (0)
   824  006  0                              |  0
   825  007  1 9bb2                         |  1 9bb2 (0)
   826  008  0                              |  0
   827  009  0                              |  0
   828  010  0                              |  0
   829  011  0                              |  0
   830  012  0                              |  0
   831  013  0                              |  0
   832  014  0                              |  0
   833  015  0                              |  0
   834  =========================================================================
   835  */
   836  func TestKademliaCase4(t *testing.T) {
   837  	testKademliaCase(t,
   838  		"9a90fe3506277244549064b8c3276abb06284a199d9063a97331947f2b7da7f4",
   839  		"c19359eddef24b7be1a833b4475f212cd944263627a53f9ef4837d106c247730", "fc2b6fef99ef947f7e57c3df376891769e2a2fd83d2b8e634e0fc1e91eaa080c", "ecefc0e1a8ea7bb4b48c469e077401fce175dd75294255b96c4e54f6a2950a55", "bb7ce598efc056bba343cc2614aa3f67a575557561290b44c73a63f8f433f9f7", "55fbee6ca52dfd7f0be0db969ee8e524b654ab4f0cce7c05d83887d7d2a15460", "afa852b6b319998c6a283cc0c82d2f5b8e9410075d7700f3012761f1cfbd0f76", "36c370cfb63f2087971ba6e58d7585b04e16b8f0da335efb91554c2dd8fe191c", "6be41e029985edebc901fb77fc4fb65516b6d85086e2a98bfa3159c99391e585", "dd3cfc72ea553e7d2b28f0037a65646b30955b929d29ba4c40f4a2a811248e77", "da3a8f18e09c7b0ca235c4e33e1441a5188f1df023138bf207753ee63e768f7d", "de9e3ab4dc572d54a2d4b878329fd832bb51a149f4ce167316eeb177b61e7e01", "4e6c1ecde6ed917706257fe020a1d02d2e9d87fca4c85f0f7b132491008c5032", "72ef04b77a070e13463b3529dd312bcacfb7a12d20dc597f5ec3de0501e9b834", "3fef57186675d524ab8bb1f54ba8cb68610babca1247c0c46dbb60aed003c69d", "1d8e6b71f7a052865d6558d4ba44ad5fab7b908cc1badf5766822e1c20d0d823", "6be2f2b4ffa173014d4ec7df157d289744a2bda54bb876b264ccfa898a0da315", "b0ba3fff8643f9985c744327b0c4c869763509fd5da2de9a80a4a0a082021255", "9ccf40b9406ba2e6567101fb9b4e5334a9ec74263eff47267da266ba45e6c158", "d7347f02c180a448e60f73931845062ce00048750b584790278e9c93ef31ad81", "b68c6359a22b3bee6fecb8804311cfd816648ea31d530c9fb48e477e029d707a", "0d668a18ad7c2820214df6df95a6c855ce19fb1cb765f8ca620e45db76686d37", "3fbd2663bff65533246f1fabb9f38086854c6218aeb3dc9ac6ac73d4f0988f91", "949aa5719ca846052bfaa1b38c97b6eca3df3e24c0e0630042c6bccafbb4cdb5", "77b8a2b917bef5d54f3792183b014cca7798f713ff14fe0b2ac79b4c9f6f996d", "17e853cbd8dc00cba3cd9ffeb36f26a9f41a0eb92f80b62c2cda16771c935388", "5f682ed7a8cf2f98387c3def7c97f9f05ae39e39d393eeca3cf621268d6347f8", "ad77487eaf11fd8084ba4517a51766eb0e5b77dd3492dfa79aa3a2802fb29d20", "d247cfcacf9a8200ebaddf639f8c926ab0a001abe682f40df3785e80ed124e91", "195589442e11907eede1ee6524157f1125f68399f3170c835ff81c603b069f6c", "5b5ca0a67f3c54e7d3a6a862ef56168ec9ed1f4945e6c24de6d336b2be2e6f8c", "56430e4caa253015f1f998dce4a48a88af1953f68e94eca14f53074ae9c3e467", "0b1eed6a5bf612d1d8e08f5c546f3d12e838568fd3aa43ed4c537f10c65545d6", "7058db19a56dfff01988ac4a62e1310597f9c8d7ebde6890dadabf047d722d39", "b847380d6888ff7cd11402d086b19eccc40950b52c9d67e73cb4f8462f5df078", "df6c048419a2290ab546d527e9eeba349e7f7e1759bafe4adac507ce60ef9670", "91fc5b4b24fc3fbfea7f9a3d0f0437cb5733c0c2345d8bdffd7048d6e3b8a37b", "957d8ea51b37523952b6f5ae95462fcd4aed1483ef32cc80b69580aaeee03606", "efa82e4e91ad9ab781977400e9ac0bb9de7389aaedebdae979b73d1d3b8d72b0", "7400c9f3f3fc0cc6fe8cc37ab24b9771f44e9f78be913f73cd35fc4be030d6bd", "9bb28f4122d61f7bb56fe27ef706159fb802fef0f5de9dfa32c9c5b3183235f1", "40a8de6e98953498b806614532ea4abf8b99ad7f9719fb68203a6eae2efa5b2a", "412de0b218b8f7dcacc9205cd16ffb4eca5b838f46a2f4f9f534026061a47308", "17f56ecad51075080680ad9faa0fd8946b824d3296ddb20be07f9809fe8d1c5a", "fffd4e7ae885a41948a342b6647955a7ec8a8039039f510cff467ef597675457", "35e78e11b5ac46a29dd04ab0043136c3291f4ca56cb949ace33111ed56395463", "94824fc80230af82077c83bfc01dc9675b1f9d3d538b1e5f41c21ac753598691", "fa470ae314ca3fce493f21b423eef2a49522e09126f6f2326fa3c9cac0b344f7", "7078860b5b621b21ac7b95f9fc4739c8235ce5066a8b9bd7d938146a34fa88ec", "eea53560f0428bfd2eca4f86a5ce9dec5ff1309129a975d73465c1c9e9da71d1",
   840  	)
   841  }
   842  
   843  /*
   844  The regression test for the following invalid kademlia edge case.
   845  
   846  Addresses used in this test are discovered as part of the simulation network
   847  in higher level tests for streaming. They were generated randomly.
   848  
   849  =========================================================================
   850  Mon Apr  9 19:25:18 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 5dd5c7
   851  population: 13 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4
   852  000  2 e528 fad0                    | 22 fad0 (0) e528 (0) e3bb (0) ed13 (0)
   853  001  3 3f30 18e0 1dd3               |  7 3f30 (0) 23db (0) 10b6 (0) 18e0 (0)
   854  002  4 7c54 7804 61e4 60f9          | 10 61e4 (0) 60f9 (0) 636c (0) 7186 (0)
   855  003  2 40ae 4bae                    |  5 4bae (0) 4d5c (0) 403a (0) 40ae (0)
   856  004  0                              |  0
   857  005  0                              |  3 5808 (0) 5a0e (0) 5bdb (0)
   858  ============ DEPTH: 6 ==========================================
   859  006  2 5f14 5f61                    |  2 5f14 (0) 5f61 (0)
   860  007  0                              |  0
   861  008  0                              |  0
   862  009  0                              |  0
   863  010  0                              |  0
   864  011  0                              |  0
   865  012  0                              |  0
   866  013  0                              |  0
   867  014  0                              |  0
   868  015  0                              |  0
   869  =========================================================================
   870  */
   871  func TestKademliaCase5(t *testing.T) {
   872  	testKademliaCase(t,
   873  		"5dd5c77dd9006a800478fcebb02d48d4036389e7d3c8f6a83b97dbad13f4c0a9",
   874  		"78fafa0809929a1279ece089a51d12457c2d8416dff859aeb2ccc24bb50df5ec", "1dd39b1257e745f147cbbc3cadd609ccd6207c41056dbc4254bba5d2527d3ee5", "5f61dd66d4d94aec8fcc3ce0e7885c7edf30c43143fa730e2841c5d28e3cd081", "8aa8b0472cb351d967e575ad05c4b9f393e76c4b01ef4b3a54aac5283b78abc9", "4502f385152a915b438a6726ce3ea9342e7a6db91a23c2f6bee83a885ed7eb82", "718677a504249db47525e959ef1784bed167e1c46f1e0275b9c7b588e28a3758", "7c54c6ed1f8376323896ed3a4e048866410de189e9599dd89bf312ca4adb96b5", "18e03bd3378126c09e799a497150da5c24c895aedc84b6f0dbae41fc4bac081a", "23db76ac9e6e58d9f5395ca78252513a7b4118b4155f8462d3d5eec62486cadc", "40ae0e8f065e96c7adb7fa39505136401f01780481e678d718b7f6dbb2c906ec", "c1539998b8bae19d339d6bbb691f4e9daeb0e86847545229e80fe0dffe716e92", "ed139d73a2699e205574c08722ca9f030ad2d866c662f1112a276b91421c3cb9", "5bdb19584b7a36d09ca689422ef7e6bb681b8f2558a6b2177a8f7c812f631022", "636c9de7fe234ffc15d67a504c69702c719f626c17461d3f2918e924cd9d69e2", "de4455413ff9335c440d52458c6544191bd58a16d85f700c1de53b62773064ea", "de1963310849527acabc7885b6e345a56406a8f23e35e436b6d9725e69a79a83", "a80a50a467f561210a114cba6c7fb1489ed43a14d61a9edd70e2eb15c31f074d", "7804f12b8d8e6e4b375b242058242068a3809385e05df0e64973cde805cf729c", "60f9aa320c02c6f2e6370aa740cf7cea38083fa95fca8c99552cda52935c1520", "d8da963602390f6c002c00ce62a84b514edfce9ebde035b277a957264bb54d21", "8463d93256e026fe436abad44697152b9a56ac8e06a0583d318e9571b83d073c", "9a3f78fcefb9a05e40a23de55f6153d7a8b9d973ede43a380bf46bb3b3847de1", "e3bb576f4b3760b9ca6bff59326f4ebfc4a669d263fb7d67ab9797adea54ed13", "4d5cdbd6dcca5bdf819a0fe8d175dc55cc96f088d37462acd5ea14bc6296bdbe", "5a0ed28de7b5258c727cb85447071c74c00a5fbba9e6bc0393bc51944d04ab2a", "61e4ddb479c283c638f4edec24353b6cc7a3a13b930824aad016b0996ca93c47", "7e3610868acf714836cafaaa7b8c009a9ac6e3a6d443e5586cf661530a204ee2", "d74b244d4345d2c86e30a097105e4fb133d53c578320285132a952cdaa64416e", "cfeed57d0f935bfab89e3f630a7c97e0b1605f0724d85a008bbfb92cb47863a8", "580837af95055670e20d494978f60c7f1458dc4b9e389fc7aa4982b2aca3bce3", "df55c0c49e6c8a83d82dfa1c307d3bf6a20e18721c80d8ec4f1f68dc0a137ced", "5f149c51ce581ba32a285439a806c063ced01ccd4211cd024e6a615b8f216f95", "1eb76b00aeb127b10dd1b7cd4c3edeb4d812b5a658f0feb13e85c4d2b7c6fe06", "7a56ba7c3fb7cbfb5561a46a75d95d7722096b45771ec16e6fa7bbfab0b35dfe", "4bae85ad88c28470f0015246d530adc0cd1778bdd5145c3c6b538ee50c4e04bd", "afd1892e2a7145c99ec0ebe9ded0d3fec21089b277a68d47f45961ec5e39e7e0", "953138885d7b36b0ef79e46030f8e61fd7037fbe5ce9e0a94d728e8c8d7eab86", "de761613ef305e4f628cb6bf97d7b7dc69a9d513dc233630792de97bcda777a6", "3f3087280063d09504c084bbf7fdf984347a72b50d097fd5b086ffabb5b3fb4c", "7d18a94bb1ebfdef4d3e454d2db8cb772f30ca57920dd1e402184a9e598581a0", "a7d6fbdc9126d9f10d10617f49fb9f5474ffe1b229f76b7dd27cebba30eccb5d", "fad0246303618353d1387ec10c09ee991eb6180697ed3470ed9a6b377695203d", "1cf66e09ea51ee5c23df26615a9e7420be2ac8063f28f60a3bc86020e94fe6f3", "8269cdaa153da7c358b0b940791af74d7c651cd4d3f5ed13acfe6d0f2c539e7f", "90d52eaaa60e74bf1c79106113f2599471a902d7b1c39ac1f55b20604f453c09", "9788fd0c09190a3f3d0541f68073a2f44c2fcc45bb97558a7c319f36c25a75b3", "10b68fc44157ecfdae238ee6c1ce0333f906ad04d1a4cb1505c8e35c3c87fbb0", "e5284117fdf3757920475c786e0004cb00ba0932163659a89b36651a01e57394", "403ad51d911e113dcd5f9ff58c94f6d278886a2a4da64c3ceca2083282c92de3",
   875  	)
   876  }
   877  
   878  func newTestDiscoveryPeer(addr pot.Address, kad *Kademlia) *Peer {
   879  	rw := &p2p.MsgPipeRW{}
   880  	p := p2p.NewPeer(enode.ID{}, "foo", []p2p.Cap{})
   881  	pp := protocols.NewPeer(p, rw, &protocols.Spec{})
   882  	bp := &BzzPeer{
   883  		Peer: pp,
   884  		BzzAddr: &BzzAddr{
   885  			OAddr: addr.Bytes(),
   886  			UAddr: []byte(fmt.Sprintf("%x", addr[:])),
   887  		},
   888  	}
   889  	return NewPeer(bp, kad)
   890  }