@@ -24,7 +24,7 @@ func createPeerDiscovery(
24
24
peerDisc := node .NewPeerDiscovery (ctx , wg , peerDiscCfg )
25
25
if start {
26
26
wg .Add (1 )
27
- go peerDisc .DiscoverPeers (100 * time .Millisecond )
27
+ go peerDisc .DiscoverPeers (50 * time .Millisecond )
28
28
}
29
29
return peerDisc
30
30
}
@@ -52,3 +52,41 @@ func TestPeerDiscovery(t *testing.T) {
52
52
t .Errorf ("bootstrap address %v is not in node known peers" , bootAddr )
53
53
}
54
54
}
55
+
56
+ func TestRemovalOfUnhealthyPeer (t * testing.T ) {
57
+ wg := new (sync.WaitGroup )
58
+ // Create the peer discovery without staring for the bootstrap node
59
+ bootPeerDisc := createPeerDiscovery (t .Context (), wg , true , false )
60
+ // Start the gRPC server on the bootstrap node
61
+
62
+ waitForPeersDiscovery := make (chan struct {})
63
+ grpcStartSvr (t , bootAddr , func (grpcSrv * grpc.Server ) {
64
+ node := rpc .NewNodeSrv (bootPeerDisc , nil )
65
+ rpc .RegisterNodeServer (grpcSrv , node )
66
+
67
+ go func () {
68
+ <- waitForPeersDiscovery
69
+ grpcSrv .Stop ()
70
+ }()
71
+ })
72
+ // Create and start the peer discovery for the new node
73
+ nodePeerDisc := createPeerDiscovery (t .Context (), wg , false , true )
74
+ // Wait for the peer discovery to discover peers
75
+ time .Sleep (150 * time .Millisecond )
76
+ // Verify that the bootstrap node and the new node have discovered each other
77
+
78
+ if ! slices .Contains (bootPeerDisc .Peers (), nodeAddr ) {
79
+ t .Errorf ("node address %v is not in bootstrap known peers" , nodeAddr )
80
+ }
81
+ if ! slices .Contains (nodePeerDisc .Peers (), bootAddr ) {
82
+ t .Errorf ("bootstrap address %v is not in node known peers" , bootAddr )
83
+ }
84
+
85
+ waitForPeersDiscovery <- struct {}{}
86
+ // Wait for the peer discovery to try to discover peers
87
+ time .Sleep (150 * time .Millisecond )
88
+
89
+ if len (nodePeerDisc .Peers ()) != 0 {
90
+ t .Errorf ("node peer discovery should not have any peers after the bootstrap node is stopped" )
91
+ }
92
+ }
0 commit comments