package kademlia
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var debug = false
|
|
|
|
func init() {
|
|
log.SetLevel(log.DebugLevel)
|
|
}
|
|
|
|
func TestCountZeros(t *testing.T) {
|
|
zeroes := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
assert.Equal(t, 0, kBucketByDistance(zeroes))
|
|
|
|
b := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
|
|
assert.Equal(t, 20, len(b))
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
b[19] = 0x00
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b[0] = 0x0f
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b[0] = 0x0c
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b[0] = 0x00
|
|
b[1] = 0x00
|
|
b[2] = 0x0f
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b[2] = 0x07
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b[2] = 0x03
|
|
assert.Equal(t, 7, kBucketByDistance(b))
|
|
|
|
b = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
b[19] = 0x01
|
|
assert.Equal(t, 2, kBucketByDistance(b))
|
|
b[19] = 0x05
|
|
assert.Equal(t, 2, kBucketByDistance(b))
|
|
|
|
b[19] = 0x10
|
|
assert.Equal(t, 1, kBucketByDistance(b))
|
|
|
|
b[18] = 0x10
|
|
assert.Equal(t, 3, kBucketByDistance(b))
|
|
}
|
|
|
|
func TestKBucket(t *testing.T) {
|
|
idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
|
|
assert.Nil(t, err)
|
|
kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
|
|
|
|
d := kademlia.KBucket(kademlia.N.ID)
|
|
assert.Equal(t, 0, d) // same node should have distance 0
|
|
|
|
idB, err := IDFromString("c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b")
|
|
assert.Nil(t, err)
|
|
|
|
d = kademlia.KBucket(idB)
|
|
assert.Equal(t, 7, d)
|
|
}
|
|
|
|
func prepareTestListedNodes() []ListedNode {
|
|
lnIDs := []string{
|
|
"c48d8b53dbefb609ed4e94d386dd5b22efcb2c5b",
|
|
"420bfebd44fc62615253224328f40f29c9b225fa",
|
|
"6272bb67b1661abfa07d1d32cd9b810e531d42cd",
|
|
"07db608db033384895e48098a1bbe25266387463",
|
|
"c19c3285ab9ada4b420050ae1a204640b2bed508",
|
|
"f8971d5da24517c8cc5a316fb0658de8906c4155",
|
|
"04122a5f2dec42284147b1847ec1bc41ecd78626",
|
|
"407a90870d7b482a271446c85fda940ce78a4c7a",
|
|
"5ebe4539e7a33721a8623f7ebfab62600aa503e7",
|
|
"fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
|
|
"fc44a42879ef3a74d6bd8303bc3e4e205a92acf9",
|
|
"10c86f96ebaa1685a46a6417e6faa2ef34a68976",
|
|
"243c81515196a5b0e2d4675e73f0da3eead12793",
|
|
"0fd85ddddf15aeec2d5d8b01b013dbca030a18d7",
|
|
"0fd85ddddf15aeec2d5d8b01b013dbca030a18d5",
|
|
"0fd85ddddf15aeec2d5d8b01b013dbca030a18d0",
|
|
"0fd85ddddf15aeec2d5d8b01b013dbca030a1800",
|
|
"0750931c40a52a2facd220a02851f7d34f95e1fa",
|
|
"ebfba615ac50bcd0f5c2420741d032e885abf576",
|
|
}
|
|
var lns []ListedNode
|
|
for i := 0; i < len(lnIDs); i++ {
|
|
idI, err := IDFromString(lnIDs[i])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
lnI := ListedNode{
|
|
ID: idI,
|
|
Addr: "",
|
|
}
|
|
lns = append(lns, lnI)
|
|
}
|
|
return lns
|
|
}
|
|
|
|
func TestMoveToBottom(t *testing.T) {
|
|
lns := prepareTestListedNodes()
|
|
movedElem := lns[3]
|
|
assert.NotEqual(t, movedElem, lns[len(lns)-1])
|
|
lns = moveToBottom(lns, 3)
|
|
assert.Equal(t, movedElem, lns[len(lns)-1])
|
|
}
|
|
|
|
func TestUpdate(t *testing.T) {
|
|
idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
|
|
assert.Nil(t, err)
|
|
kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
|
|
|
|
lns := prepareTestListedNodes()
|
|
for _, lnI := range lns {
|
|
kademlia.Update(lnI)
|
|
}
|
|
|
|
if debug {
|
|
fmt.Println(kademlia)
|
|
}
|
|
|
|
assert.Equal(t, 2, len(kademlia.KBuckets[0]))
|
|
assert.Equal(t, 0, len(kademlia.KBuckets[1]))
|
|
assert.Equal(t, 2, len(kademlia.KBuckets[2]))
|
|
assert.Equal(t, 0, len(kademlia.KBuckets[3]))
|
|
assert.Equal(t, 14, len(kademlia.KBuckets[7]))
|
|
}
|
|
|
|
func TestFindClosestKBucket(t *testing.T) {
|
|
idA, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d7")
|
|
assert.Nil(t, err)
|
|
kademlia := NewKademliaTable(idA, "127.0.0.1", "5000")
|
|
|
|
lns := prepareTestListedNodes()
|
|
for _, lnI := range lns {
|
|
kademlia.Update(lnI)
|
|
}
|
|
|
|
if debug {
|
|
fmt.Println(kademlia)
|
|
}
|
|
|
|
idB, err := IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a18d5")
|
|
assert.Nil(t, err)
|
|
|
|
k, err := kademlia.GetClosestKBucket(idB)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, 2, k)
|
|
|
|
idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbca030a1000")
|
|
assert.Nil(t, err)
|
|
|
|
// the theorical KBucket should be 3
|
|
k = kademlia.KBucket(idB)
|
|
assert.Equal(t, 3, k)
|
|
|
|
// while the real KBucket (as the 3 is empty), should be 2
|
|
k, err = kademlia.GetClosestKBucket(idB)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, 2, k)
|
|
|
|
idB, err = IDFromString("0fd85ddddf15aeec2d5d8b01b013dbc000000000")
|
|
assert.Nil(t, err)
|
|
|
|
// the theorical KBucket should be 3
|
|
k = kademlia.KBucket(idB)
|
|
assert.Equal(t, 5, k)
|
|
|
|
// while the real KBucket (as the 3 is empty), should be 2
|
|
k, err = kademlia.GetClosestKBucket(idB)
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, 7, k)
|
|
}
|