starting a new testing framework
Jeromy committed
Aug 10, 2014 at 21:40 UTC
0a41abdd1d270a4c1eed14cc782675b971beb858
4 files changed
+117
-68
routing/dht/dht.go
+3
-12
@@ -66,18 +66,9 @@ type listenInfo struct {
66
}
67
68
// NewDHT creates a new DHT object with the given peer as the 'local' host
69
-func NewDHT(p *peer.Peer) (*IpfsDHT, error) {
70
- if p == nil {
71
- return nil, errors.New("nil peer passed to NewDHT()")
72
- }
73
- network := swarm.NewSwarm(p)
74
- err := network.Listen()
75
- if err != nil {
76
- return nil, err
77
- }
78
-
69
+func NewDHT(p *peer.Peer, net swarm.Network) *IpfsDHT {
70
dht := new(IpfsDHT)
80
- dht.network = network
71
+ dht.network = net
72
dht.datastore = ds.NewMapDatastore()
73
dht.self = p
74
dht.listeners = make(map[uint64]*listenInfo)
@@ -86,7 +77,7 @@ func NewDHT(p *peer.Peer) (*IpfsDHT, error) {
77
dht.routes = make([]*kb.RoutingTable, 1)
78
dht.routes[0] = kb.NewRoutingTable(20, kb.ConvertPeerID(p.ID))
79
dht.birth = time.Now()
89
- return dht, nil
80
+ return dht
81
}
82
83
// Start up background goroutines needed by the DHT
routing/dht/dht_test.go
+18
-56
@@ -4,6 +4,7 @@ import (
4
"testing"
5
6
peer "github.com/jbenet/go-ipfs/peer"
7
+ swarm "github.com/jbenet/go-ipfs/swarm"
8
u "github.com/jbenet/go-ipfs/util"
9
ma "github.com/jbenet/go-multiaddr"
10
@@ -31,10 +32,12 @@ func setupDHTS(n int, t *testing.T) ([]*ma.Multiaddr, []*peer.Peer, []*IpfsDHT)
32
33
var dhts []*IpfsDHT
34
for i := 0; i < 4; i++ {
34
- d, err := NewDHT(peers[i])
35
+ net := swarm.NewSwarm(peers[i])
36
+ err := net.Listen()
37
if err != nil {
38
t.Fatal(err)
39
}
40
+ d := NewDHT(peers[i], net)
41
dhts = append(dhts, d)
42
d.Start()
43
}
@@ -61,15 +64,19 @@ func TestPing(t *testing.T) {
64
peer_b.AddAddress(addr_b)
65
peer_b.ID = peer.ID([]byte("peer_b"))
66
64
- dht_a, err := NewDHT(peer_a)
67
+ neta := swarm.NewSwarm(peer_a)
68
+ err = neta.Listen()
69
if err != nil {
70
t.Fatal(err)
71
}
72
+ dht_a := NewDHT(peer_a, neta)
73
69
- dht_b, err := NewDHT(peer_b)
74
+ netb := swarm.NewSwarm(peer_b)
75
+ err = netb.Listen()
76
if err != nil {
77
t.Fatal(err)
78
}
79
+ dht_b := NewDHT(peer_b, netb)
80
81
dht_a.Start()
82
dht_b.Start()
@@ -108,15 +115,19 @@ func TestValueGetSet(t *testing.T) {
115
peer_b.AddAddress(addr_b)
116
peer_b.ID = peer.ID([]byte("peer_b"))
117
111
- dht_a, err := NewDHT(peer_a)
118
+ neta := swarm.NewSwarm(peer_a)
119
+ err = neta.Listen()
120
if err != nil {
121
t.Fatal(err)
122
}
123
+ dht_a := NewDHT(peer_a, neta)
124
116
- dht_b, err := NewDHT(peer_b)
125
+ netb := swarm.NewSwarm(peer_b)
126
+ err = netb.Listen()
127
if err != nil {
128
t.Fatal(err)
129
}
130
+ dht_b := NewDHT(peer_b, netb)
131
132
dht_a.Start()
133
dht_b.Start()
@@ -197,32 +208,7 @@ func TestProvides(t *testing.T) {
208
209
func TestLayeredGet(t *testing.T) {
210
u.Debug = false
200
- var addrs []*ma.Multiaddr
201
- for i := 0; i < 4; i++ {
202
- a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i))
203
- if err != nil {
204
- t.Fatal(err)
205
- }
206
- addrs = append(addrs, a)
207
- }
208
-
209
- var peers []*peer.Peer
210
- for i := 0; i < 4; i++ {
211
- p := new(peer.Peer)
212
- p.AddAddress(addrs[i])
213
- p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i)))
214
- peers = append(peers, p)
215
- }
216
-
217
- var dhts []*IpfsDHT
218
- for i := 0; i < 4; i++ {
219
- d, err := NewDHT(peers[i])
220
- if err != nil {
221
- t.Fatal(err)
222
- }
223
- dhts = append(dhts, d)
224
- d.Start()
225
- }
211
+ addrs,_,dhts := setupDHTS(4, t)
212
213
_, err := dhts[0].Connect(addrs[1])
214
if err != nil {
@@ -267,32 +253,8 @@ func TestLayeredGet(t *testing.T) {
253
254
func TestFindPeer(t *testing.T) {
255
u.Debug = false
270
- var addrs []*ma.Multiaddr
271
- for i := 0; i < 4; i++ {
272
- a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 5000+i))
273
- if err != nil {
274
- t.Fatal(err)
275
- }
276
- addrs = append(addrs, a)
277
- }
278
-
279
- var peers []*peer.Peer
280
- for i := 0; i < 4; i++ {
281
- p := new(peer.Peer)
282
- p.AddAddress(addrs[i])
283
- p.ID = peer.ID([]byte(fmt.Sprintf("peer_%d", i)))
284
- peers = append(peers, p)
285
- }
256
287
- var dhts []*IpfsDHT
288
- for i := 0; i < 4; i++ {
289
- d, err := NewDHT(peers[i])
290
- if err != nil {
291
- t.Fatal(err)
292
- }
293
- dhts = append(dhts, d)
294
- d.Start()
295
- }
257
+ addrs,peers,dhts := setupDHTS(4, t)
258
259
_, err := dhts[0].Connect(addrs[1])
260
if err != nil {
routing/dht/ext_test.go
new
+77
@@ -0,0 +1,77 @@
1
+package dht
2
+
3
+import (
4
+ "testing"
5
+
6
+ peer "github.com/jbenet/go-ipfs/peer"
7
+ u "github.com/jbenet/go-ipfs/util"
8
+ swarm "github.com/jbenet/go-ipfs/swarm"
9
+ //ma "github.com/jbenet/go-multiaddr"
10
+
11
+ "fmt"
12
+ "time"
13
+)
14
+
15
+// fauxNet is a standin for a swarm.Network in order to more easily recreate
16
+// different testing scenarios
17
+type fauxNet struct {
18
+ Chan *swarm.Chan
19
+
20
+ swarm.Network
21
+
22
+ handlers []mesHandleFunc
23
+}
24
+
25
+type mesHandleFunc func(*swarm.Message) *swarm.Message
26
+
27
+func newFauxNet() *fauxNet {
28
+ fn := new(fauxNet)
29
+ fn.Chan = swarm.NewChan(8)
30
+
31
+ return fn
32
+}
33
+
34
+func (f *fauxNet) Listen() error {
35
+ go func() {
36
+ for {
37
+ select {
38
+ case in := <-f.Chan.Outgoing:
39
+ for _,h := range f.handlers {
40
+ reply := h(in)
41
+ if reply != nil {
42
+ f.Chan.Incoming <- reply
43
+ break
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }()
49
+ return nil
50
+}
51
+
52
+func (f *fauxNet) AddHandler(fn func(*swarm.Message) *swarm.Message) {
53
+ f.handlers = append(f.handlers, fn)
54
+}
55
+
56
+func (f *fauxNet) Send(mes *swarm.Message) {
57
+
58
+}
59
+
60
+func TestGetFailure(t *testing.T) {
61
+ fn := newFauxNet()
62
+ fn.Listen()
63
+
64
+ local := new(peer.Peer)
65
+ local.ID = peer.ID([]byte("test_peer"))
66
+
67
+ d := NewDHT(local, fn)
68
+
69
+ d.Start()
70
+
71
+ b, err := d.GetValue(u.Key("test"), time.Second)
72
+ if err != nil {
73
+ t.Fatal(err)
74
+ }
75
+
76
+ fmt.Println(b)
77
+}
swarm/interface.go
new
+19
@@ -0,0 +1,19 @@
1
+package swarm
2
+
3
+import (
4
+ peer "github.com/jbenet/go-ipfs/peer"
5
+ u "github.com/jbenet/go-ipfs/util"
6
+
7
+ ma "github.com/jbenet/go-multiaddr"
8
+)
9
+
10
+type Network interface {
11
+ Send(*Message)
12
+ Error(error)
13
+ Find(u.Key) *peer.Peer
14
+ Listen() error
15
+ Connect(*ma.Multiaddr) (*peer.Peer, error)
16
+ GetChan() *Chan
17
+ Close()
18
+ Drop(*peer.Peer) error
19
+}