@cryptotaxi247 / kubo / commits / 04f9805d5

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