dht_test large providers test
Juan Batiz-Benet committed
Dec 23, 2014 at 18:40 UTC
04f9805d5d16325e34c091c2a1f4cc2b28e4eb27
1 file changed
+139
-19
routing/dht/dht_test.go
+139
-19
@@ -2,7 +2,9 @@ package dht
2
3
import (
4
"bytes"
5
+ "fmt"
6
"sort"
7
+ "sync"
8
"testing"
9
"time"
10
@@ -19,6 +21,17 @@ import (
21
testutil "github.com/jbenet/go-ipfs/util/testutil"
22
)
23
24
+var testCaseValues = map[u.Key][]byte{}
25
+
26
+func init() {
27
+ testCaseValues["hello"] = []byte("world")
28
+ for i := 0; i < 100; i++ {
29
+ k := fmt.Sprintf("%d -- key", i)
30
+ v := fmt.Sprintf("%d -- value", i)
31
+ testCaseValues[u.Key(k)] = []byte(v)
32
+ }
33
+}
34
+
35
func setupDHT(ctx context.Context, t *testing.T, addr ma.Multiaddr) *IpfsDHT {
36
37
sk, pk, err := testutil.RandKeyPair(512)
@@ -174,37 +187,144 @@ func TestProvides(t *testing.T) {
187
connect(t, ctx, dhts[1], dhts[2])
188
connect(t, ctx, dhts[1], dhts[3])
189
177
- err := dhts[3].putLocal(u.Key("hello"), []byte("world"))
178
- if err != nil {
179
- t.Fatal(err)
190
+ for k, v := range testCaseValues {
191
+ t.Logf("adding local values for %s = %s", k, v)
192
+ err := dhts[3].putLocal(k, v)
193
+ if err != nil {
194
+ t.Fatal(err)
195
+ }
196
+
197
+ bits, err := dhts[3].getLocal(k)
198
+ if err != nil {
199
+ t.Fatal(err)
200
+ }
201
+ if !bytes.Equal(bits, v) {
202
+ t.Fatal("didn't store the right bits (%s, %s)", k, v)
203
+ }
204
}
205
182
- bits, err := dhts[3].getLocal(u.Key("hello"))
183
- if err != nil && bytes.Equal(bits, []byte("world")) {
184
- t.Fatal(err)
206
+ for k, _ := range testCaseValues {
207
+ t.Logf("announcing provider for %s", k)
208
+ if err := dhts[3].Provide(ctx, k); err != nil {
209
+ t.Fatal(err)
210
+ }
211
}
212
187
- err = dhts[3].Provide(ctx, u.Key("hello"))
188
- if err != nil {
189
- t.Fatal(err)
213
+ // what is this timeout for? was 60ms before.
214
+ time.Sleep(time.Millisecond * 6)
215
+
216
+ n := 0
217
+ for k, _ := range testCaseValues {
218
+ n = (n + 1) % 3
219
+
220
+ t.Logf("getting providers for %s from %d", k, n)
221
+ ctxT, _ := context.WithTimeout(ctx, time.Second)
222
+ provchan := dhts[n].FindProvidersAsync(ctxT, k, 1)
223
+
224
+ select {
225
+ case prov := <-provchan:
226
+ if prov.ID == "" {
227
+ t.Fatal("Got back nil provider")
228
+ }
229
+ if prov.ID != dhts[3].self {
230
+ t.Fatal("Got back wrong provider")
231
+ }
232
+ case <-ctxT.Done():
233
+ t.Fatal("Did not get a provider back.")
234
+ }
235
+ }
236
+}
237
+
238
+func TestProvidesMany(t *testing.T) {
239
+ t.Skip("this test doesn't work")
240
+ ctx := context.Background()
241
+
242
+ nDHTs := 40
243
+ _, _, dhts := setupDHTS(ctx, nDHTs, t)
244
+ defer func() {
245
+ for i := 0; i < nDHTs; i++ {
246
+ dhts[i].Close()
247
+ defer dhts[i].network.Close()
248
+ }
249
+ }()
250
+
251
+ t.Logf("connecting %d dhts in a ring", nDHTs)
252
+ for i := 0; i < nDHTs; i++ {
253
+ connect(t, ctx, dhts[i], dhts[(i+1)%len(dhts)])
254
+ }
255
+
256
+ // t.Logf("bootstrapping them so they find each other", nDHTs)
257
+ // for _, dht := range dhts {
258
+ // bootstrap(t, ctx, dht)
259
+ // }
260
+
261
+ d := 0
262
+ for k, v := range testCaseValues {
263
+ d = (d + 1) % len(dhts)
264
+ dht := dhts[d]
265
+
266
+ t.Logf("adding local values for %s = %s (on %s)", k, v, dht.self)
267
+ err := dht.putLocal(k, v)
268
+ if err != nil {
269
+ t.Fatal(err)
270
+ }
271
+
272
+ bits, err := dht.getLocal(k)
273
+ if err != nil {
274
+ t.Fatal(err)
275
+ }
276
+ if !bytes.Equal(bits, v) {
277
+ t.Fatal("didn't store the right bits (%s, %s)", k, v)
278
+ }
279
+
280
+ t.Logf("announcing provider for %s", k)
281
+ if err := dht.Provide(ctx, k); err != nil {
282
+ t.Fatal(err)
283
+ }
284
}
285
286
// what is this timeout for? was 60ms before.
287
time.Sleep(time.Millisecond * 6)
288
195
- ctxT, _ := context.WithTimeout(ctx, time.Second)
196
- provchan := dhts[0].FindProvidersAsync(ctxT, u.Key("hello"), 1)
289
+ errchan := make(chan error)
290
198
- select {
199
- case prov := <-provchan:
200
- if prov.ID == "" {
201
- t.Fatal("Got back nil provider")
291
+ ctxT, _ := context.WithTimeout(ctx, 5*time.Second)
292
+
293
+ var wg sync.WaitGroup
294
+ getProvider := func(dht *IpfsDHT, k u.Key) {
295
+ defer wg.Done()
296
+
297
+ provchan := dht.FindProvidersAsync(ctxT, k, 1)
298
+ select {
299
+ case prov := <-provchan:
300
+ if prov.ID == "" {
301
+ errchan <- fmt.Errorf("Got back nil provider (%s at %s)", k, dht.self)
302
+ } else if prov.ID != dhts[3].self {
303
+ errchan <- fmt.Errorf("Got back wrong provider (%s at %s)", k, dht.self)
304
+ }
305
+ case <-ctxT.Done():
306
+ errchan <- fmt.Errorf("Did not get a provider back (%s at %s)", k, dht.self)
307
}
203
- if prov.ID != dhts[3].self {
204
- t.Fatal("Got back nil provider")
308
+ }
309
+
310
+ for k, _ := range testCaseValues {
311
+ // everyone should be able to find it...
312
+ for _, dht := range dhts {
313
+ t.Logf("getting providers for %s at %s", k, dht.self)
314
+ wg.Add(1)
315
+ go getProvider(dht, k)
316
}
206
- case <-ctxT.Done():
207
- t.Fatal("Did not get a provider back.")
317
+ }
318
+
319
+ // we need this because of printing errors
320
+ go func() {
321
+ wg.Wait()
322
+ close(errchan)
323
+ }()
324
+
325
+ t.Logf("looking through errors")
326
+ for err := range errchan {
327
+ t.Error(err)
328
}
329
}
330