mirror of
https://github.com/ipfs/kubo.git
synced 2025-09-09 17:22:21 +08:00
moved routing table code into its own package
This commit is contained in:
126
routing/kbucket/table_test.go
Normal file
126
routing/kbucket/table_test.go
Normal file
@ -0,0 +1,126 @@
|
||||
package dht
|
||||
|
||||
import (
|
||||
crand "crypto/rand"
|
||||
"crypto/sha256"
|
||||
"math/rand"
|
||||
"container/list"
|
||||
"testing"
|
||||
|
||||
peer "github.com/jbenet/go-ipfs/peer"
|
||||
)
|
||||
|
||||
func _randPeer() *peer.Peer {
|
||||
p := new(peer.Peer)
|
||||
p.ID = make(peer.ID, 16)
|
||||
crand.Read(p.ID)
|
||||
return p
|
||||
}
|
||||
|
||||
func _randID() ID {
|
||||
buf := make([]byte, 16)
|
||||
crand.Read(buf)
|
||||
|
||||
hash := sha256.Sum256(buf)
|
||||
return ID(hash[:])
|
||||
}
|
||||
|
||||
// Test basic features of the bucket struct
|
||||
func TestBucket(t *testing.T) {
|
||||
b := new(Bucket)
|
||||
|
||||
peers := make([]*peer.Peer, 100)
|
||||
for i := 0; i < 100; i++ {
|
||||
peers[i] = _randPeer()
|
||||
b.PushFront(peers[i])
|
||||
}
|
||||
|
||||
local := _randPeer()
|
||||
local_id := ConvertPeerID(local.ID)
|
||||
|
||||
i := rand.Intn(len(peers))
|
||||
e := b.Find(peers[i].ID)
|
||||
if e == nil {
|
||||
t.Errorf("Failed to find peer: %v", peers[i])
|
||||
}
|
||||
|
||||
spl := b.Split(0, ConvertPeerID(local.ID))
|
||||
llist := (*list.List)(b)
|
||||
for e := llist.Front(); e != nil; e = e.Next() {
|
||||
p := ConvertPeerID(e.Value.(*peer.Peer).ID)
|
||||
cpl := xor(p, local_id).commonPrefixLen()
|
||||
if cpl > 0 {
|
||||
t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket")
|
||||
}
|
||||
}
|
||||
|
||||
rlist := (*list.List)(spl)
|
||||
for e := rlist.Front(); e != nil; e = e.Next() {
|
||||
p := ConvertPeerID(e.Value.(*peer.Peer).ID)
|
||||
cpl := xor(p, local_id).commonPrefixLen()
|
||||
if cpl == 0 {
|
||||
t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Right now, this just makes sure that it doesnt hang or crash
|
||||
func TestTableUpdate(t *testing.T) {
|
||||
local := _randPeer()
|
||||
rt := NewRoutingTable(10, ConvertPeerID(local.ID))
|
||||
|
||||
peers := make([]*peer.Peer, 100)
|
||||
for i := 0; i < 100; i++ {
|
||||
peers[i] = _randPeer()
|
||||
}
|
||||
|
||||
// Testing Update
|
||||
for i := 0; i < 10000; i++ {
|
||||
p := rt.Update(peers[rand.Intn(len(peers))])
|
||||
if p != nil {
|
||||
t.Log("evicted peer.")
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < 100; i++ {
|
||||
id := _randID()
|
||||
ret := rt.NearestPeers(id, 5)
|
||||
if len(ret) == 0 {
|
||||
t.Fatal("Failed to find node near ID.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTableFind(t *testing.T) {
|
||||
local := _randPeer()
|
||||
rt := NewRoutingTable(10, ConvertPeerID(local.ID))
|
||||
|
||||
peers := make([]*peer.Peer, 100)
|
||||
for i := 0; i < 5; i++ {
|
||||
peers[i] = _randPeer()
|
||||
rt.Update(peers[i])
|
||||
}
|
||||
|
||||
t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty())
|
||||
found := rt.NearestPeer(ConvertPeerID(peers[2].ID))
|
||||
if !found.ID.Equal(peers[2].ID) {
|
||||
t.Fatalf("Failed to lookup known node...")
|
||||
}
|
||||
}
|
||||
|
||||
func TestTableFindMultiple(t *testing.T) {
|
||||
local := _randPeer()
|
||||
rt := NewRoutingTable(20, ConvertPeerID(local.ID))
|
||||
|
||||
peers := make([]*peer.Peer, 100)
|
||||
for i := 0; i < 18; i++ {
|
||||
peers[i] = _randPeer()
|
||||
rt.Update(peers[i])
|
||||
}
|
||||
|
||||
t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty())
|
||||
found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15)
|
||||
if len(found) != 15 {
|
||||
t.Fatalf("Got back different number of peers than we expected.")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user