@cryptotaxi247 / kubo / commits / c9c942091

add some more tests in

Jeromy committed Aug 19, 2014 at 19:14 UTC c9c94209129bafbad19b8047b5f97e1f33996946
4 files changed +130 -16
routing/dht/Message.go
+10 -5
@@ -1,6 +1,7 @@
1 package dht
2
3 import (
4 + "code.google.com/p/goprotobuf/proto"
5 peer "github.com/jbenet/go-ipfs/peer"
6 )
7
@@ -17,12 +18,16 @@ type Message struct {
18
19 func peerInfo(p *peer.Peer) *PBDHTMessage_PBPeer {
20 pbp := new(PBDHTMessage_PBPeer)
20 - addr, err := p.Addresses[0].String()
21 - if err != nil {
22 - //Temp: what situations could cause this?
23 - panic(err)
21 + if len(p.Addresses) == 0 || p.Addresses[0] == nil {
22 + pbp.Addr = proto.String("")
23 + } else {
24 + addr, err := p.Addresses[0].String()
25 + if err != nil {
26 + //Temp: what situations could cause this?
27 + panic(err)
28 + }
29 + pbp.Addr = &addr
30 }
25 - pbp.Addr = &addr
31 pid := string(p.ID)
32 pbp.Id = &pid
33 return pbp
routing/dht/dht.go
+11 -11
@@ -87,7 +87,7 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) {
87 // NOTE: this should be done better...
88 err = dht.Ping(npeer, time.Second*2)
89 if err != nil {
90 - return nil, errors.New("failed to ping newly connected peer")
90 + return nil, errors.New("failed to ping newly connected peer\n")
91 }
92
93 dht.Update(npeer)
@@ -98,14 +98,14 @@ func (dht *IpfsDHT) Connect(addr *ma.Multiaddr) (*peer.Peer, error) {
98 // Read in all messages from swarm and handle them appropriately
99 // NOTE: this function is just a quick sketch
100 func (dht *IpfsDHT) handleMessages() {
101 - u.DOut("Begin message handling routine")
101 + u.DOut("Begin message handling routine\n")
102
103 ch := dht.network.GetChan()
104 for {
105 select {
106 case mes, ok := <-ch.Incoming:
107 if !ok {
108 - u.DOut("handleMessages closing, bad recv on incoming")
108 + u.DOut("handleMessages closing, bad recv on incoming\n")
109 return
110 }
111 pmes := new(PBDHTMessage)
@@ -178,7 +178,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) {
178 }
179 iVal, err := dht.datastore.Get(dskey)
180 if err == nil {
181 - u.DOut("handleGetValue success!")
181 + u.DOut("handleGetValue success!\n")
182 resp.Success = true
183 resp.Value = iVal.([]byte)
184 } else if err == ds.ErrNotFound {
@@ -195,7 +195,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) {
195 level := 0
196 if len(pmes.GetValue()) < 1 {
197 // TODO: maybe return an error? Defaulting isnt a good idea IMO
198 - u.PErr("handleGetValue: no routing level specified, assuming 0")
198 + u.PErr("handleGetValue: no routing level specified, assuming 0\n")
199 } else {
200 level = int(pmes.GetValue()[0]) // Using value field to specify cluster level
201 }
@@ -204,14 +204,14 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) {
204 closer := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey())))
205
206 if closer.ID.Equal(dht.self.ID) {
207 - u.DOut("Attempted to return self! this shouldnt happen...")
207 + u.DOut("Attempted to return self! this shouldnt happen...\n")
208 resp.Peers = nil
209 goto out
210 }
211 // If this peer is closer than the one from the table, return nil
212 if kb.Closer(dht.self.ID, closer.ID, u.Key(pmes.GetKey())) {
213 resp.Peers = nil
214 - u.DOut("handleGetValue could not find a closer node than myself.")
214 + u.DOut("handleGetValue could not find a closer node than myself.\n")
215 } else {
216 u.DOut("handleGetValue returning a closer peer: '%s'\n", closer.ID.Pretty())
217 resp.Peers = []*peer.Peer{closer}
@@ -263,12 +263,12 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) {
263 u.DOut("handleFindPeer: searching for '%s'\n", peer.ID(pmes.GetKey()).Pretty())
264 closest := dht.routingTables[level].NearestPeer(kb.ConvertKey(u.Key(pmes.GetKey())))
265 if closest == nil {
266 - u.PErr("handleFindPeer: could not find anything.")
266 + u.PErr("handleFindPeer: could not find anything.\n")
267 return
268 }
269
270 if len(closest.Addresses) == 0 {
271 - u.PErr("handleFindPeer: no addresses for connected peer...")
271 + u.PErr("handleFindPeer: no addresses for connected peer...\n")
272 return
273 }
274
@@ -438,7 +438,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio
438 return nil, u.ErrTimeout
439 case resp, ok := <-responseChan:
440 if !ok {
441 - u.PErr("response channel closed before timeout, please investigate.")
441 + u.PErr("response channel closed before timeout, please investigate.\n")
442 return nil, u.ErrTimeout
443 }
444 roundtrip := time.Since(t)
@@ -587,7 +587,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time
587 dht.listener.Unlisten(pmes.ID)
588 return nil, u.ErrTimeout
589 case resp := <-listenChan:
590 - u.DOut("FindProviders: got response.")
590 + u.DOut("FindProviders: got response.\n")
591 pmesOut := new(PBDHTMessage)
592 err := proto.Unmarshal(resp.Data, pmesOut)
593 if err != nil {
routing/dht/ext_test.go
+76
@@ -3,6 +3,8 @@ package dht
3 import (
4 "testing"
5
6 + crand "crypto/rand"
7 +
8 "code.google.com/p/goprotobuf/proto"
9
10 peer "github.com/jbenet/go-ipfs/peer"
@@ -72,6 +74,10 @@ func (f *fauxNet) Connect(addr *ma.Multiaddr) (*peer.Peer, error) {
74 return nil, nil
75 }
76
77 +func (f *fauxNet) GetConnection(id peer.ID, addr *ma.Multiaddr) (*peer.Peer, error) {
78 + return &peer.Peer{ID: id, Addresses: []*ma.Multiaddr{addr}}, nil
79 +}
80 +
81 func TestGetFailures(t *testing.T) {
82 fn := newFauxNet()
83 fn.Listen()
@@ -150,3 +156,73 @@ func TestGetFailures(t *testing.T) {
156
157 <-success
158 }
159 +
160 +// TODO: Maybe put these in some sort of "ipfs_testutil" package
161 +func _randPeer() *peer.Peer {
162 + p := new(peer.Peer)
163 + p.ID = make(peer.ID, 16)
164 + p.Addresses = []*ma.Multiaddr{nil}
165 + crand.Read(p.ID)
166 + return p
167 +}
168 +
169 +func TestNotFound(t *testing.T) {
170 + u.Debug = true
171 + fn := newFauxNet()
172 + fn.Listen()
173 +
174 + local := new(peer.Peer)
175 + local.ID = peer.ID("test_peer")
176 +
177 + d := NewDHT(local, fn)
178 + d.Start()
179 +
180 + var ps []*peer.Peer
181 + for i := 0; i < 5; i++ {
182 + ps = append(ps, _randPeer())
183 + d.Update(ps[i])
184 + }
185 +
186 + // Reply with random peers to every message
187 + fn.AddHandler(func(mes *swarm.Message) *swarm.Message {
188 + t.Log("Handling message...")
189 + pmes := new(PBDHTMessage)
190 + err := proto.Unmarshal(mes.Data, pmes)
191 + if err != nil {
192 + t.Fatal(err)
193 + }
194 +
195 + switch pmes.GetType() {
196 + case PBDHTMessage_GET_VALUE:
197 + resp := Message{
198 + Type: pmes.GetType(),
199 + ID: pmes.GetId(),
200 + Response: true,
201 + Success: false,
202 + }
203 +
204 + for i := 0; i < 7; i++ {
205 + resp.Peers = append(resp.Peers, _randPeer())
206 + }
207 + return swarm.NewMessage(mes.Peer, resp.ToProtobuf())
208 + default:
209 + panic("Shouldnt recieve this.")
210 + }
211 +
212 + })
213 +
214 + _, err := d.GetValue(u.Key("hello"), time.Second*30)
215 + if err != nil {
216 + switch err {
217 + case u.ErrNotFound:
218 + t.Fail()
219 + //Success!
220 + return
221 + case u.ErrTimeout:
222 + t.Fatal("Should not have gotten timeout!")
223 + default:
224 + t.Fatalf("Got unexpected error: %s", err)
225 + }
226 + }
227 + t.Fatal("Expected to recieve an error.")
228 +}
routing/dht/mes_listener_test.go new
+33
@@ -0,0 +1,33 @@
1 +package dht
2 +
3 +import (
4 + "testing"
5 + "time"
6 +
7 + "github.com/jbenet/go-ipfs/peer"
8 + "github.com/jbenet/go-ipfs/swarm"
9 +)
10 +
11 +// Ensure that the Message Listeners basic functionality works
12 +func TestMesListenerBasic(t *testing.T) {
13 + ml := newMesListener()
14 + a := GenerateMessageID()
15 + resp := ml.Listen(a, 1, time.Minute)
16 +
17 + pmes := new(swarm.PBWrapper)
18 + pmes.Message = []byte("Hello")
19 + pmes.Type = new(swarm.PBWrapper_MessageType)
20 + mes := swarm.NewMessage(new(peer.Peer), pmes)
21 +
22 + go ml.Respond(a, mes)
23 +
24 + del := time.After(time.Millisecond * 10)
25 + select {
26 + case get := <-resp:
27 + if string(get.Data) != string(mes.Data) {
28 + t.Fatal("Something got really messed up")
29 + }
30 + case <-del:
31 + t.Fatal("Waiting on message response timed out.")
32 + }
33 +}