go-dht/kademlia/kademlia_test.go
kademlia/kademlia_test.goRaw
1package kademlia
2
3import (
4 "fmt"
5 "testing"
6
7 log "github.com/sirupsen/logrus"
8 "github.com/stretchr/testify/assert"
9)
10
11var debug = false
12
13func init() {
14 log.SetLevel(log.DebugLevel)
15}
16
17func TestCountZeros(t *testing.T) {
18 zeroes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
19 assert.Equal(t, 0, kBucketByDistance(zeroes))
20
21 b := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
22 assert.Equal(t, 20, len(b))
23 assert.Equal(t, 7, kBucketByDistance(b))
24 b[19] = 0x00
25 assert.Equal(t, 7, kBucketByDistance(b))
26
27 b[0] = 0x0f
28 assert.Equal(t, 7, kBucketByDistance(b))
29
30 b[0] = 0x0c
31 assert.Equal(t, 7, kBucketByDistance(b))
32
33 b[0] = 0x00
34 b[1] = 0x00
35 b[2] = 0x0f
36 assert.Equal(t, 7, kBucketByDistance(b))
37
38 b[2] = 0x07
39 assert.Equal(t, 7, kBucketByDistance(b))
40
41 b[2] = 0x03
42 assert.Equal(t, 7, kBucketByDistance(b))
43
44 b = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
45 b[19] = 0x01
46 assert.Equal(t, 2, kBucketByDistance(b))
47 b[19] = 0x05
48 assert.Equal(t, 2, kBucketByDistance(b))
49
50 b[19] = 0x10
51 assert.Equal(t, 1, kBucketByDistance(b))
52
53 b[18] = 0x10
54 assert.Equal(t, 3, kBucketByDistance(b))
55}
56
57func TestKBucket(t *testing.T) {
58 idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
59 assert.Nil(t, err)
60 kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
61
62 d := kademlia.KBucket(kademlia.N.ID)
63 assert.Equal(t, 0, d) // same node should have distance 0
64
65 idB, err := IDFromString("c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b")
66 assert.Nil(t, err)
67
68 d = kademlia.KBucket(idB)
69 assert.Equal(t, 7, d)
70}
71
72func prepareTestListedNodes() []ListedNode {
73 lnIDs := []string{
74 "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
75 "420bfebd44fc62615253224328f40f29c9b225fa",
76 "6272bb67b1661abfa07d1d32cd9b810e531d42cd",
77 "07db608db033384895e48098a1bbe25266387463",
78 "c19c3285ab9ada4b420050ae1a204640b2bed508",
79 "f8971d5da24517c8cc5a316fb0658de8906c4155",
80 "04122a5f2dec42284147b1847ec1bc41ecd78626",
81 "407a90870d7b482a271446c85fda940ce78a4c7a",
82 "5ebe4539e7a33721a8623f7ebfab62600aa503e7",
83 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
84 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
85 "10c86f96ebaa1685a46a6417e6faa2ef34a68976",
86 "243c81515196a5b0e2d4675e73f0da3eead12793",
87 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
88 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
89 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
90 "0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
91 "0750931c40a52a2facd220a02851f7d34f95e1fa",
92 "ebfba615ac50bcd0f5c2420741d032e885abf576",
93 }
94 var lns []ListedNode
95 for i := 0; i < len(lnIDs); i++ {
96 idI, err := IDFromString(lnIDs[i])
97 if err != nil {
98 panic(err)
99 }
100 lnI := ListedNode{
101 ID: idI,
102 Addr: "",
103 }
104 lns = append(lns, lnI)
105 }
106 return lns
107}
108
109func TestMoveToBottom(t *testing.T) {
110 lns := prepareTestListedNodes()
111 movedElem := lns[3]
112 assert.NotEqual(t, movedElem, lns[len(lns)-1])
113 lns = moveToBottom(lns, 3)
114 assert.Equal(t, movedElem, lns[len(lns)-1])
115}
116
117func TestUpdate(t *testing.T) {
118 idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
119 assert.Nil(t, err)
120 kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
121
122 lns := prepareTestListedNodes()
123 for _, lnI := range lns {
124 kademlia.Update(lnI)
125 }
126
127 if debug {
128 fmt.Println(kademlia)
129 }
130
131 assert.Equal(t, 2, len(kademlia.KBuckets[0]))
132 assert.Equal(t, 0, len(kademlia.KBuckets[1]))
133 assert.Equal(t, 2, len(kademlia.KBuckets[2]))
134 assert.Equal(t, 0, len(kademlia.KBuckets[3]))
135 assert.Equal(t, 14, len(kademlia.KBuckets[7]))
136}
137
138func TestFindClosestKBucket(t *testing.T) {
139 idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
140 assert.Nil(t, err)
141 kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
142
143 lns := prepareTestListedNodes()
144 for _, lnI := range lns {
145 kademlia.Update(lnI)
146 }
147
148 if debug {
149 fmt.Println(kademlia)
150 }
151
152 idB, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d5")
153 assert.Nil(t, err)
154
155 k, err := kademlia.GetClosestKBucket(idB)
156 assert.Nil(t, err)
157 assert.Equal(t, 2, k)
158
159 idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a1000")
160 assert.Nil(t, err)
161
162 // the theorical KBucket should be 3
163 k = kademlia.KBucket(idB)
164 assert.Equal(t, 3, k)
165
166 // while the real KBucket (as the 3 is empty), should be 2
167 k, err = kademlia.GetClosestKBucket(idB)
168 assert.Nil(t, err)
169 assert.Equal(t, 2, k)
170
171 idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbc000000000")
172 assert.Nil(t, err)
173
174 // the theorical KBucket should be 3
175 k = kademlia.KBucket(idB)
176 assert.Equal(t, 5, k)
177
178 // while the real KBucket (as the 3 is empty), should be 2
179 k, err = kademlia.GetClosestKBucket(idB)
180 assert.Nil(t, err)
181 assert.Equal(t, 7, k)
182}