2014-08-10 21:40:17 -07:00
|
|
|
package dht
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
"code.google.com/p/goprotobuf/proto"
|
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
peer "github.com/jbenet/go-ipfs/peer"
|
|
|
|
swarm "github.com/jbenet/go-ipfs/swarm"
|
2014-08-11 09:06:20 -07:00
|
|
|
u "github.com/jbenet/go-ipfs/util"
|
|
|
|
ma "github.com/jbenet/go-multiaddr"
|
2014-08-10 21:40:17 -07:00
|
|
|
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// fauxNet is a standin for a swarm.Network in order to more easily recreate
|
|
|
|
// different testing scenarios
|
|
|
|
type fauxNet struct {
|
|
|
|
Chan *swarm.Chan
|
|
|
|
|
|
|
|
swarm.Network
|
|
|
|
|
|
|
|
handlers []mesHandleFunc
|
|
|
|
}
|
|
|
|
|
|
|
|
type mesHandleFunc func(*swarm.Message) *swarm.Message
|
|
|
|
|
|
|
|
func newFauxNet() *fauxNet {
|
|
|
|
fn := new(fauxNet)
|
|
|
|
fn.Chan = swarm.NewChan(8)
|
|
|
|
|
|
|
|
return fn
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fauxNet) Listen() error {
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case in := <-f.Chan.Outgoing:
|
2014-08-11 09:06:20 -07:00
|
|
|
for _, h := range f.handlers {
|
2014-08-10 21:40:17 -07:00
|
|
|
reply := h(in)
|
|
|
|
if reply != nil {
|
|
|
|
f.Chan.Incoming <- reply
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) {
|
|
|
|
f.handlers = append(f.handlers, fn)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fauxNet) Send(mes *swarm.Message) {
|
2014-08-11 09:06:20 -07:00
|
|
|
f.Chan.Outgoing <- mes
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
func (f *fauxNet) GetChan() *swarm.Chan {
|
|
|
|
return f.Chan
|
2014-08-10 21:40:17 -07:00
|
|
|
}
|
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) {
|
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestGetFailures(t *testing.T) {
|
2014-08-10 21:40:17 -07:00
|
|
|
fn := newFauxNet()
|
|
|
|
fn.Listen()
|
|
|
|
|
|
|
|
local := new(peer.Peer)
|
2014-08-11 09:06:20 -07:00
|
|
|
local.ID = peer.ID("test_peer")
|
2014-08-10 21:40:17 -07:00
|
|
|
|
|
|
|
d := NewDHT(local, fn)
|
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
other := &peer.Peer{ID: peer.ID("other_peer")}
|
|
|
|
|
2014-08-10 21:40:17 -07:00
|
|
|
d.Start()
|
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
d.Update(other)
|
|
|
|
|
|
|
|
// This one should time out
|
|
|
|
_, err := d.GetValue(u.Key("test"), time.Millisecond*5)
|
2014-08-10 21:40:17 -07:00
|
|
|
if err != nil {
|
2014-08-11 09:06:20 -07:00
|
|
|
nerr, ok := err.(*u.IpfsError)
|
|
|
|
if !ok {
|
|
|
|
t.Fatal("Got different error than we expected.")
|
|
|
|
}
|
|
|
|
if nerr.Inner != u.ErrTimeout {
|
|
|
|
t.Fatal("Got different error than we expected.")
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
t.Fatal("Did not get expected error!")
|
2014-08-10 21:40:17 -07:00
|
|
|
}
|
|
|
|
|
2014-08-11 09:06:20 -07:00
|
|
|
fn.AddHandler(func(mes *swarm.Message) *swarm.Message {
|
|
|
|
pmes := new(PBDHTMessage)
|
|
|
|
err := proto.Unmarshal(mes.Data, pmes)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
resp := DHTMessage{
|
|
|
|
Type: pmes.GetType(),
|
|
|
|
Id: pmes.GetId(),
|
|
|
|
Response: true,
|
|
|
|
Success: false,
|
|
|
|
}
|
|
|
|
return swarm.NewMessage(mes.Peer, resp.ToProtobuf())
|
|
|
|
})
|
|
|
|
|
|
|
|
// This one should fail with NotFound
|
|
|
|
_, err = d.GetValue(u.Key("test"), time.Millisecond*5)
|
|
|
|
if err != nil {
|
|
|
|
if err != u.ErrNotFound {
|
|
|
|
t.Fatal("Expected ErrNotFound, got: %s", err)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
t.Fatal("expected error, got none.")
|
|
|
|
}
|
2014-08-10 21:40:17 -07:00
|
|
|
}
|