mirror of
https://github.com/fluencelabs/go-libp2p-kad-dht
synced 2025-04-25 14:52:14 +00:00
135 lines
2.8 KiB
Go
135 lines
2.8 KiB
Go
|
package providers
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
key "github.com/ipfs/go-ipfs/blocks/key"
|
||
|
peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer"
|
||
|
ds "gx/ipfs/QmZ6A6P6AMo8SR3jXAwzTuSU6B9R2Y4eqW2yW9VvfUayDN/go-datastore"
|
||
|
|
||
|
context "gx/ipfs/QmZy2y8t9zQH2a1b8q2ZSLKp17ATuJoCNxxyMFG5qFExpt/go-net/context"
|
||
|
)
|
||
|
|
||
|
func TestProviderManager(t *testing.T) {
|
||
|
ctx := context.Background()
|
||
|
mid := peer.ID("testing")
|
||
|
p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
|
||
|
a := key.Key("test")
|
||
|
p.AddProvider(ctx, a, peer.ID("testingprovider"))
|
||
|
resp := p.GetProviders(ctx, a)
|
||
|
if len(resp) != 1 {
|
||
|
t.Fatal("Could not retrieve provider.")
|
||
|
}
|
||
|
p.proc.Close()
|
||
|
}
|
||
|
|
||
|
func TestProvidersDatastore(t *testing.T) {
|
||
|
old := lruCacheSize
|
||
|
lruCacheSize = 10
|
||
|
defer func() { lruCacheSize = old }()
|
||
|
|
||
|
ctx := context.Background()
|
||
|
mid := peer.ID("testing")
|
||
|
p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
|
||
|
defer p.proc.Close()
|
||
|
|
||
|
friend := peer.ID("friend")
|
||
|
var keys []key.Key
|
||
|
for i := 0; i < 100; i++ {
|
||
|
k := key.Key(fmt.Sprint(i))
|
||
|
keys = append(keys, k)
|
||
|
p.AddProvider(ctx, k, friend)
|
||
|
}
|
||
|
|
||
|
for _, k := range keys {
|
||
|
resp := p.GetProviders(ctx, k)
|
||
|
if len(resp) != 1 {
|
||
|
t.Fatal("Could not retrieve provider.")
|
||
|
}
|
||
|
if resp[0] != friend {
|
||
|
t.Fatal("expected provider to be 'friend'")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestProvidersSerialization(t *testing.T) {
|
||
|
dstore := ds.NewMapDatastore()
|
||
|
|
||
|
k := key.Key("my key!")
|
||
|
p := peer.ID("my peer")
|
||
|
pt := time.Now()
|
||
|
|
||
|
err := writeProviderEntry(dstore, k, p, pt)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
pset, err := loadProvSet(dstore, k)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
lt, ok := pset.set[p]
|
||
|
if !ok {
|
||
|
t.Fatal("failed to load set correctly")
|
||
|
}
|
||
|
|
||
|
if pt != lt {
|
||
|
t.Fatal("time wasnt serialized correctly")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestProvidesExpire(t *testing.T) {
|
||
|
pval := ProvideValidity
|
||
|
cleanup := defaultCleanupInterval
|
||
|
ProvideValidity = time.Second / 2
|
||
|
defaultCleanupInterval = time.Second / 2
|
||
|
defer func() {
|
||
|
ProvideValidity = pval
|
||
|
defaultCleanupInterval = cleanup
|
||
|
}()
|
||
|
|
||
|
ctx := context.Background()
|
||
|
mid := peer.ID("testing")
|
||
|
p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
|
||
|
|
||
|
peers := []peer.ID{"a", "b"}
|
||
|
var keys []key.Key
|
||
|
for i := 0; i < 10; i++ {
|
||
|
k := key.Key(i)
|
||
|
keys = append(keys, k)
|
||
|
p.AddProvider(ctx, k, peers[0])
|
||
|
p.AddProvider(ctx, k, peers[1])
|
||
|
}
|
||
|
|
||
|
for i := 0; i < 10; i++ {
|
||
|
out := p.GetProviders(ctx, keys[i])
|
||
|
if len(out) != 2 {
|
||
|
t.Fatal("expected providers to still be there")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
time.Sleep(time.Second)
|
||
|
for i := 0; i < 10; i++ {
|
||
|
out := p.GetProviders(ctx, keys[i])
|
||
|
if len(out) > 2 {
|
||
|
t.Fatal("expected providers to be cleaned up")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if p.providers.Len() != 0 {
|
||
|
t.Fatal("providers map not cleaned up")
|
||
|
}
|
||
|
|
||
|
allprovs, err := p.getAllProvKeys()
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
if len(allprovs) != 0 {
|
||
|
t.Fatal("expected everything to be cleaned out of the datastore")
|
||
|
}
|
||
|
}
|