go-dht/kademlia/kademlia_test.go
kademlia/kademlia_test.goRaw
1package kademlia
2
3import (
4 "fmt"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8)
9
10var debug = false
11
12func TestCountZeros(t *testing.T) {
13 zeroes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
14 assert.Equal(t, 0, kBucketByDistance(zeroes))
15
16 b := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
17 assert.Equal(t, 20, len(b))
18 assert.Equal(t, 159, kBucketByDistance(b))
19 b[19] = 0x00
20 assert.Equal(t, 159, kBucketByDistance(b))
21
22 b[0] = 0x0f
23 assert.Equal(t, 159-4, kBucketByDistance(b))
24
25 b[0] = 0x0c
26 assert.Equal(t, 159-4, kBucketByDistance(b))
27
28 b[0] = 0x00
29 b[1] = 0x00
30 b[2] = 0x0f
31 assert.Equal(t, 159-20, kBucketByDistance(b))
32
33 b[2] = 0x07
34 assert.Equal(t, 159-21, kBucketByDistance(b))
35
36 b[2] = 0x03
37 assert.Equal(t, 159-22, kBucketByDistance(b))
38}
39
40func TestKBucket(t *testing.T) {
41 idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
42 assert.Nil(t, err)
43 kademlia := NewKademliaTable(idA)
44
45 d := kademlia.KBucket(kademlia.ID)
46 assert.Equal(t, 0, d) // same node should have distance 0
47
48 idB, err := IDFromString("c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b")
49 assert.Nil(t, err)
50
51 d = kademlia.KBucket(idB)
52 assert.Equal(t, 159, d)
53}
54
55func prepareTestListedNodes() []ListedNode {
56 lnIDs := []string{
57 "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
58 "420bfebd44fc62615253224328f40f29c9b225fa",
59 "6272bb67b1661abfa07d1d32cd9b810e531d42cd",
60 "07db608db033384895e48098a1bbe25266387463",
61 "c19c3285ab9ada4b420050ae1a204640b2bed508",
62 "f8971d5da24517c8cc5a316fb0658de8906c4155",
63 "04122a5f2dec42284147b1847ec1bc41ecd78626",
64 "407a90870d7b482a271446c85fda940ce78a4c7a",
65 "5ebe4539e7a33721a8623f7ebfab62600aa503e7",
66 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
67 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
68 "10c86f96ebaa1685a46a6417e6faa2ef34a68976",
69 "243c81515196a5b0e2d4675e73f0da3eead12793",
70 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
71 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
72 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
73 "0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
74 "0750931c40a52a2facd220a02851f7d34f95e1fa",
75 "ebfba615ac50bcd0f5c2420741d032e885abf576",
76 }
77 var lns []ListedNode
78 for i := 0; i < len(lnIDs); i++ {
79 idI, err := IDFromString(lnIDs[i])
80 if err != nil {
81 panic(err)
82 }
83 lnI := ListedNode{
84 ID: idI,
85 Addr: "",
86 }
87 lns = append(lns, lnI)
88 }
89 return lns
90}
91
92func TestMoveToBottom(t *testing.T) {
93 lns := prepareTestListedNodes()
94 movedElem := lns[3]
95 assert.NotEqual(t, movedElem, lns[len(lns)-1])
96 lns = moveToBottom(lns, 3)
97 assert.Equal(t, movedElem, lns[len(lns)-1])
98}
99
100func TestUpdate(t *testing.T) {
101 idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
102 assert.Nil(t, err)
103 kademlia := NewKademliaTable(idA)
104
105 lns := prepareTestListedNodes()
106 for _, lnI := range lns {
107 kademlia.Update(lnI)
108 }
109
110 if debug {
111 fmt.Println(kademlia)
112 }
113
114 assert.Equal(t, len(kademlia.KBuckets[0]), 1)
115 assert.Equal(t, len(kademlia.KBuckets[1]), 1)
116 assert.Equal(t, len(kademlia.KBuckets[158]), 4)
117 assert.Equal(t, len(kademlia.KBuckets[159]), 5)
118}