Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds a test for PeerTracker #576

Merged
merged 1 commit into from
Mar 20, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions peer/peer_tracker_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// (c) 2019-2022, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package peer

import (
"testing"

"github.com/ava-labs/avalanchego/ids"
"github.com/stretchr/testify/require"
)

func TestPeerTracker(t *testing.T) {
require := require.New(t)
p := NewPeerTracker()

// Connect some peers
numExtraPeers := 10
numPeers := desiredMinResponsivePeers + numExtraPeers
peerIDs := make([]ids.NodeID, numPeers)

for i := range peerIDs {
peerIDs[i] = ids.GenerateTestNodeID()
p.Connected(peerIDs[i], defaultPeerVersion)
}

responsivePeers := make(map[ids.NodeID]bool)

// Expect requests to go to new peers until we have desiredMinResponsivePeers responsive peers.
for i := 0; i < desiredMinResponsivePeers+numExtraPeers/2; i++ {
peer, ok := p.GetAnyPeer(nil)
require.True(ok)
require.NotNil(peer)

_, exists := responsivePeers[peer]
require.Falsef(exists, "expected connecting to a new peer, but got the same peer twice: peer %s iteration %d", peer, i)
responsivePeers[peer] = true

p.TrackPeer(peer) // mark the peer as having a message sent to it
}

// Mark some peers as responsive and others as not responsive
i := 0
for peer := range responsivePeers {
if i < desiredMinResponsivePeers {
p.TrackBandwidth(peer, 10)
} else {
responsivePeers[peer] = false // remember which peers were not responsive
p.TrackBandwidth(peer, 0)
}
i++
}

// Expect requests to go to responsive or new peers, so long as they are available
numRequests := 50
for i := 0; i < numRequests; i++ {
peer, ok := p.GetAnyPeer(nil)
require.True(ok)
require.NotNil(peer)

responsive, ok := responsivePeers[peer]
if ok {
require.Truef(responsive, "expected connecting to a responsive peer, but got a peer that was not responsive: peer %s iteration %d", peer, i)
p.TrackBandwidth(peer, 10)
} else {
responsivePeers[peer] = false // remember that we connected to this peer
p.TrackPeer(peer) // mark the peer as having a message sent to it
p.TrackBandwidth(peer, 0) // mark the peer as non-responsive
}
}

// Disconnect from peers that were previously responsive and ones we didn't connect to yet.
for _, peer := range peerIDs {
responsive, ok := responsivePeers[peer]
if ok && responsive || !ok {
p.Disconnected(peer)
}
}

// Requests should fall back on non-responsive peers when no other choice is left
peer, ok := p.GetAnyPeer(nil)
require.True(ok)
require.NotNil(peer)

responsive, ok := responsivePeers[peer]
require.True(ok)
require.Falsef(responsive, "expected connecting to a non-responsive peer, but got a peer that was responsive: peer %s", peer)
}