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.

176 lines
4.4 KiB

lint: Enable Golint (#4212) * Fix many golint errors * Fix golint errors in the 'lite' package * Don't export Pool.store * Fix typo * Revert unwanted changes * Fix errors in counter package * Fix linter errors in kvstore package * Fix linter error in example package * Fix error in tests package * Fix linter errors in v2 package * Fix linter errors in consensus package * Fix linter errors in evidence package * Fix linter error in fail package * Fix linter errors in query package * Fix linter errors in core package * Fix linter errors in node package * Fix linter errors in mempool package * Fix linter error in conn package * Fix linter errors in pex package * Rename PEXReactor export to Reactor * Fix linter errors in trust package * Fix linter errors in upnp package * Fix linter errors in p2p package * Fix linter errors in proxy package * Fix linter errors in mock_test package * Fix linter error in client_test package * Fix linter errors in coretypes package * Fix linter errors in coregrpc package * Fix linter errors in rpcserver package * Fix linter errors in rpctypes package * Fix linter errors in rpctest package * Fix linter error in json2wal script * Fix linter error in wal2json script * Fix linter errors in kv package * Fix linter error in state package * Fix linter error in grpc_client * Fix linter errors in types package * Fix linter error in version package * Fix remaining errors * Address review comments * Fix broken tests * Reconcile package coregrpc * Fix golangci bot error * Fix new golint errors * Fix broken reference * Enable golint linter * minor changes to bring golint into line * fix failing test * fix pex reactor naming * address PR comments
5 years ago
  1. // Copyright 2017 Tendermint. All rights reserved.
  2. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
  3. package trust
  4. import (
  5. "context"
  6. "fmt"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. dbm "github.com/tendermint/tm-db"
  11. "github.com/tendermint/tendermint/libs/log"
  12. )
  13. func TestTrustMetricStoreSaveLoad(t *testing.T) {
  14. ctx, cancel := context.WithCancel(context.Background())
  15. defer cancel()
  16. dir := t.TempDir()
  17. logger := log.TestingLogger()
  18. historyDB, err := dbm.NewDB("trusthistory", "goleveldb", dir)
  19. require.NoError(t, err)
  20. // 0 peers saved
  21. store := NewTrustMetricStore(historyDB, DefaultConfig(), logger)
  22. store.saveToDB()
  23. // Load the data from the file
  24. store = NewTrustMetricStore(historyDB, DefaultConfig(), logger)
  25. err = store.Start(ctx)
  26. require.NoError(t, err)
  27. // Make sure we still have 0 entries
  28. assert.Zero(t, store.Size())
  29. // 100 TestTickers
  30. var tt []*TestTicker
  31. for i := 0; i < 100; i++ {
  32. // The TestTicker will provide manual control over
  33. // the passing of time within the metric
  34. tt = append(tt, NewTestTicker())
  35. }
  36. // 100 peers
  37. for i := 0; i < 100; i++ {
  38. key := fmt.Sprintf("peer_%d", i)
  39. tm := NewMetric()
  40. tm.SetTicker(tt[i])
  41. err = tm.Start(ctx)
  42. require.NoError(t, err)
  43. store.AddPeerTrustMetric(key, tm)
  44. tm.BadEvents(10)
  45. tm.GoodEvents(1)
  46. }
  47. // Check that we have 100 entries and save
  48. assert.Equal(t, 100, store.Size())
  49. // Give the 100 metrics time to process the history data
  50. for i := 0; i < 100; i++ {
  51. tt[i].NextTick()
  52. tt[i].NextTick()
  53. }
  54. // Stop all the trust metrics and save
  55. err = store.Stop()
  56. require.NoError(t, err)
  57. // Load the data from the DB
  58. store = NewTrustMetricStore(historyDB, DefaultConfig(), logger)
  59. err = store.Start(ctx)
  60. require.NoError(t, err)
  61. // Check that we still have 100 peers with imperfect trust values
  62. assert.Equal(t, 100, store.Size())
  63. for _, tm := range store.peerMetrics {
  64. assert.NotEqual(t, 1.0, tm.TrustValue())
  65. }
  66. err = store.Stop()
  67. require.NoError(t, err)
  68. }
  69. func TestTrustMetricStoreConfig(t *testing.T) {
  70. ctx, cancel := context.WithCancel(context.Background())
  71. defer cancel()
  72. historyDB, err := dbm.NewDB("", "memdb", "")
  73. require.NoError(t, err)
  74. config := MetricConfig{
  75. ProportionalWeight: 0.5,
  76. IntegralWeight: 0.5,
  77. }
  78. logger := log.TestingLogger()
  79. // Create a store with custom config
  80. store := NewTrustMetricStore(historyDB, config, logger)
  81. err = store.Start(ctx)
  82. require.NoError(t, err)
  83. // Have the store make us a metric with the config
  84. tm := store.GetPeerTrustMetric(ctx, "TestKey")
  85. // Check that the options made it to the metric
  86. assert.Equal(t, 0.5, tm.proportionalWeight)
  87. assert.Equal(t, 0.5, tm.integralWeight)
  88. err = store.Stop()
  89. require.NoError(t, err)
  90. }
  91. func TestTrustMetricStoreLookup(t *testing.T) {
  92. ctx, cancel := context.WithCancel(context.Background())
  93. defer cancel()
  94. historyDB, err := dbm.NewDB("", "memdb", "")
  95. require.NoError(t, err)
  96. store := NewTrustMetricStore(historyDB, DefaultConfig(), log.TestingLogger())
  97. err = store.Start(ctx)
  98. require.NoError(t, err)
  99. // Create 100 peers in the trust metric store
  100. for i := 0; i < 100; i++ {
  101. key := fmt.Sprintf("peer_%d", i)
  102. store.GetPeerTrustMetric(ctx, key)
  103. // Check that the trust metric was successfully entered
  104. ktm := store.peerMetrics[key]
  105. assert.NotNil(t, ktm, "Expected to find TrustMetric %s but wasn't there.", key)
  106. }
  107. err = store.Stop()
  108. require.NoError(t, err)
  109. }
  110. func TestTrustMetricStorePeerScore(t *testing.T) {
  111. ctx, cancel := context.WithCancel(context.Background())
  112. defer cancel()
  113. historyDB, err := dbm.NewDB("", "memdb", "")
  114. require.NoError(t, err)
  115. store := NewTrustMetricStore(historyDB, DefaultConfig(), log.TestingLogger())
  116. err = store.Start(ctx)
  117. require.NoError(t, err)
  118. key := "TestKey"
  119. tm := store.GetPeerTrustMetric(ctx, key)
  120. // This peer is innocent so far
  121. first := tm.TrustScore()
  122. assert.Equal(t, 100, first)
  123. // Add some undesirable events and disconnect
  124. tm.BadEvents(1)
  125. first = tm.TrustScore()
  126. assert.NotEqual(t, 100, first)
  127. tm.BadEvents(10)
  128. second := tm.TrustScore()
  129. if second > first {
  130. t.Errorf("a greater number of bad events should lower the trust score")
  131. }
  132. store.PeerDisconnected(key)
  133. // We will remember our experiences with this peer
  134. tm = store.GetPeerTrustMetric(ctx, key)
  135. assert.NotEqual(t, 100, tm.TrustScore())
  136. err = store.Stop()
  137. require.NoError(t, err)
  138. }