2
3
import (
4
"bytes"
5
- "math/rand"
5
"sort"
6
"testing"
7
+ "time"
8
9
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
10
11
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
12
+ dssync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
13
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
14
14
- ci "github.com/jbenet/go-ipfs/crypto"
15
+ // ci "github.com/jbenet/go-ipfs/crypto"
16
inet "github.com/jbenet/go-ipfs/net"
17
peer "github.com/jbenet/go-ipfs/peer"
18
u "github.com/jbenet/go-ipfs/util"
19
testutil "github.com/jbenet/go-ipfs/util/testutil"
19
-
20
- "fmt"
21
- "time"
20
)
21
24
-func randMultiaddr(t *testing.T) ma.Multiaddr {
22
+func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT {
23
26
- s := fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+rand.Intn(40000))
27
- a, err := ma.NewMultiaddr(s)
24
+ sk, pk, err := testutil.RandKeyPair(512)
25
+ if err != nil {
26
+ t.Fatal(err)
27
+ }
28
+
29
+ p, err := peer.IDFromPublicKey(pk)
30
if err != nil {
31
t.Fatal(err)
32
}
31
- return a
32
-}
33
34
-func setupDHT(ctx context.Context, t *testing.T, p peer.Peer) *IpfsDHT {
34
peerstore := peer.NewPeerstore()
35
+ peerstore.AddPrivKey(p, sk)
36
+ peerstore.AddPubKey(p, pk)
37
+ peerstore.AddAddress(p, addr)
38
37
- n, err := inet.NewNetwork(ctx, p.Addresses(), p, peerstore)
39
+ n, err := inet.NewNetwork(ctx, []ma.Multiaddr{addr}, p, peerstore)
40
if err != nil {
41
t.Fatal(err)
42
}
43
42
- d := NewDHT(ctx, p, peerstore, n, ds.NewMapDatastore())
44
+ dss := dssync.MutexWrap(ds.NewMapDatastore())
45
+ d := NewDHT(ctx, p, n, dss)
46
47
d.Validators["v"] = func(u.Key, []byte) error {
48
return nil
50
return d
51
}
52
50
-func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.Peer, []*IpfsDHT) {
51
- var addrs []ma.Multiaddr
52
- for i := 0; i < n; i++ {
53
- r := rand.Intn(40000)
54
- a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", 10000+r))
55
- if err != nil {
56
- t.Fatal(err)
57
- }
58
- addrs = append(addrs, a)
59
- }
60
-
61
- var peers []peer.Peer
62
- for i := 0; i < n; i++ {
63
- p := makePeer(addrs[i])
64
- peers = append(peers, p)
65
- }
66
-
53
+func setupDHTS(ctx context.Context, n int, t *testing.T) ([]ma.Multiaddr, []peer.ID, []*IpfsDHT) {
54
+ addrs := make([]ma.Multiaddr, n)
55
dhts := make([]*IpfsDHT, n)
56
+ peers := make([]peer.ID, n)
57
+
58
for i := 0; i < n; i++ {
69
- dhts[i] = setupDHT(ctx, t, peers[i])
59
+ addrs[i] = testutil.RandLocalTCPAddress()
60
+ dhts[i] = setupDHT(ctx, t, addrs[i])
61
+ peers[i] = dhts[i].self
62
}
63
64
return addrs, peers, dhts
65
}
66
75
-func makePeerString(t *testing.T, addr string) peer.Peer {
76
- maddr, err := ma.NewMultiaddr(addr)
77
- if err != nil {
78
- t.Fatal(err)
79
- }
80
- return makePeer(maddr)
81
-}
67
+func connect(t *testing.T, ctx context.Context, a, b *IpfsDHT) {
68
83
-func makePeer(addr ma.Multiaddr) peer.Peer {
84
- sk, pk, err := ci.GenerateKeyPair(ci.RSA, 512)
85
- if err != nil {
86
- panic(err)
69
+ idB := b.self
70
+ addrB := b.peerstore.Addresses(idB)
71
+ if len(addrB) == 0 {
72
+ t.Fatal("peers setup incorrectly: no local address")
73
}
88
- p, err := testutil.NewPeerWithKeyPair(sk, pk)
89
- if err != nil {
90
- panic(err)
74
+
75
+ a.peerstore.AddAddresses(idB, addrB)
76
+ if err := a.Connect(ctx, idB); err != nil {
77
+ t.Fatal(err)
78
}
92
- p.AddAddress(addr)
93
- return p
79
}
80
81
func TestPing(t *testing.T) {
82
// t.Skip("skipping test to debug another")
83
ctx := context.Background()
84
100
- addrA := randMultiaddr(t)
101
- addrB := randMultiaddr(t)
85
+ addrA := testutil.RandLocalTCPAddress()
86
+ addrB := testutil.RandLocalTCPAddress()
87
103
- peerA := makePeer(addrA)
104
- peerB := makePeer(addrB)
88
+ dhtA := setupDHT(ctx, t, addrA)
89
+ dhtB := setupDHT(ctx, t, addrB)
90
106
- dhtA := setupDHT(ctx, t, peerA)
107
- dhtB := setupDHT(ctx, t, peerB)
91
+ peerA := dhtA.self
92
+ peerB := dhtB.self
93
94
defer dhtA.Close()
95
defer dhtB.Close()
96
defer dhtA.network.Close()
97
defer dhtB.network.Close()
98
114
- if err := dhtA.Connect(ctx, peerB); err != nil {
115
- t.Fatal(err)
116
- }
117
-
118
- // if err := dhtB.Connect(ctx, peerA); err != nil {
119
- // t.Fatal(err)
120
- // }
99
+ connect(t, ctx, dhtA, dhtB)
100
101
//Test that we can ping the node
102
ctxT, _ := context.WithTimeout(ctx, 100*time.Millisecond)
115
116
ctx := context.Background()
117
139
- addrA := randMultiaddr(t)
140
- addrB := randMultiaddr(t)
118
+ addrA := testutil.RandLocalTCPAddress()
119
+ addrB := testutil.RandLocalTCPAddress()
120
142
- peerA := makePeer(addrA)
143
- peerB := makePeer(addrB)
121
+ dhtA := setupDHT(ctx, t, addrA)
122
+ dhtB := setupDHT(ctx, t, addrB)
123
145
- dhtA := setupDHT(ctx, t, peerA)
146
- dhtB := setupDHT(ctx, t, peerB)
124
+ defer dhtA.Close()
125
+ defer dhtB.Close()
126
+ defer dhtA.network.Close()
127
+ defer dhtB.network.Close()
128
129
vf := func(u.Key, []byte) error {
130
return nil
132
dhtA.Validators["v"] = vf
133
dhtB.Validators["v"] = vf
134
154
- defer dhtA.Close()
155
- defer dhtB.Close()
156
- defer dhtA.network.Close()
157
- defer dhtB.network.Close()
158
-
159
- err := dhtA.Connect(ctx, peerB)
160
- if err != nil {
161
- t.Fatal(err)
162
- }
135
+ connect(t, ctx, dhtA, dhtB)
136
137
ctxT, _ := context.WithTimeout(ctx, time.Second)
138
dhtA.PutValue(ctxT, "/v/hello", []byte("world"))
162
// t.Skip("skipping test to debug another")
163
ctx := context.Background()
164
192
- _, peers, dhts := setupDHTS(ctx, 4, t)
165
+ _, _, dhts := setupDHTS(ctx, 4, t)
166
defer func() {
167
for i := 0; i < 4; i++ {
168
dhts[i].Close()
170
}
171
}()
172
200
- err := dhts[0].Connect(ctx, peers[1])
201
- if err != nil {
202
- t.Fatal(err)
203
- }
173
+ connect(t, ctx, dhts[0], dhts[1])
174
+ connect(t, ctx, dhts[1], dhts[2])
175
+ connect(t, ctx, dhts[1], dhts[3])
176
205
- err = dhts[1].Connect(ctx, peers[2])
206
- if err != nil {
207
- t.Fatal(err)
208
- }
209
-
210
- err = dhts[1].Connect(ctx, peers[3])
211
- if err != nil {
212
- t.Fatal(err)
213
- }
214
-
215
- err = dhts[3].putLocal(u.Key("hello"), []byte("world"))
177
+ err := dhts[3].putLocal(u.Key("hello"), []byte("world"))
178
if err != nil {
179
t.Fatal(err)
180
}
189
t.Fatal(err)
190
}
191
230
- time.Sleep(time.Millisecond * 60)
192
+ // what is this timeout for? was 60ms before.
193
+ time.Sleep(time.Millisecond * 6)
194
195
ctxT, _ := context.WithTimeout(ctx, time.Second)
196
provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1)
197
235
- after := time.After(time.Second)
198
select {
199
case prov := <-provchan:
238
- if prov == nil {
200
+ if prov.ID == "" {
201
t.Fatal("Got back nil provider")
202
}
241
- case <-after:
203
+ if prov.ID != dhts[3].self {
204
+ t.Fatal("Got back nil provider")
205
+ }
206
+ case <-ctxT.Done():
207
t.Fatal("Did not get a provider back.")
208
}
209
}
215
216
ctx := context.Background()
217
253
- _, peers, dhts := setupDHTS(ctx, 4, t)
218
+ _, _, dhts := setupDHTS(ctx, 4, t)
219
defer func() {
220
for i := 0; i < 4; i++ {
221
dhts[i].Close()
223
}
224
}()
225
261
- err := dhts[0].Connect(ctx, peers[1])
262
- if err != nil {
263
- t.Fatal(err)
264
- }
265
-
266
- err = dhts[1].Connect(ctx, peers[2])
267
- if err != nil {
268
- t.Fatal(err)
269
- }
270
-
271
- err = dhts[1].Connect(ctx, peers[3])
272
- if err != nil {
273
- t.Fatal(err)
274
- }
226
+ connect(t, ctx, dhts[0], dhts[1])
227
+ connect(t, ctx, dhts[1], dhts[2])
228
+ connect(t, ctx, dhts[1], dhts[3])
229
276
- err = dhts[3].putLocal(u.Key("hello"), []byte("world"))
230
+ err := dhts[3].putLocal(u.Key("hello"), []byte("world"))
231
if err != nil {
232
t.Fatal(err)
233
}
251
if !ok {
252
t.Fatal("Provider channel was closed...")
253
}
300
- if p == nil {
254
+ if p.ID == "" {
255
t.Fatal("Got back nil provider!")
256
}
303
- if !p.ID().Equal(dhts[3].self.ID()) {
257
+ if p.ID != dhts[3].self {
258
t.Fatalf("got a provider, but not the right one. %s", p)
259
}
260
case <-ctxT.Done():
269
270
ctx := context.Background()
271
318
- _, peers, dhts := setupDHTS(ctx, 4, t)
272
+ _, _, dhts := setupDHTS(ctx, 4, t)
273
defer func() {
274
for i := 0; i < 4; i++ {
275
dhts[i].Close()
277
}
278
}()
279
326
- err := dhts[0].Connect(ctx, peers[1])
327
- if err != nil {
328
- t.Fatalf("Failed to connect: %s", err)
329
- }
280
+ connect(t, ctx, dhts[0], dhts[1])
281
+ connect(t, ctx, dhts[1], dhts[2])
282
+ connect(t, ctx, dhts[1], dhts[3])
283
331
- err = dhts[1].Connect(ctx, peers[2])
332
- if err != nil {
333
- t.Fatal(err)
334
- }
335
-
336
- err = dhts[1].Connect(ctx, peers[3])
337
- if err != nil {
338
- t.Fatal(err)
339
- }
340
-
341
- err = dhts[3].putLocal(u.Key("/v/hello"), []byte("world"))
284
+ err := dhts[3].putLocal(u.Key("/v/hello"), []byte("world"))
285
if err != nil {
286
t.Fatal(err)
287
}
320
}
321
}()
322
380
- err := dhts[0].Connect(ctx, peers[1])
381
- if err != nil {
382
- t.Fatal(err)
383
- }
384
-
385
- err = dhts[1].Connect(ctx, peers[2])
386
- if err != nil {
387
- t.Fatal(err)
388
- }
389
-
390
- err = dhts[1].Connect(ctx, peers[3])
391
- if err != nil {
392
- t.Fatal(err)
393
- }
323
+ connect(t, ctx, dhts[0], dhts[1])
324
+ connect(t, ctx, dhts[1], dhts[2])
325
+ connect(t, ctx, dhts[1], dhts[3])
326
327
ctxT, _ := context.WithTimeout(ctx, time.Second)
396
- p, err := dhts[0].FindPeer(ctxT, peers[2].ID())
328
+ p, err := dhts[0].FindPeer(ctxT, peers[2])
329
if err != nil {
330
t.Fatal(err)
331
}
332
401
- if p == nil {
333
+ if p.ID == "" {
334
t.Fatal("Failed to find peer.")
335
}
336
405
- if !p.ID().Equal(peers[2].ID()) {
337
+ if p.ID != peers[2] {
338
t.Fatal("Didnt find expected peer.")
339
}
340
}
358
359
// topology:
360
// 0-1, 1-2, 1-3, 2-3
429
- err := dhts[0].Connect(ctx, peers[1])
430
- if err != nil {
431
- t.Fatal(err)
432
- }
433
-
434
- err = dhts[1].Connect(ctx, peers[2])
435
- if err != nil {
436
- t.Fatal(err)
437
- }
438
-
439
- err = dhts[1].Connect(ctx, peers[3])
440
- if err != nil {
441
- t.Fatal(err)
442
- }
443
-
444
- err = dhts[2].Connect(ctx, peers[3])
445
- if err != nil {
446
- t.Fatal(err)
447
- }
361
+ connect(t, ctx, dhts[0], dhts[1])
362
+ connect(t, ctx, dhts[1], dhts[2])
363
+ connect(t, ctx, dhts[1], dhts[3])
364
+ connect(t, ctx, dhts[2], dhts[3])
365
366
// fmt.Println("0 is", peers[0])
367
// fmt.Println("1 is", peers[1])
369
// fmt.Println("3 is", peers[3])
370
371
ctxT, _ := context.WithTimeout(ctx, time.Second)
455
- pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2].ID())
372
+ pchan, err := dhts[0].FindPeersConnectedToPeer(ctxT, peers[2])
373
if err != nil {
374
t.Fatal(err)
375
}
376
460
- // shouldFind := []peer.Peer{peers[1], peers[3]}
461
- found := []peer.Peer{}
377
+ // shouldFind := []peer.ID{peers[1], peers[3]}
378
+ found := []peer.PeerInfo{}
379
for nextp := range pchan {
380
found = append(found, nextp)
381
}
392
}
393
}
394
478
-func testPeerListsMatch(t *testing.T, p1, p2 []peer.Peer) {
395
+func testPeerListsMatch(t *testing.T, p1, p2 []peer.ID) {
396
397
if len(p1) != len(p2) {
398
t.Fatal("did not find as many peers as should have", p1, p2)
402
ids2 := make([]string, len(p2))
403
404
for i, p := range p1 {
488
- ids1[i] = p.ID().Pretty()
405
+ ids1[i] = string(p)
406
}
407
408
for i, p := range p2 {
492
- ids2[i] = p.ID().Pretty()
409
+ ids2[i] = string(p)
410
}
411
412
sort.Sort(sort.StringSlice(ids1))
431
432
ctx := context.Background()
433
517
- addrA := randMultiaddr(t)
518
- addrB := randMultiaddr(t)
434
+ addrA := testutil.RandLocalTCPAddress()
435
+ addrB := testutil.RandLocalTCPAddress()
436
520
- peerA := makePeer(addrA)
521
- peerB := makePeer(addrB)
437
+ dhtA := setupDHT(ctx, t, addrA)
438
+ dhtB := setupDHT(ctx, t, addrB)
439
523
- dhtA := setupDHT(ctx, t, peerA)
524
- dhtB := setupDHT(ctx, t, peerB)
440
+ peerA := dhtA.self
441
+ peerB := dhtB.self
442
526
- done := make(chan struct{})
443
+ errs := make(chan error)
444
go func() {
445
+ dhtA.peerstore.AddAddress(peerB, addrB)
446
err := dhtA.Connect(ctx, peerB)
529
- if err != nil {
530
- t.Fatal(err)
531
- }
532
- done <- struct{}{}
447
+ errs <- err
448
}()
449
go func() {
450
+ dhtB.peerstore.AddAddress(peerA, addrA)
451
err := dhtB.Connect(ctx, peerA)
536
- if err != nil {
537
- t.Fatal(err)
538
- }
539
- done <- struct{}{}
452
+ errs <- err
453
}()
454
455
timeout := time.After(time.Second)
456
select {
544
- case <-done:
457
+ case e := <-errs:
458
+ if e != nil {
459
+ t.Fatal(e)
460
+ }
461
case <-timeout:
462
t.Fatal("Timeout received!")
463
}
464
select {
549
- case <-done:
465
+ case e := <-errs:
466
+ if e != nil {
467
+ t.Fatal(e)
468
+ }
469
case <-timeout:
470
t.Fatal("Timeout received!")
471
}
474
dhtB.Close()
475
dhtA.network.Close()
476
dhtB.network.Close()
558
-
559
- <-time.After(200 * time.Millisecond)
477
}
478
}