go-dht/kademlia_test.go
kademlia_test.goRaw
1package main
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 TestNodeKBucket(t *testing.T) {
41 node, err := LoadNode("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
42 assert.Nil(t, err)
43
44 d := node.KBucket(node.ID)
45 assert.Equal(t, 0, d) // same node should have distance 0
46
47 idB, err := IDFromString("c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b")
48 assert.Nil(t, err)
49
50 d = node.KBucket(idB)
51 assert.Equal(t, 159, d)
52}
53
54func prepareTestListedNodes() []ListedNode {
55 lnIDs := []string{
56 "c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
57 "420bfebd44fc62615253224328f40f29c9b225fa",
58 "6272bb67b1661abfa07d1d32cd9b810e531d42cd",
59 "07db608db033384895e48098a1bbe25266387463",
60 "c19c3285ab9ada4b420050ae1a204640b2bed508",
61 "f8971d5da24517c8cc5a316fb0658de8906c4155",
62 "04122a5f2dec42284147b1847ec1bc41ecd78626",
63 "407a90870d7b482a271446c85fda940ce78a4c7a",
64 "5ebe4539e7a33721a8623f7ebfab62600aa503e7",
65 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
66 "fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
67 "10c86f96ebaa1685a46a6417e6faa2ef34a68976",
68 "243c81515196a5b0e2d4675e73f0da3eead12793",
69 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
70 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
71 "0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
72 "0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
73 "0750931c40a52a2facd220a02851f7d34f95e1fa",
74 "ebfba615ac50bcd0f5c2420741d032e885abf576",
75 }
76 var lns []ListedNode
77 for i := 0; i < len(lnIDs); i++ {
78 idI, err := IDFromString(lnIDs[i])
79 if err != nil {
80 panic(err)
81 }
82 lnI := ListedNode{
83 ID: idI,
84 Addr: "",
85 }
86 lns = append(lns, lnI)
87 }
88 return lns
89}
90
91func TestMoveToBottom(t *testing.T) {
92 lns := prepareTestListedNodes()
93 movedElem := lns[3]
94 assert.NotEqual(t, movedElem, lns[len(lns)-1])
95 lns = moveToBottom(lns, 3)
96 assert.Equal(t, movedElem, lns[len(lns)-1])
97}
98
99func TestUpdate(t *testing.T) {
100 nodeA, err := LoadNode("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
101 assert.Nil(t, err)
102
103 lns := prepareTestListedNodes()
104 for _, lnI := range lns {
105 nodeA.Update(lnI)
106 }
107
108 if debug {
109 fmt.Println(nodeA)
110 }
111
112 assert.Equal(t, len(nodeA.KBuckets[0]), 1)
113 assert.Equal(t, len(nodeA.KBuckets[1]), 1)
114 assert.Equal(t, len(nodeA.KBuckets[158]), 4)
115 assert.Equal(t, len(nodeA.KBuckets[159]), 5)
116}