github.com/oskarth/go-ethereum@v1.6.8-0.20191013093314-dac24a9d3494/swarm/network/kademlia_test.go (about)

     1  // Copyright 2017 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/ethereum/go-ethereum/common"
    27  	"github.com/ethereum/go-ethereum/log"
    28  	"github.com/ethereum/go-ethereum/swarm/pot"
    29  )
    30  
    31  func init() {
    32  	h := log.LvlFilterHandler(log.LvlWarn, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))
    33  	log.Root().SetHandler(h)
    34  }
    35  
    36  func testKadPeerAddr(s string) *BzzAddr {
    37  	a := pot.NewAddressFromString(s)
    38  	return &BzzAddr{OAddr: a, UAddr: a}
    39  }
    40  
    41  func newTestKademlia(b string) *Kademlia {
    42  	params := NewKadParams()
    43  	params.MinBinSize = 1
    44  	params.MinProxBinSize = 2
    45  	base := pot.NewAddressFromString(b)
    46  	return NewKademlia(base, params)
    47  }
    48  
    49  func newTestKadPeer(k *Kademlia, s string) *Peer {
    50  	return NewPeer(&BzzPeer{BzzAddr: testKadPeerAddr(s)}, k)
    51  }
    52  
    53  func On(k *Kademlia, ons ...string) {
    54  	for _, s := range ons {
    55  		k.On(newTestKadPeer(k, s))
    56  	}
    57  }
    58  
    59  func Off(k *Kademlia, offs ...string) {
    60  	for _, s := range offs {
    61  		k.Off(newTestKadPeer(k, s))
    62  	}
    63  }
    64  
    65  func Register(k *Kademlia, regs ...string) {
    66  	var as []*BzzAddr
    67  	for _, s := range regs {
    68  		as = append(as, testKadPeerAddr(s))
    69  	}
    70  	err := k.Register(as...)
    71  	if err != nil {
    72  		panic(err.Error())
    73  	}
    74  }
    75  
    76  func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error {
    77  	addr, o, want := k.SuggestPeer()
    78  	if binStr(addr) != expAddr {
    79  		return fmt.Errorf("incorrect peer address suggested. expected %v, got %v", expAddr, binStr(addr))
    80  	}
    81  	if o != expPo {
    82  		return fmt.Errorf("incorrect prox order suggested. expected %v, got %v", expPo, o)
    83  	}
    84  	if want != expWant {
    85  		return fmt.Errorf("expected SuggestPeer to want peers: %v", expWant)
    86  	}
    87  	return nil
    88  }
    89  
    90  func binStr(a *BzzAddr) string {
    91  	if a == nil {
    92  		return "<nil>"
    93  	}
    94  	return pot.ToBin(a.Address())[:8]
    95  }
    96  
    97  func TestSuggestPeerBug(t *testing.T) {
    98  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
    99  	k := newTestKademlia("00000000")
   100  	On(k,
   101  		"10000000", "11000000",
   102  		"01000000",
   103  
   104  		"00010000", "00011000",
   105  	)
   106  	Off(k,
   107  		"01000000",
   108  	)
   109  	err := testSuggestPeer(k, "01000000", 0, false)
   110  	if err != nil {
   111  		t.Fatal(err.Error())
   112  	}
   113  }
   114  
   115  func TestSuggestPeerFindPeers(t *testing.T) {
   116  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
   117  	k := newTestKademlia("00000000")
   118  	On(k, "00100000")
   119  	err := testSuggestPeer(k, "<nil>", 0, false)
   120  	if err != nil {
   121  		t.Fatal(err.Error())
   122  	}
   123  
   124  	// 2 row gap, saturated proxbin, no callables -> want PO 0
   125  	On(k, "00010000")
   126  	err = testSuggestPeer(k, "<nil>", 0, false)
   127  	if err != nil {
   128  		t.Fatal(err.Error())
   129  	}
   130  
   131  	// 1 row gap (1 less), saturated proxbin, no callables -> want PO 1
   132  	On(k, "10000000")
   133  	err = testSuggestPeer(k, "<nil>", 1, false)
   134  	if err != nil {
   135  		t.Fatal(err.Error())
   136  	}
   137  
   138  	// no gap (1 less), saturated proxbin, no callables -> do not want more
   139  	On(k, "01000000", "00100001")
   140  	err = testSuggestPeer(k, "<nil>", 0, false)
   141  	if err != nil {
   142  		t.Fatal(err.Error())
   143  	}
   144  
   145  	// oversaturated proxbin, > do not want more
   146  	On(k, "00100001")
   147  	err = testSuggestPeer(k, "<nil>", 0, false)
   148  	if err != nil {
   149  		t.Fatal(err.Error())
   150  	}
   151  
   152  	// reintroduce gap, disconnected peer callable
   153  	Off(k, "01000000")
   154  	err = testSuggestPeer(k, "01000000", 0, false)
   155  	if err != nil {
   156  		t.Fatal(err.Error())
   157  	}
   158  
   159  	// second time disconnected peer not callable
   160  	// with reasonably set Interval
   161  	err = testSuggestPeer(k, "<nil>", 1, true)
   162  	if err != nil {
   163  		t.Fatal(err.Error())
   164  	}
   165  
   166  	// on and off again, peer callable again
   167  	On(k, "01000000")
   168  	Off(k, "01000000")
   169  	err = testSuggestPeer(k, "01000000", 0, false)
   170  	if err != nil {
   171  		t.Fatal(err.Error())
   172  	}
   173  
   174  	On(k, "01000000")
   175  	// new closer peer appears, it is immediately wanted
   176  	Register(k, "00010001")
   177  	err = testSuggestPeer(k, "00010001", 0, false)
   178  	if err != nil {
   179  		t.Fatal(err.Error())
   180  	}
   181  
   182  	// PO1 disconnects
   183  	On(k, "00010001")
   184  	log.Info(k.String())
   185  	Off(k, "01000000")
   186  	log.Info(k.String())
   187  	// second time, gap filling
   188  	err = testSuggestPeer(k, "01000000", 0, false)
   189  	if err != nil {
   190  		t.Fatal(err.Error())
   191  	}
   192  
   193  	On(k, "01000000")
   194  	err = testSuggestPeer(k, "<nil>", 0, false)
   195  	if err != nil {
   196  		t.Fatal(err.Error())
   197  	}
   198  
   199  	k.MinBinSize = 2
   200  	err = testSuggestPeer(k, "<nil>", 0, true)
   201  	if err != nil {
   202  		t.Fatal(err.Error())
   203  	}
   204  
   205  	Register(k, "01000001")
   206  	err = testSuggestPeer(k, "01000001", 0, false)
   207  	if err != nil {
   208  		t.Fatal(err.Error())
   209  	}
   210  
   211  	On(k, "10000001")
   212  	log.Trace(fmt.Sprintf("Kad:\n%v", k.String()))
   213  	err = testSuggestPeer(k, "<nil>", 1, true)
   214  	if err != nil {
   215  		t.Fatal(err.Error())
   216  	}
   217  
   218  	On(k, "01000001")
   219  	err = testSuggestPeer(k, "<nil>", 0, false)
   220  	if err != nil {
   221  		t.Fatal(err.Error())
   222  	}
   223  
   224  	k.MinBinSize = 3
   225  	Register(k, "10000010")
   226  	err = testSuggestPeer(k, "10000010", 0, false)
   227  	if err != nil {
   228  		t.Fatal(err.Error())
   229  	}
   230  
   231  	On(k, "10000010")
   232  	err = testSuggestPeer(k, "<nil>", 1, false)
   233  	if err != nil {
   234  		t.Fatal(err.Error())
   235  	}
   236  
   237  	On(k, "01000010")
   238  	err = testSuggestPeer(k, "<nil>", 2, false)
   239  	if err != nil {
   240  		t.Fatal(err.Error())
   241  	}
   242  
   243  	On(k, "00100010")
   244  	err = testSuggestPeer(k, "<nil>", 3, false)
   245  	if err != nil {
   246  		t.Fatal(err.Error())
   247  	}
   248  
   249  	On(k, "00010010")
   250  	err = testSuggestPeer(k, "<nil>", 0, false)
   251  	if err != nil {
   252  		t.Fatal(err.Error())
   253  	}
   254  
   255  }
   256  
   257  func TestSuggestPeerRetries(t *testing.T) {
   258  	k := newTestKademlia("00000000")
   259  	k.RetryInterval = int64(300 * time.Millisecond) // cycle
   260  	k.MaxRetries = 50
   261  	k.RetryExponent = 2
   262  	sleep := func(n int) {
   263  		ts := k.RetryInterval
   264  		for i := 1; i < n; i++ {
   265  			ts *= int64(k.RetryExponent)
   266  		}
   267  		time.Sleep(time.Duration(ts))
   268  	}
   269  
   270  	Register(k, "01000000")
   271  	On(k, "00000001", "00000010")
   272  	err := testSuggestPeer(k, "01000000", 0, false)
   273  	if err != nil {
   274  		t.Fatal(err.Error())
   275  	}
   276  
   277  	err = testSuggestPeer(k, "<nil>", 0, false)
   278  	if err != nil {
   279  		t.Fatal(err.Error())
   280  	}
   281  
   282  	sleep(1)
   283  	err = testSuggestPeer(k, "01000000", 0, false)
   284  	if err != nil {
   285  		t.Fatal(err.Error())
   286  	}
   287  
   288  	err = testSuggestPeer(k, "<nil>", 0, false)
   289  	if err != nil {
   290  		t.Fatal(err.Error())
   291  	}
   292  
   293  	sleep(1)
   294  	err = testSuggestPeer(k, "01000000", 0, false)
   295  	if err != nil {
   296  		t.Fatal(err.Error())
   297  	}
   298  
   299  	err = testSuggestPeer(k, "<nil>", 0, false)
   300  	if err != nil {
   301  		t.Fatal(err.Error())
   302  	}
   303  
   304  	sleep(2)
   305  	err = testSuggestPeer(k, "01000000", 0, false)
   306  	if err != nil {
   307  		t.Fatal(err.Error())
   308  	}
   309  
   310  	err = testSuggestPeer(k, "<nil>", 0, false)
   311  	if err != nil {
   312  		t.Fatal(err.Error())
   313  	}
   314  
   315  	sleep(2)
   316  	err = testSuggestPeer(k, "<nil>", 0, false)
   317  	if err != nil {
   318  		t.Fatal(err.Error())
   319  	}
   320  
   321  }
   322  
   323  func TestKademliaHiveString(t *testing.T) {
   324  	k := newTestKademlia("00000000")
   325  	On(k, "01000000", "00100000")
   326  	Register(k, "10000000", "10000001")
   327  	k.MaxProxDisplay = 8
   328  	h := k.String()
   329  	expH := "\n=========================================================================\nMon Feb 27 12:10:28 UTC 2017 KΛÐΞMLIΛ hive: queen's address: 000000\npopulation: 2 (4), MinProxBinSize: 2, MinBinSize: 1, MaxBinSize: 4\n000  0                              |  2 8100 (0) 8000 (0)\n============ DEPTH: 1 ==========================================\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========================================================================="
   330  	if expH[104:] != h[104:] {
   331  		t.Fatalf("incorrect hive output. expected %v, got %v", expH, h)
   332  	}
   333  }
   334  
   335  // testKademliaCase constructs the kademlia and PeerPot map to validate
   336  // the SuggestPeer and Healthy methods for provided hex-encoded addresses.
   337  // Argument pivotAddr is the address of the kademlia.
   338  func testKademliaCase(t *testing.T, pivotAddr string, addrs ...string) {
   339  	addr := common.FromHex(pivotAddr)
   340  	addrs = append(addrs, pivotAddr)
   341  
   342  	k := NewKademlia(addr, NewKadParams())
   343  
   344  	as := make([][]byte, len(addrs))
   345  	for i, a := range addrs {
   346  		as[i] = common.FromHex(a)
   347  	}
   348  
   349  	for _, a := range as {
   350  		if bytes.Equal(a, addr) {
   351  			continue
   352  		}
   353  		p := &BzzAddr{OAddr: a, UAddr: a}
   354  		if err := k.Register(p); err != nil {
   355  			t.Fatal(err)
   356  		}
   357  	}
   358  
   359  	ppmap := NewPeerPotMap(2, as)
   360  
   361  	pp := ppmap[pivotAddr]
   362  
   363  	for {
   364  		a, _, _ := k.SuggestPeer()
   365  		if a == nil {
   366  			break
   367  		}
   368  		k.On(NewPeer(&BzzPeer{BzzAddr: a}, k))
   369  	}
   370  
   371  	h := k.Healthy(pp)
   372  	if !(h.GotNN && h.KnowNN && h.Full) {
   373  		t.Fatalf("not healthy: %#v\n%v", h, k.String())
   374  	}
   375  }
   376  
   377  /*
   378  The regression test for the following invalid kademlia edge case.
   379  
   380  Addresses used in this test are discovered as part of the simulation network
   381  in higher level tests for streaming. They were generated randomly.
   382  
   383  =========================================================================
   384  Mon Apr  9 12:18:24 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1
   385  population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   386  000  2 d7e5 ec56                    | 18 ec56 (0) d7e5 (0) d9e0 (0) c735 (0)
   387  001  2 18f1 3176                    | 14 18f1 (0) 10bb (0) 10d1 (0) 0421 (0)
   388  002  2 52aa 47cd                    | 11 52aa (0) 51d9 (0) 5161 (0) 5130 (0)
   389  003  1 646e                         |  1 646e (0)
   390  004  0                              |  3 769c (0) 76d1 (0) 7656 (0)
   391  ============ DEPTH: 5 ==========================================
   392  005  1 7a48                         |  1 7a48 (0)
   393  006  1 7cbd                         |  1 7cbd (0)
   394  007  0                              |  0
   395  008  0                              |  0
   396  009  0                              |  0
   397  010  0                              |  0
   398  011  0                              |  0
   399  012  0                              |  0
   400  013  0                              |  0
   401  014  0                              |  0
   402  015  0                              |  0
   403  =========================================================================
   404  */
   405  func TestKademliaCase1(t *testing.T) {
   406  	testKademliaCase(t,
   407  		"7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e",
   408  		"ec560e6a4806aa37f147ee83687f3cf044d9953e61eedb8c34b6d50d9e2c5623",
   409  		"646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d",
   410  		"18f13c5fba653781019025ab10e8d2fdc916d6448729268afe9e928ffcdbb8e8",
   411  		"317617acf99b4ffddda8a736f8fc6c6ede0bf690bc23d834123823e6d03e2f69",
   412  		"d7e52d9647a5d1c27a68c3ee65d543be3947ae4b68537b236d71ef9cb15fb9ab",
   413  		"7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8",
   414  		"7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0",
   415  		"52aa3ddec61f4d48dd505a2385403c634f6ad06ee1d99c5c90a5ba6006f9af9c",
   416  		"47cdb6fa93eeb8bc91a417ff4e3b14a9c2ea85137462e2f575fae97f0c4be60d",
   417  		"5161943eb42e2a03e715fe8afa1009ff5200060c870ead6ab103f63f26cb107f",
   418  		"a38eaa1255f76bf883ca0830c86e8c4bb7eed259a8348aae9b03f21f90105bee",
   419  		"b2522bdf1ab26f324e75424fdf6e493b47e8a27687fe76347607b344fc010075",
   420  		"5bd7213964efb2580b91d02ac31ef126838abeba342f5dbdbe8d4d03562671a2",
   421  		"0b531adb82744768b694d7f94f73d4f0c9de591266108daeb8c74066bfc9c9ca",
   422  		"28501f59f70e888d399570145ed884353e017443c675aa12731ada7c87ea14f7",
   423  		"4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51",
   424  		"b193431ee35cd32de95805e7c1c749450c47486595aae7195ea6b6019a64fd61",
   425  		"baebf36a1e35a7ed834e1c72faf44ba16c159fa47d3289ceb3ca35fefa8739b5",
   426  		"a3659bd32e05fa36c8d20dbaaed8362bf1a8a7bd116aed62d8a43a2efbdf513f",
   427  		"10d1b50881a4770ebebdd0a75589dabb931e6716747b0f65fd6b080b88c4fdb6",
   428  		"3c76b8ca5c7ce6a03320646826213f59229626bf5b9d25da0c3ec0662dcb8ff3",
   429  		"4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112",
   430  		"c7353d320987956075b5bc1668571c7a36c800d5598fdc4832ec6569561e15d1",
   431  		"d9e0c7c90878c20ab7639d5954756f54775404b3483407fe1b483635182734f6",
   432  		"8fca67216b7939c0824fb06c5279901a94da41da9482b000f56df9906736ee75",
   433  		"460719d7f7aa7d7438f0eaf30333484fa3bd0f233632c10ba89e6e46dd3604be",
   434  		"0421d92c8a1c79ed5d01305a3d25aaf22a8f5f9e3d4bc80da47ee16ce20465fe",
   435  		"3441d9d9c0f05820a1bb6459fc7d8ef266a1bd929e7db939a10f544efe8261ea",
   436  		"ab198a66c293586746758468c610e5d3914d4ce629147eff6dd55a31f863ff8f",
   437  		"3a1c8c16b0763f3d2c35269f454ff779d1255e954d2deaf6c040fb3f0bcdc945",
   438  		"5561c0ea3b203e173b11e6aa9d0e621a4e10b1d8b178b8fe375220806557b823",
   439  		"7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3",
   440  		"5130594fd54c1652cf2debde2c4204573ed76555d1e26757fe345b409af1544a",
   441  		"76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0",
   442  		"89580231962624c53968c1b0095b4a2732b2a2640a19fdd7d21fd064fcc0a5ef",
   443  		"3d10d001fff44680c7417dd66ecf2e984f0baa20a9bbcea348583ba5ff210c4f",
   444  		"43754e323f0f3a1155b1852bd6edd55da86b8c4cfe3df8b33733fca50fc202b8",
   445  		"a9e7b1bb763ae6452ddcacd174993f82977d81a85206bb2ae3c842e2d8e19b4c",
   446  		"10bb07da7bc7c7757f74149eff167d528a94a253cdc694a863f4d50054c00b6d",
   447  		"28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19",
   448  		"835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc",
   449  		"8e236c56a77d7f46e41e80f7092b1a68cd8e92f6156365f41813ad1ca2c6b6f3",
   450  		"51d9c857e9238c49186e37b4eccf17a82de3d5739f026f6043798ab531456e73",
   451  		"bbddf7db6a682225301f36a9fd5b0d0121d2951753e1681295f3465352ad511f",
   452  		"2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e",
   453  		"769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a",
   454  		"ba3bebec689ce51d3e12776c45f80d25164fdfb694a8122d908081aaa2e7122c",
   455  		"3a51f4146ea90a815d0d283d1ceb20b928d8b4d45875e892696986a3c0d8fb9b",
   456  		"81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009",
   457  	)
   458  }
   459  
   460  /*
   461  The regression test for the following invalid kademlia edge case.
   462  
   463  Addresses used in this test are discovered as part of the simulation network
   464  in higher level tests for streaming. They were generated randomly.
   465  
   466  =========================================================================
   467  Mon Apr  9 18:43:48 UTC 2018 KΛÐΞMLIΛ hive: queen's address: bc7f3b
   468  population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   469  000  2 0f49 67ff                    | 28 0f49 (0) 0211 (0) 07b2 (0) 0703 (0)
   470  001  2 e84b f3a4                    | 13 f3a4 (0) e84b (0) e58b (0) e60b (0)
   471  002  1 8dba                         |  1 8dba (0)
   472  003  2 a008 ad72                    |  2 ad72 (0) a008 (0)
   473  004  0                              |  3 b61f (0) b27f (0) b027 (0)
   474  ============ DEPTH: 5 ==========================================
   475  005  1 ba19                         |  1 ba19 (0)
   476  006  0                              |  0
   477  007  1 bdd6                         |  1 bdd6 (0)
   478  008  0                              |  0
   479  009  0                              |  0
   480  010  0                              |  0
   481  011  0                              |  0
   482  012  0                              |  0
   483  013  0                              |  0
   484  014  0                              |  0
   485  015  0                              |  0
   486  =========================================================================
   487  */
   488  func TestKademliaCase2(t *testing.T) {
   489  	testKademliaCase(t,
   490  		"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",
   491  	)
   492  }
   493  
   494  /*
   495  The regression test for the following invalid kademlia edge case.
   496  
   497  Addresses used in this test are discovered as part of the simulation network
   498  in higher level tests for streaming. They were generated randomly.
   499  
   500  =========================================================================
   501  Mon Apr  9 19:04:35 UTC 2018 KΛÐΞMLIΛ hive: queen's address: b4822e
   502  population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   503  000  2 786c 774b                    | 29 774b (0) 786c (0) 7a79 (0) 7d2f (0)
   504  001  2 d9de cf19                    | 10 cf19 (0) d9de (0) d2ff (0) d2a2 (0)
   505  002  2 8ca1 8d74                    |  5 8d74 (0) 8ca1 (0) 9793 (0) 9f51 (0)
   506  003  0                              |  0
   507  004  0                              |  3 bfac (0) bcbb (0) bde9 (0)
   508  005  0                              |  0
   509  ============ DEPTH: 6 ==========================================
   510  006  1 b660                         |  1 b660 (0)
   511  007  0                              |  0
   512  008  1 b450                         |  1 b450 (0)
   513  009  0                              |  0
   514  010  0                              |  0
   515  011  0                              |  0
   516  012  0                              |  0
   517  013  0                              |  0
   518  014  0                              |  0
   519  015  0                              |  0
   520  =========================================================================
   521  */
   522  func TestKademliaCase3(t *testing.T) {
   523  	testKademliaCase(t,
   524  		"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",
   525  	)
   526  }
   527  
   528  /*
   529  The regression test for the following invalid kademlia edge case.
   530  
   531  Addresses used in this test are discovered as part of the simulation network
   532  in higher level tests for streaming. They were generated randomly.
   533  
   534  =========================================================================
   535  Mon Apr  9 19:16:25 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 9a90fe
   536  population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   537  000  2 72ef 4e6c                    | 24 0b1e (0) 0d66 (0) 17f5 (0) 17e8 (0)
   538  001  2 fc2b fa47                    | 13 fa47 (0) fc2b (0) fffd (0) ecef (0)
   539  002  2 b847 afa8                    |  6 afa8 (0) ad77 (0) bb7c (0) b847 (0)
   540  003  0                              |  0
   541  004  0                              |  4 91fc (0) 957d (0) 9482 (0) 949a (0)
   542  ============ DEPTH: 5 ==========================================
   543  005  1 9ccf                         |  1 9ccf (0)
   544  006  0                              |  0
   545  007  1 9bb2                         |  1 9bb2 (0)
   546  008  0                              |  0
   547  009  0                              |  0
   548  010  0                              |  0
   549  011  0                              |  0
   550  012  0                              |  0
   551  013  0                              |  0
   552  014  0                              |  0
   553  015  0                              |  0
   554  =========================================================================
   555  */
   556  func TestKademliaCase4(t *testing.T) {
   557  	testKademliaCase(t,
   558  		"9a90fe3506277244549064b8c3276abb06284a199d9063a97331947f2b7da7f4",
   559  		"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",
   560  	)
   561  }
   562  
   563  /*
   564  The regression test for the following invalid kademlia edge case.
   565  
   566  Addresses used in this test are discovered as part of the simulation network
   567  in higher level tests for streaming. They were generated randomly.
   568  
   569  =========================================================================
   570  Mon Apr  9 19:25:18 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 5dd5c7
   571  population: 13 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   572  000  2 e528 fad0                    | 22 fad0 (0) e528 (0) e3bb (0) ed13 (0)
   573  001  3 3f30 18e0 1dd3               |  7 3f30 (0) 23db (0) 10b6 (0) 18e0 (0)
   574  002  4 7c54 7804 61e4 60f9          | 10 61e4 (0) 60f9 (0) 636c (0) 7186 (0)
   575  003  2 40ae 4bae                    |  5 4bae (0) 4d5c (0) 403a (0) 40ae (0)
   576  004  0                              |  0
   577  005  0                              |  3 5808 (0) 5a0e (0) 5bdb (0)
   578  ============ DEPTH: 6 ==========================================
   579  006  2 5f14 5f61                    |  2 5f14 (0) 5f61 (0)
   580  007  0                              |  0
   581  008  0                              |  0
   582  009  0                              |  0
   583  010  0                              |  0
   584  011  0                              |  0
   585  012  0                              |  0
   586  013  0                              |  0
   587  014  0                              |  0
   588  015  0                              |  0
   589  =========================================================================
   590  */
   591  func TestKademliaCase5(t *testing.T) {
   592  	testKademliaCase(t,
   593  		"5dd5c77dd9006a800478fcebb02d48d4036389e7d3c8f6a83b97dbad13f4c0a9",
   594  		"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",
   595  	)
   596  }