You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.1 KiB

  1. package p2p
  2. import (
  3. "strings"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/require"
  7. "github.com/tendermint/tendermint/crypto/ed25519"
  8. dbm "github.com/tendermint/tm-db"
  9. )
  10. func TestPeerScoring(t *testing.T) {
  11. // coppied from p2p_test shared variables
  12. selfKey := ed25519.GenPrivKeyFromSecret([]byte{0xf9, 0x1b, 0x08, 0xaa, 0x38, 0xee, 0x34, 0xdd})
  13. selfID := NodeIDFromPubKey(selfKey.PubKey())
  14. // create a mock peer manager
  15. db := dbm.NewMemDB()
  16. peerManager, err := NewPeerManager(selfID, db, PeerManagerOptions{})
  17. require.NoError(t, err)
  18. defer peerManager.Close()
  19. // create a fake node
  20. id := NodeID(strings.Repeat("a1", 20))
  21. require.NoError(t, peerManager.Add(NodeAddress{NodeID: id, Protocol: "memory"}))
  22. t.Run("Synchronous", func(t *testing.T) {
  23. // update the manager and make sure it's correct
  24. require.EqualValues(t, 0, peerManager.Scores()[id])
  25. // add a bunch of good status updates and watch things increase.
  26. for i := 1; i < 10; i++ {
  27. peerManager.processPeerEvent(PeerUpdate{
  28. NodeID: id,
  29. Status: PeerStatusGood,
  30. })
  31. require.EqualValues(t, i, peerManager.Scores()[id])
  32. }
  33. // watch the corresponding decreases respond to update
  34. for i := 10; i == 0; i-- {
  35. peerManager.processPeerEvent(PeerUpdate{
  36. NodeID: id,
  37. Status: PeerStatusBad,
  38. })
  39. require.EqualValues(t, i, peerManager.Scores()[id])
  40. }
  41. })
  42. t.Run("AsynchronousIncrement", func(t *testing.T) {
  43. start := peerManager.Scores()[id]
  44. pu := peerManager.Subscribe()
  45. defer pu.Close()
  46. pu.SendUpdate(PeerUpdate{
  47. NodeID: id,
  48. Status: PeerStatusGood,
  49. })
  50. require.Eventually(t,
  51. func() bool { return start+1 == peerManager.Scores()[id] },
  52. time.Second,
  53. time.Millisecond,
  54. "startAt=%d score=%d", start, peerManager.Scores()[id])
  55. })
  56. t.Run("AsynchronousDecrement", func(t *testing.T) {
  57. start := peerManager.Scores()[id]
  58. pu := peerManager.Subscribe()
  59. defer pu.Close()
  60. pu.SendUpdate(PeerUpdate{
  61. NodeID: id,
  62. Status: PeerStatusBad,
  63. })
  64. require.Eventually(t,
  65. func() bool { return start-1 == peerManager.Scores()[id] },
  66. time.Second,
  67. time.Millisecond,
  68. "startAt=%d score=%d", start, peerManager.Scores()[id])
  69. })
  70. }