Skip to content

Commit

Permalink
namesys/pubsub: update test to use extant mock routing
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: vyzo <vyzo@hackzen.org>
  • Loading branch information
vyzo committed Jul 10, 2017
1 parent c20a099 commit dbfbf81
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 79 deletions.
110 changes: 31 additions & 79 deletions namesys/pubsub_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import (
"time"

path "github.com/ipfs/go-ipfs/path"
mockrouting "github.com/ipfs/go-ipfs/routing/mock"
testutil "github.com/ipfs/go-ipfs/thirdparty/testutil"

ci "gx/ipfs/QmP1DfoUjiWH2ZBo1PBH6FupdBucbDepx3HpWmEY6JMUpY/go-libp2p-crypto"
routing "gx/ipfs/QmP1wMAqk6aZYRZirbaAwmrNeqFRgQrwBt3orUtvSa1UYD/go-libp2p-routing"
floodsub "gx/ipfs/QmUpeULWfmtsgCnfuRN3BHsfhHvBxNphoYh4La4CMxGt2Z/floodsub"
p2phost "gx/ipfs/QmUywuGNZoUKV8B9iyvup9bPkLiMrhTsyVMkeSXW5VxAfC/go-libp2p-host"
ds "gx/ipfs/QmVSase1JP7cq9QkPT46oNwdp9pT6kBkG3oqS14y3QcZjG/go-datastore"
pstore "gx/ipfs/QmXZSd1qR5BxZkPyuwfT5jpqQFScZccoZvDneXsKzCNHWX/go-libp2p-peerstore"
netutil "gx/ipfs/Qma2j8dYePrvN5DoNgwh1uAuu3FFtEtrUQFmr737ws8nCp/go-libp2p-netutil"
cid "gx/ipfs/Qma4RJSuh7mMeJQYCqMbKzekn6EwBo7HEs5AQYjVRMQATB/go-cid"
bhost "gx/ipfs/Qma4Xhhqtr9tpV814eNjbLHzjuDaRjs96XLcZPJiR742ZV/go-libp2p-blankhost"
peer "gx/ipfs/QmdS9KpbDyPrieswibZhkod1oXqRwZJrUPzxCofAMWpFGq/go-libp2p-peer"
)
Expand All @@ -36,13 +36,19 @@ func newNetHosts(ctx context.Context, t *testing.T, n int) []p2phost.Host {
return out
}

