21
return nodes.StartDaemons().Connect()
22
}
23
24
+ initNodesWithoutStart := func(t *testing.T, n int, fn func(n *harness.Node)) harness.Nodes {
25
+ nodes := harness.NewT(t).NewNodes(n).Init()
26
+ nodes.ForEachPar(fn)
27
+ return nodes
28
+ }
29
+
30
expectNoProviders := func(t *testing.T, cid string, nodes ...*harness.Node) {
31
for _, node := range nodes {
32
res := node.IPFS("routing", "findprovs", "-n=1", cid)
50
defer nodes.StopDaemons()
51
52
cid := nodes[0].IPFSAddStr(time.Now().String())
47
- // Reprovide as initialProviderDelay still ongoing
48
- res := nodes[0].IPFS("routing", "reprovide")
49
- require.NoError(t, res.Err)
53
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
54
+ })
55
+
56
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs add --pin=false with default strategy", func(t *testing.T) {
57
+ t.Parallel()
58
+
59
+ nodes := initNodes(t, 2, func(n *harness.Node) {
60
+ n.SetIPFSConfig("Provider.Enabled", true)
61
+ // Default strategy is "all" which should provide even unpinned content
62
+ })
63
+ defer nodes.StopDaemons()
64
+
65
+ cid := nodes[0].IPFSAddStr(time.Now().String(), "--pin=false")
66
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
67
+ })
68
+
69
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs block put --pin=false with default strategy", func(t *testing.T) {
70
+ t.Parallel()
71
+
72
+ nodes := initNodes(t, 2, func(n *harness.Node) {
73
+ n.SetIPFSConfig("Provider.Enabled", true)
74
+ // Default strategy is "all" which should provide unpinned content from block put
75
+ })
76
+ defer nodes.StopDaemons()
77
+
78
+ data := testutils.RandomBytes(256)
79
+ cid := nodes[0].IPFSBlockPut(bytes.NewReader(data), "--pin=false")
80
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
81
+ })
82
+
83
+ t.Run("Provider.Enabled=true announces new CIDs created by ipfs dag put --pin=false with default strategy", func(t *testing.T) {
84
+ t.Parallel()
85
+
86
+ nodes := initNodes(t, 2, func(n *harness.Node) {
87
+ n.SetIPFSConfig("Provider.Enabled", true)
88
+ // Default strategy is "all" which should provide unpinned content from dag put
89
+ })
90
+ defer nodes.StopDaemons()
91
+
92
+ dagData := `{"hello": "world", "timestamp": "` + time.Now().String() + `"}`
93
+ cid := nodes[0].IPFSDAGPut(bytes.NewReader([]byte(dagData)), "--pin=false")
94
expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
95
})
96
144
})
145
defer nodes.StopDaemons()
146
103
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
147
+ cid := nodes[0].IPFSAddStr(time.Now().String())
148
149
expectNoProviders(t, cid, nodes[1:]...)
150
164
})
165
defer nodes.StopDaemons()
166
123
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--offline")
167
+ cid := nodes[0].IPFSAddStr(time.Now().String())
168
169
expectNoProviders(t, cid, nodes[1:]...)
170
175
expectNoProviders(t, cid, nodes[1:]...)
176
})
177
134
- t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
178
+ t.Run("Provide with 'all' strategy", func(t *testing.T) {
179
t.Parallel()
180
181
nodes := initNodes(t, 2, func(n *harness.Node) {
183
})
184
defer nodes.StopDaemons()
185
142
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--local")
186
+ cid := nodes[0].IPFSAddStr("all strategy")
187
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
188
+ })
189
+
190
+ t.Run("Provide with 'flat' strategy", func(t *testing.T) {
191
+ t.Parallel()
192
+
193
+ nodes := initNodes(t, 2, func(n *harness.Node) {
194
+ n.SetIPFSConfig("Reprovider.Strategy", "flat")
195
+ })
196
+ defer nodes.StopDaemons()
197
+
198
+ cid := nodes[0].IPFSAddStr("flat strategy")
199
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
200
+ })
201
+
202
+ t.Run("Provide with 'pinned' strategy", func(t *testing.T) {
203
+ t.Parallel()
204
+
205
+ nodes := initNodes(t, 2, func(n *harness.Node) {
206
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned")
207
+ })
208
+ defer nodes.StopDaemons()
209
+
210
+ // Add a non-pinned CID (should not be provided)
211
+ cid := nodes[0].IPFSAddStr("pinned strategy", "--pin=false")
212
+ expectNoProviders(t, cid, nodes[1:]...)
213
+
214
+ // Pin the CID (should now be provided)
215
+ nodes[0].IPFS("pin", "add", cid)
216
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
217
+ })
218
+
219
+ t.Run("Provide with 'pinned+mfs' strategy", func(t *testing.T) {
220
+ t.Parallel()
221
+
222
+ nodes := initNodes(t, 2, func(n *harness.Node) {
223
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned+mfs")
224
+ })
225
+ defer nodes.StopDaemons()
226
+
227
+ // Add a pinned CID (should be provided)
228
+ cidPinned := nodes[0].IPFSAddStr("pinned content")
229
+ cidUnpinned := nodes[0].IPFSAddStr("unpinned content", "--pin=false")
230
+ cidMFS := nodes[0].IPFSAddStr("mfs content", "--pin=false")
231
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidMFS, "/myfile")
232
+
233
+ n0pid := nodes[0].PeerID().String()
234
+ expectProviders(t, cidPinned, n0pid, nodes[1:]...)
235
+ expectNoProviders(t, cidUnpinned, nodes[1:]...)
236
+ expectProviders(t, cidMFS, n0pid, nodes[1:]...)
237
+ })
238
+
239
+ t.Run("Provide with 'roots' strategy", func(t *testing.T) {
240
+ t.Parallel()
241
+
242
+ nodes := initNodes(t, 2, func(n *harness.Node) {
243
+ n.SetIPFSConfig("Reprovider.Strategy", "roots")
244
+ })
245
+ defer nodes.StopDaemons()
246
+
247
+ // Add a root CID (should be provided)
248
+ cidRoot := nodes[0].IPFSAddStr("roots strategy", "-w", "-Q")
249
+ // the same without wrapping should give us a child node.
250
+ cidChild := nodes[0].IPFSAddStr("root strategy", "--pin=false")
251
+
252
+ expectProviders(t, cidRoot, nodes[0].PeerID().String(), nodes[1:]...)
253
+ expectNoProviders(t, cidChild, nodes[1:]...)
254
+ })
255
+
256
+ t.Run("Provide with 'mfs' strategy", func(t *testing.T) {
257
+ t.Parallel()
258
+
259
+ nodes := initNodes(t, 2, func(n *harness.Node) {
260
+ n.SetIPFSConfig("Reprovider.Strategy", "mfs")
261
+ })
262
+ defer nodes.StopDaemons()
263
+
264
+ // Add a file to MFS (should be provided)
265
+ data := testutils.RandomBytes(1000)
266
+ cid := nodes[0].IPFSAdd(bytes.NewReader(data), "-Q")
267
268
+ // not yet in MFS
269
+ expectNoProviders(t, cid, nodes[1:]...)
270
+
271
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cid, "/myfile")
272
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
273
+ })
274
+
275
+ t.Run("Reprovides with 'all' strategy when strategy is '' (empty)", func(t *testing.T) {
276
+ t.Parallel()
277
+
278
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
279
+ n.SetIPFSConfig("Reprovider.Strategy", "")
280
+ })
281
+
282
+ cid := nodes[0].IPFSAddStr(time.Now().String())
283
+
284
+ nodes = nodes.StartDaemons().Connect()
285
+ defer nodes.StopDaemons()
286
+ expectNoProviders(t, cid, nodes[1:]...)
287
+
288
+ nodes[0].IPFS("routing", "reprovide")
289
+
290
+ expectProviders(t, cid, nodes[0].PeerID().String(), nodes[1:]...)
291
+ })
292
+
293
+ t.Run("Reprovides with 'all' strategy", func(t *testing.T) {
294
+ t.Parallel()
295
+
296
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
297
+ n.SetIPFSConfig("Reprovider.Strategy", "all")
298
+ })
299
+
300
+ cid := nodes[0].IPFSAddStr(time.Now().String())
301
+
302
+ nodes = nodes.StartDaemons().Connect()
303
+ defer nodes.StopDaemons()
304
expectNoProviders(t, cid, nodes[1:]...)
305
306
nodes[0].IPFS("routing", "reprovide")
311
t.Run("Reprovides with 'flat' strategy", func(t *testing.T) {
312
t.Parallel()
313
154
- nodes := initNodes(t, 2, func(n *harness.Node) {
314
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
315
n.SetIPFSConfig("Reprovider.Strategy", "flat")
316
})
157
- defer nodes.StopDaemons()
317
159
- cid := nodes[0].IPFSAddStr(time.Now().String(), "--local")
318
+ cid := nodes[0].IPFSAddStr(time.Now().String())
319
320
+ nodes = nodes.StartDaemons().Connect()
321
+ defer nodes.StopDaemons()
322
expectNoProviders(t, cid, nodes[1:]...)
323
324
nodes[0].IPFS("routing", "reprovide")
332
foo := testutils.RandomBytes(1000)
333
bar := testutils.RandomBytes(1000)
334
174
- nodes := initNodes(t, 2, func(n *harness.Node) {
335
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
336
n.SetIPFSConfig("Reprovider.Strategy", "pinned")
337
})
338
+
339
+ // Add a pin while offline so it cannot be provided
340
+ cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "-w")
341
+
342
+ nodes = nodes.StartDaemons().Connect()
343
defer nodes.StopDaemons()
344
179
- cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--offline", "--pin=false")
180
- cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--offline", "--pin=false")
181
- cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "--offline", "-w")
345
+ // Add content without pinning while daemon line
346
+ cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--pin=false")
347
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false")
348
349
+ // Nothing should have been provided. The pin was offline, and
350
+ // the others should not be provided per the strategy.
351
expectNoProviders(t, cidFoo, nodes[1:]...)
352
expectNoProviders(t, cidBar, nodes[1:]...)
353
expectNoProviders(t, cidBarDir, nodes[1:]...)
354
355
nodes[0].IPFS("routing", "reprovide")
356
357
+ // cidFoo is not pinned so should not be provided.
358
expectNoProviders(t, cidFoo, nodes[1:]...)
359
+ // cidBar gets provided by being a child from cidBarDir even though we added with pin=false.
360
expectProviders(t, cidBar, nodes[0].PeerID().String(), nodes[1:]...)
361
expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
362
})
366
367
foo := testutils.RandomBytes(1000)
368
bar := testutils.RandomBytes(1000)
199
- baz := testutils.RandomBytes(1000)
369
201
- nodes := initNodes(t, 2, func(n *harness.Node) {
370
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
371
n.SetIPFSConfig("Reprovider.Strategy", "roots")
372
})
373
+ n0pid := nodes[0].PeerID().String()
374
+
375
+ // Add a pin. Only root should get pinned but not provided
376
+ // because node not started
377
+ cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "-w")
378
+
379
+ nodes = nodes.StartDaemons().Connect()
380
defer nodes.StopDaemons()
381
206
- cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo), "--offline", "--pin=false")
207
- cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--offline", "--pin=false")
208
- cidBaz := nodes[0].IPFSAdd(bytes.NewReader(baz), "--offline")
209
- cidBarDir := nodes[0].IPFSAdd(bytes.NewReader(bar), "-Q", "--offline", "-w")
382
+ cidFoo := nodes[0].IPFSAdd(bytes.NewReader(foo))
383
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false")
384
211
- expectNoProviders(t, cidFoo, nodes[1:]...)
385
+ // cidFoo will get provided per the strategy but cidBar will not.
386
+ expectProviders(t, cidFoo, n0pid, nodes[1:]...)
387
expectNoProviders(t, cidBar, nodes[1:]...)
213
- expectNoProviders(t, cidBarDir, nodes[1:]...)
388
389
nodes[0].IPFS("routing", "reprovide")
390
217
- expectNoProviders(t, cidFoo, nodes[1:]...)
391
+ expectProviders(t, cidFoo, n0pid, nodes[1:]...)
392
expectNoProviders(t, cidBar, nodes[1:]...)
219
- expectProviders(t, cidBaz, nodes[0].PeerID().String(), nodes[1:]...)
220
- expectProviders(t, cidBarDir, nodes[0].PeerID().String(), nodes[1:]...)
393
+ expectProviders(t, cidBarDir, n0pid, nodes[1:]...)
394
+ })
395
+
396
+ t.Run("Reprovides with 'mfs' strategy", func(t *testing.T) {
397
+ t.Parallel()
398
+
399
+ bar := testutils.RandomBytes(1000)
400
+
401
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
402
+ n.SetIPFSConfig("Reprovider.Strategy", "mfs")
403
+ })
404
+ n0pid := nodes[0].PeerID().String()
405
+
406
+ // add something and lets put it in MFS
407
+ cidBar := nodes[0].IPFSAdd(bytes.NewReader(bar), "--pin=false", "-Q")
408
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidBar, "/myfile")
409
+
410
+ nodes = nodes.StartDaemons().Connect()
411
+ defer nodes.StopDaemons()
412
+
413
+ // cidBar is in MFS but not provided
414
+ expectNoProviders(t, cidBar, nodes[1:]...)
415
+
416
+ nodes[0].IPFS("routing", "reprovide")
417
+
418
+ // And now is provided
419
+ expectProviders(t, cidBar, n0pid, nodes[1:]...)
420
+ })
421
+
422
+ t.Run("Reprovides with 'pinned+mfs' strategy", func(t *testing.T) {
423
+ t.Parallel()
424
+
425
+ nodes := initNodesWithoutStart(t, 2, func(n *harness.Node) {
426
+ n.SetIPFSConfig("Reprovider.Strategy", "pinned+mfs")
427
+ })
428
+ n0pid := nodes[0].PeerID().String()
429
+
430
+ // Add a pinned CID (should be provided)
431
+ cidPinned := nodes[0].IPFSAddStr("pinned content", "--pin=true")
432
+ // Add a CID to MFS (should be provided)
433
+ cidMFS := nodes[0].IPFSAddStr("mfs content")
434
+ nodes[0].IPFS("files", "cp", "/ipfs/"+cidMFS, "/myfile")
435
+ // Add a CID that is neither pinned nor in MFS (should not be provided)
436
+ cidNeither := nodes[0].IPFSAddStr("neither content", "--pin=false")
437
+
438
+ nodes = nodes.StartDaemons().Connect()
439
+ defer nodes.StopDaemons()
440
+
441
+ // Trigger reprovide
442
+ nodes[0].IPFS("routing", "reprovide")
443
+
444
+ // Check that pinned CID is provided
445
+ expectProviders(t, cidPinned, n0pid, nodes[1:]...)
446
+ // Check that MFS CID is provided
447
+ expectProviders(t, cidMFS, n0pid, nodes[1:]...)
448
+ // Check that neither CID is not provided
449
+ expectNoProviders(t, cidNeither, nodes[1:]...)
450
})
451
452
t.Run("provide clear command removes items from provide queue", func(t *testing.T) {