arnaucube
arnaucube/go-dhtPublic Self-hosted repository
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}