From 29322a24da1a37e9daaac7a2f1f3ff4b68bb9c57 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet <juan@benet.ai> Date: Wed, 17 Sep 2014 10:30:38 -0700 Subject: [PATCH] tests compile --- routing/dht/dht_test.go | 81 +++++++--------- routing/dht/ext_test.go | 205 +++++++++++++++++++++------------------- 2 files changed, 145 insertions(+), 141 deletions(-) diff --git a/routing/dht/dht_test.go b/routing/dht/dht_test.go index f021835e..70fbb2ba 100644 --- a/routing/dht/dht_test.go +++ b/routing/dht/dht_test.go @@ -3,11 +3,16 @@ package dht import ( "testing" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" + ci "github.com/jbenet/go-ipfs/crypto" spipe "github.com/jbenet/go-ipfs/crypto/spipe" - swarm "github.com/jbenet/go-ipfs/net/swarm" + inet "github.com/jbenet/go-ipfs/net" + mux "github.com/jbenet/go-ipfs/net/mux" + netservice "github.com/jbenet/go-ipfs/net/service" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -16,6 +21,30 @@ import ( "time" ) +func setupDHT(t *testing.T, p *peer.Peer) *IpfsDHT { + ctx := context.TODO() + + peerstore := peer.NewPeerstore() + + ctx, _ = context.WithCancel(ctx) + dhts := netservice.NewService(nil) // nil handler for now, need to patch it + if err := dhts.Start(ctx); err != nil { + t.Fatal(err) + } + + net, err := inet.NewIpfsNetwork(context.TODO(), p, &mux.ProtocolMap{ + mux.ProtocolID_Routing: dhts, + }) + if err != nil { + t.Fatal(err) + } + + d := NewDHT(p, peerstore, net, dhts, ds.NewMapDatastore()) + dhts.Handler = d + d.Start() + return d +} + func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) { var addrs []*ma.Multiaddr for i := 0; i < 4; i++ { @@ -46,14 +75,7 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT) var dhts []*IpfsDHT for i := 0; i < 4; i++ { - net := swarm.NewSwarm(peers[i]) - err := net.Listen() - if err != nil { - t.Fatal(err) - } - d := NewDHT(peers[i], net, ds.NewMapDatastore()) - dhts = append(dhts, d) - d.Start() + dhts[i] = setupDHT(t, peers[i]) } return addrs, peers, dhts @@ -91,19 +113,8 @@ func TestPing(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - neta := swarm.NewSwarm(peerA) - err = neta.Listen() - if err != nil { - t.Fatal(err) - } - dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) - - netb := swarm.NewSwarm(peerB) - err = netb.Listen() - if err != nil { - t.Fatal(err) - } - dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) dhtA.Start() dhtB.Start() @@ -136,36 +147,14 @@ func TestValueGetSet(t *testing.T) { peerA := makePeer(addrA) peerB := makePeer(addrB) - neta := swarm.NewSwarm(peerA) - err = neta.Listen() - if err != nil { - t.Fatal(err) - } - dhtA := NewDHT(peerA, neta, ds.NewMapDatastore()) - - netb := swarm.NewSwarm(peerB) - err = netb.Listen() - if err != nil { - t.Fatal(err) - } - dhtB := NewDHT(peerB, netb, ds.NewMapDatastore()) + dhtA := setupDHT(t, peerA) + dhtB := setupDHT(t, peerB) dhtA.Start() dhtB.Start() defer dhtA.Halt() defer dhtB.Halt() - errsa := dhtA.network.GetErrChan() - errsb := dhtB.network.GetErrChan() - go func() { - select { - case err := <-errsa: - t.Fatal(err) - case err := <-errsb: - t.Fatal(err) - } - }() - _, err = dhtA.Connect(addrB) if err != nil { t.Fatal(err) diff --git a/routing/dht/ext_test.go b/routing/dht/ext_test.go index fe98443a..64abb964 100644 --- a/routing/dht/ext_test.go +++ b/routing/dht/ext_test.go @@ -5,11 +5,13 @@ import ( crand "crypto/rand" + context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go" ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" - swarm "github.com/jbenet/go-ipfs/net/swarm" + msg "github.com/jbenet/go-ipfs/net/message" + mux "github.com/jbenet/go-ipfs/net/mux" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -18,79 +20,84 @@ import ( // fauxNet is a standin for a swarm.Network in order to more easily recreate // different testing scenarios -type fauxNet struct { - Chan *swarm.Chan +type fauxSender struct { handlers []mesHandleFunc - - swarm.Network } -// mesHandleFunc is a function that takes in outgoing messages -// and can respond to them, simulating other peers on the network. -// returning nil will chose not to respond and pass the message onto the -// next registered handler -type mesHandleFunc func(*swarm.Message) *swarm.Message +func (f *fauxSender) SendRequest(ctx context.Context, m msg.NetMessage) (msg.NetMessage, error) { -func newFauxNet() *fauxNet { - fn := new(fauxNet) - fn.Chan = swarm.NewChan(8) + for _, h := range f.handlers { + reply := h(m) + if reply != nil { + return reply, nil + } + } - return fn + return nil, nil } -// Instead of 'Listening' Start up a goroutine that will check -// all outgoing messages against registered message handlers, -// and reply if needed -func (f *fauxNet) Listen() error { - go func() { - for { - select { - case in := <-f.Chan.Outgoing: - for _, h := range f.handlers { - reply := h(in) - if reply != nil { - f.Chan.Incoming <- reply - break - } - } - } +func (f *fauxSender) SendMessage(ctx context.Context, m msg.NetMessage) error { + for _, h := range f.handlers { + reply := h(m) + if reply != nil { + return nil } - }() + } return nil } -func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) { - f.handlers = append(f.handlers, fn) +// fauxNet is a standin for a swarm.Network in order to more easily recreate +// different testing scenarios +type fauxNet struct { + handlers []mesHandleFunc } -func (f *fauxNet) Send(mes *swarm.Message) { - f.Chan.Outgoing <- mes +// mesHandleFunc is a function that takes in outgoing messages +// and can respond to them, simulating other peers on the network. +// returning nil will chose not to respond and pass the message onto the +// next registered handler +type mesHandleFunc func(msg.NetMessage) msg.NetMessage + +func (f *fauxNet) AddHandler(fn func(msg.NetMessage) msg.NetMessage) { + f.handlers = append(f.handlers, fn) } -func (f *fauxNet) GetErrChan() chan error { - return f.Chan.Errors +// DialPeer attempts to establish a connection to a given peer +func (f *fauxNet) DialPeer(*peer.Peer) error { + return nil } -func (f *fauxNet) GetChannel(t swarm.PBWrapper_MessageType) *swarm.Chan { - return f.Chan +// ClosePeer connection to peer +func (f *fauxNet) ClosePeer(*peer.Peer) error { + return nil } -func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) { - return nil, nil +// IsConnected returns whether a connection to given peer exists. +func (f *fauxNet) IsConnected(*peer.Peer) (bool, error) { + return true, nil } -func (f *fauxNet) GetConnection(id peer.ID, addr *ma.Multiaddr) (*peer.Peer, error) { - return &peer.Peer{ID: id, Addresses: []*ma.Multiaddr{addr}}, nil +// GetProtocols returns the protocols registered in the network. +func (f *fauxNet) GetProtocols() *mux.ProtocolMap { return nil } + +// SendMessage sends given Message out +func (f *fauxNet) SendMessage(msg.NetMessage) error { + return nil } +// Close terminates all network operation +func (f *fauxNet) Close() error { return nil } + func TestGetFailures(t *testing.T) { - fn := newFauxNet() - fn.Listen() + ctx := context.Background() + fn := &fauxNet{} + fs := &fauxSender{} + peerstore := peer.NewPeerstore() local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) other := &peer.Peer{ID: peer.ID("other_peer")} @@ -109,20 +116,18 @@ func TestGetFailures(t *testing.T) { } // Reply with failures to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, + resp := &Message{ + Type: pmes.Type, } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + m, err := msg.FromObject(mes.Peer(), resp) + return m }) // This one should fail with NotFound @@ -137,27 +142,34 @@ func TestGetFailures(t *testing.T) { success := make(chan struct{}) fn.handlers = nil - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - resp := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, resp) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + resp := new(Message) + err := proto.Unmarshal(mes.Data(), resp) if err != nil { t.Fatal(err) } - if resp.GetSuccess() { - t.Fatal("Get returned success when it shouldnt have.") - } success <- struct{}{} return nil }) // Now we test this DHT's handleGetValue failure + typ := Message_GET_VALUE + str := "hello" req := Message{ - Type: PBDHTMessage_GET_VALUE, - Key: "hello", - ID: swarm.GenerateMessageID(), + Type: &typ, + Key: &str, Value: []byte{0}, } - fn.Chan.Incoming <- swarm.NewMessage(other, req.ToProtobuf()) + + mes, err := msg.FromObject(other, &req) + if err != nil { + t.Error(err) + } + + mes, err = fs.SendRequest(ctx, mes) + if err != nil { + t.Error(err) + } <-success } @@ -172,13 +184,14 @@ func _randPeer() *peer.Peer { } func TestNotFound(t *testing.T) { - fn := newFauxNet() - fn.Listen() + fn := &fauxNet{} + fs := &fauxSender{} local := new(peer.Peer) local.ID = peer.ID("test_peer") + peerstore := peer.NewPeerstore() - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer @@ -188,26 +201,27 @@ func TestNotFound(t *testing.T) { } // Reply with random peers to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case PBDHTMessage_GET_VALUE: - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, - } + case Message_GET_VALUE: + resp := &Message{Type: pmes.Type} + peers := []*peer.Peer{} for i := 0; i < 7; i++ { - resp.Peers = append(resp.Peers, _randPeer()) + peers = append(peers, _randPeer()) + } + resp.CloserPeers = peersToPBPeers(peers) + mes, err := msg.FromObject(mes.Peer(), resp) + if err != nil { + t.Error(err) } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + return mes default: panic("Shouldnt recieve this.") } @@ -233,13 +247,13 @@ func TestNotFound(t *testing.T) { // a GET rpc and nobody has the value func TestLessThanKResponses(t *testing.T) { u.Debug = false - fn := newFauxNet() - fn.Listen() - + fn := &fauxNet{} + fs := &fauxSender{} + peerstore := peer.NewPeerstore() local := new(peer.Peer) local.ID = peer.ID("test_peer") - d := NewDHT(local, fn, ds.NewMapDatastore()) + d := NewDHT(local, peerstore, fn, fs, ds.NewMapDatastore()) d.Start() var ps []*peer.Peer @@ -250,24 +264,25 @@ func TestLessThanKResponses(t *testing.T) { other := _randPeer() // Reply with random peers to every message - fn.AddHandler(func(mes *swarm.Message) *swarm.Message { - pmes := new(PBDHTMessage) - err := proto.Unmarshal(mes.Data, pmes) + fn.AddHandler(func(mes msg.NetMessage) msg.NetMessage { + pmes := new(Message) + err := proto.Unmarshal(mes.Data(), pmes) if err != nil { t.Fatal(err) } switch pmes.GetType() { - case PBDHTMessage_GET_VALUE: - resp := Message{ - Type: pmes.GetType(), - ID: pmes.GetId(), - Response: true, - Success: false, - Peers: []*peer.Peer{other}, + case Message_GET_VALUE: + resp := &Message{ + Type: pmes.Type, + CloserPeers: peersToPBPeers([]*peer.Peer{other}), } - return swarm.NewMessage(mes.Peer, resp.ToProtobuf()) + mes, err := msg.FromObject(mes.Peer(), resp) + if err != nil { + t.Error(err) + } + return mes default: panic("Shouldnt recieve this.") } -- GitLab