master
go 110 lines 3.17 KB
Raw
1 package cli
2
3 import (
4 "slices"
5 "testing"
6 "time"
7
8 "github.com/ipfs/kubo/test/cli/harness"
9 . "github.com/ipfs/kubo/test/cli/testutils"
10 "github.com/libp2p/go-libp2p/core/peer"
11 "github.com/stretchr/testify/assert"
12 )
13
14 func TestPeering(t *testing.T) {
15 t.Parallel()
16
17 containsPeerID := func(p peer.ID, peers []peer.ID) bool {
18 return slices.Contains(peers, p)
19 }
20
21 assertPeered := func(h *harness.Harness, from *harness.Node, to *harness.Node) {
22 assert.Eventuallyf(t, func() bool {
23 fromPeers := from.Peers()
24 if len(fromPeers) == 0 {
25 return false
26 }
27 var fromPeerIDs []peer.ID
28 for _, p := range fromPeers {
29 fromPeerIDs = append(fromPeerIDs, h.ExtractPeerID(p))
30 }
31 return containsPeerID(to.PeerID(), fromPeerIDs)
32 }, time.Minute, 10*time.Millisecond, "%d -> %d not peered", from.ID, to.ID)
33 }
34
35 assertNotPeered := func(h *harness.Harness, from *harness.Node, to *harness.Node) {
36 assert.Eventuallyf(t, func() bool {
37 fromPeers := from.Peers()
38 if len(fromPeers) == 0 {
39 return false
40 }
41 var fromPeerIDs []peer.ID
42 for _, p := range fromPeers {
43 fromPeerIDs = append(fromPeerIDs, h.ExtractPeerID(p))
44 }
45 return !containsPeerID(to.PeerID(), fromPeerIDs)
46 }, 20*time.Second, 10*time.Millisecond, "%d -> %d peered", from.ID, to.ID)
47 }
48
49 assertPeerings := func(h *harness.Harness, nodes []*harness.Node, peerings []harness.Peering) {
50 ForEachPar(peerings, func(peering harness.Peering) {
51 assertPeered(h, nodes[peering.From], nodes[peering.To])
52 })
53 }
54
55 t.Run("bidirectional peering should work (simultaneous connect)", func(t *testing.T) {
56 t.Parallel()
57 peerings := []harness.Peering{{From: 0, To: 1}, {From: 1, To: 0}, {From: 1, To: 2}}
58 h, nodes := harness.CreatePeerNodes(t, 3, peerings)
59
60 nodes.StartDaemons()
61 defer nodes.StopDaemons()
62 assertPeerings(h, nodes, peerings)
63
64 nodes[0].Disconnect(nodes[1])
65 assertPeerings(h, nodes, peerings)
66 })
67
68 t.Run("1 should reconnect to 2 when 2 disconnects from 1", func(t *testing.T) {
69 t.Parallel()
70 peerings := []harness.Peering{{From: 0, To: 1}, {From: 1, To: 0}, {From: 1, To: 2}}
71 h, nodes := harness.CreatePeerNodes(t, 3, peerings)
72
73 nodes.StartDaemons()
74 defer nodes.StopDaemons()
75 assertPeerings(h, nodes, peerings)
76
77 nodes[2].Disconnect(nodes[1])
78 assertPeerings(h, nodes, peerings)
79 })
80
81 t.Run("1 will peer with 2 when it comes online", func(t *testing.T) {
82 t.Parallel()
83 peerings := []harness.Peering{{From: 0, To: 1}, {From: 1, To: 0}, {From: 1, To: 2}}
84 h, nodes := harness.CreatePeerNodes(t, 3, peerings)
85
86 defer nodes.StopDaemons()
87 nodes[0].StartDaemon()
88 nodes[1].StartDaemon()
89 assertPeerings(h, nodes, []harness.Peering{{From: 0, To: 1}, {From: 1, To: 0}})
90
91 nodes[2].StartDaemon()
92 assertPeerings(h, nodes, peerings)
93 })
94
95 t.Run("1 will re-peer with 2 when it disconnects and then comes back online", func(t *testing.T) {
96 t.Parallel()
97 peerings := []harness.Peering{{From: 0, To: 1}, {From: 1, To: 0}, {From: 1, To: 2}}
98 h, nodes := harness.CreatePeerNodes(t, 3, peerings)
99
100 nodes.StartDaemons()
101 defer nodes.StopDaemons()
102 assertPeerings(h, nodes, peerings)
103
104 nodes[2].StopDaemon()
105 assertNotPeered(h, nodes[1], nodes[2])
106
107 nodes[2].StartDaemon()
108 assertPeerings(h, nodes, peerings)
109 })
110 }