diff --git a/p2p/peermanager_scoring_test.go b/p2p/peermanager_scoring_test.go new file mode 100644 index 000000000..698ee2973 --- /dev/null +++ b/p2p/peermanager_scoring_test.go @@ -0,0 +1,78 @@ +package p2p + +import ( + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto/ed25519" + dbm "github.com/tendermint/tm-db" +) + +func TestPeerScoring(t *testing.T) { + // coppied from p2p_test shared variables + selfKey := ed25519.GenPrivKeyFromSecret([]byte{0xf9, 0x1b, 0x08, 0xaa, 0x38, 0xee, 0x34, 0xdd}) + selfID := NodeIDFromPubKey(selfKey.PubKey()) + + // create a mock peer manager + db := dbm.NewMemDB() + peerManager, err := NewPeerManager(selfID, db, PeerManagerOptions{}) + require.NoError(t, err) + defer peerManager.Close() + + // create a fake node + id := NodeID(strings.Repeat("a1", 20)) + require.NoError(t, peerManager.Add(NodeAddress{NodeID: id, Protocol: "memory"})) + + t.Run("Synchronous", func(t *testing.T) { + // update the manager and make sure it's correct + require.EqualValues(t, 0, peerManager.Scores()[id]) + + // add a bunch of good status updates and watch things increase. + for i := 1; i < 10; i++ { + peerManager.processPeerEvent(PeerUpdate{ + NodeID: id, + Status: PeerStatusGood, + }) + require.EqualValues(t, i, peerManager.Scores()[id]) + } + + // watch the corresponding decreases respond to update + for i := 10; i == 0; i-- { + peerManager.processPeerEvent(PeerUpdate{ + NodeID: id, + Status: PeerStatusBad, + }) + require.EqualValues(t, i, peerManager.Scores()[id]) + } + }) + t.Run("AsynchronousIncrement", func(t *testing.T) { + start := peerManager.Scores()[id] + pu := peerManager.Subscribe() + defer pu.Close() + pu.SendUpdate(PeerUpdate{ + NodeID: id, + Status: PeerStatusGood, + }) + require.Eventually(t, + func() bool { return start+1 == peerManager.Scores()[id] }, + time.Second, + time.Millisecond, + "startAt=%d score=%d", start, peerManager.Scores()[id]) + }) + t.Run("AsynchronousDecrement", func(t *testing.T) { + start := peerManager.Scores()[id] + pu := peerManager.Subscribe() + defer pu.Close() + pu.SendUpdate(PeerUpdate{ + NodeID: id, + Status: PeerStatusBad, + }) + require.Eventually(t, + func() bool { return start-1 == peerManager.Scores()[id] }, + time.Second, + time.Millisecond, + "startAt=%d score=%d", start, peerManager.Scores()[id]) + }) +} diff --git a/p2p/peermanager_test.go b/p2p/peermanager_test.go index 0c0e4b9bc..d15d9f6d6 100644 --- a/p2p/peermanager_test.go +++ b/p2p/peermanager_test.go @@ -1615,39 +1615,3 @@ func TestPeerManager_SetHeight_GetHeight(t *testing.T) { require.Zero(t, peerManager.GetHeight(a.NodeID)) require.Zero(t, peerManager.GetHeight(b.NodeID)) } - -func TestPeerScoring(t *testing.T) { - // create a mock peer manager - db := dbm.NewMemDB() - peerManager, err := p2p.NewPeerManager(selfID, db, p2p.PeerManagerOptions{}) - require.NoError(t, err) - defer peerManager.Close() - - // create a fake node - id := p2p.NodeID(strings.Repeat("a1", 20)) - require.NoError(t, peerManager.Add(p2p.NodeAddress{NodeID: id, Protocol: "memory"})) - - // update the manager and make sure it's correct - pu := peerManager.Subscribe() - require.EqualValues(t, 0, peerManager.Scores()[id]) - - // add a bunch of good status updates and watch things increase. - for i := 1; i < 10; i++ { - pu.SendUpdate(p2p.PeerUpdate{ - NodeID: id, - Status: p2p.PeerStatusGood, - }) - time.Sleep(time.Millisecond) // force a context switch - require.EqualValues(t, i, peerManager.Scores()[id]) - } - - // watch the corresponding decreases respond to update - for i := 10; i == 0; i-- { - pu.SendUpdate(p2p.PeerUpdate{ - NodeID: id, - Status: p2p.PeerStatusBad, - }) - time.Sleep(time.Millisecond) // force a context switch - require.EqualValues(t, i, peerManager.Scores()[id]) - } -}