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	"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, "127.0.0.1", "5000")
 44
 45	d := kademlia.KBucket(kademlia.N.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, "127.0.0.1", "5000")
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}