type mockDHT struct {
// PubKeyFetcher implementation with a global key store
type mockKeyStore struct {
keys map[peer.ID]ci.PubKey
prov map[string][]pstore.PeerInfo
mx sync.Mutex
}

func (m *mockDHT) getPubKey(id peer.ID) (ci.PubKey, error) {
func (m *mockKeyStore) addPubKey(id peer.ID, pkey ci.PubKey) {
m.mx.Lock()
defer m.mx.Unlock()
m.keys[id] = pkey
}

func (m *mockKeyStore) getPubKey(id peer.ID) (ci.PubKey, error) {
m.mx.Lock()
defer m.mx.Unlock()
pkey, ok := m.keys[id]
Expand All @@ -53,86 +59,32 @@ func (m *mockDHT) getPubKey(id peer.ID) (ci.PubKey, error) {
return nil, routing.ErrNotFound
}

func (m *mockDHT) addPubKey(id peer.ID, pkey ci.PubKey) {
m.mx.Lock()
defer m.mx.Unlock()
m.keys[id] = pkey
}

func (m *mockDHT) getProviders(cid *cid.Cid) []pstore.PeerInfo {
m.mx.Lock()
defer m.mx.Unlock()
return m.prov[cid.String()]
}

func (m *mockDHT) addProvider(cid *cid.Cid, pi pstore.PeerInfo) {
m.mx.Lock()
defer m.mx.Unlock()
key := cid.String()
m.prov[key] = append(m.prov[key], pi)
func (m *mockKeyStore) GetPublicKey(ctx context.Context, id peer.ID) (ci.PubKey, error) {
return m.getPubKey(id)
}

func newMockDHT() *mockDHT {
return &mockDHT{
func newMockKeyStore() *mockKeyStore {
return &mockKeyStore{
keys: make(map[peer.ID]ci.PubKey),
prov: make(map[string][]pstore.PeerInfo),
}
}

type mockRouting struct {
pi pstore.PeerInfo
dht *mockDHT
}

func (m *mockRouting) Provide(ctx context.Context, cid *cid.Cid, announce bool) error {
m.dht.addProvider(cid, m.pi)
return nil
}

func (m *mockRouting) FindProvidersAsync(ctx context.Context, cid *cid.Cid, count int) <-chan pstore.PeerInfo {
ch := make(chan pstore.PeerInfo)
go func() {
defer close(ch)
k := 0
loop:
for _, pi := range m.dht.getProviders(cid) {
if k < count {
select {
case ch <- pi:
k++
case <-ctx.Done():
break loop
}
} else {
break loop
}
}
}()

return ch
}

func (m *mockRouting) GetPublicKey(ctx context.Context, id peer.ID) (ci.PubKey, error) {
return m.dht.getPubKey(id)
}

func newMockRouting(dht *mockDHT, host p2phost.Host) *mockRouting {
// mock routing
func newMockRouting(ms mockrouting.Server, ks *mockKeyStore, host p2phost.Host) routing.ContentRouting {
id := host.ID()

privk := host.Peerstore().PrivKey(id)
pubk := host.Peerstore().PubKey(id)
dht.addPubKey(id, pubk)

pi := host.Peerstore().PeerInfo(id)
return &mockRouting{
pi: pi,
dht: dht,
}

ks.addPubKey(id, pubk)
return ms.Client(testutil.NewIdentity(id, pi.Addrs[0], privk, pubk))
}

func newMockRoutingForHosts(dht *mockDHT, hosts []p2phost.Host) []*mockRouting {
rs := make([]*mockRouting, len(hosts))
func newMockRoutingForHosts(ms mockrouting.Server, ks *mockKeyStore, hosts []p2phost.Host) []routing.ContentRouting {
rs := make([]routing.ContentRouting, len(hosts))
for i := 0; i < len(hosts); i++ {
rs[i] = newMockRouting(dht, hosts[i])
rs[i] = newMockRouting(ms, ks, hosts[i])
}
return rs
}
Expand All @@ -141,20 +93,21 @@ func TestPubsubPublishResolve(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

dht := newMockDHT()
ms := mockrouting.NewServer()
ks := newMockKeyStore()

pubhost := newNetHost(ctx, t)
pubmr := newMockRouting(dht, pubhost)
pubmr := newMockRouting(ms, ks, pubhost)
pub := NewPubsubPublisher(ctx, ds.NewMapDatastore(), pubhost, pubmr, floodsub.NewFloodSub(ctx, pubhost))
privk := pubhost.Peerstore().PrivKey(pubhost.ID())

name := "/ipns/" + pubhost.ID().Pretty()

reshosts := newNetHosts(ctx, t, 20)
resmrs := newMockRoutingForHosts(dht, reshosts)
resmrs := newMockRoutingForHosts(ms, ks, reshosts)
res := make([]Resolver, len(reshosts))
for i := 0; i < len(res); i++ {
res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], resmrs[i], floodsub.NewFloodSub(ctx, reshosts[i]))
res[i] = NewPubsubResolver(ctx, reshosts[i], resmrs[i], ks, floodsub.NewFloodSub(ctx, reshosts[i]))
}

time.Sleep(time.Millisecond * 100)
Expand All @@ -171,7 +124,7 @@ func TestPubsubPublishResolve(t *testing.T) {
t.Fatal(err)
}

time.Sleep(time.Second * 1)
time.Sleep(time.Second * 3)
for i := 0; i < len(res); i++ {
checkResolve(ctx, t, res[i], name, val)
}
Expand All @@ -182,11 +135,10 @@ func TestPubsubPublishResolve(t *testing.T) {
t.Fatal(err)
}

time.Sleep(time.Second * 1)
time.Sleep(time.Second * 3)
for i := 0; i < len(res); i++ {
checkResolve(ctx, t, res[i], name, val)
}

}

func checkResolveNotFound(ctx context.Context, t *testing.T, resolver Resolver, name string) {
Expand Down
4 changes: 4 additions & 0 deletions thirdparty/testutil/identity.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,7 @@ func (p *identity) PrivateKey() ci.PrivKey {
func (p *identity) PublicKey() ci.PubKey {
return p.PubKey
}

func NewIdentity(ID peer.ID, addr ma.Multiaddr, privk ci.PrivKey, pubk ci.PubKey) Identity {
return &identity{PeerNetParams{ID: ID, Addr: addr, PrivKey: privk, PubKey: pubk}}
}

0 comments on commit dbfbf81

Please sign in to comment.