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
+}