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.

164 lines
4.3 KiB

  1. package evidence
  2. import (
  3. "bytes"
  4. "fmt"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. wire "github.com/tendermint/go-wire"
  8. "github.com/tendermint/tendermint/types"
  9. dbm "github.com/tendermint/tmlibs/db"
  10. )
  11. //-------------------------------------------
  12. func TestStoreAddDuplicate(t *testing.T) {
  13. assert := assert.New(t)
  14. db := dbm.NewMemDB()
  15. store := NewEvidenceStore(db)
  16. priority := int64(10)
  17. ev := newMockGoodEvidence(2, 1, []byte("val1"))
  18. added := store.AddNewEvidence(ev, priority)
  19. assert.True(added)
  20. // cant add twice
  21. added = store.AddNewEvidence(ev, priority)
  22. assert.False(added)
  23. }
  24. func TestStoreMark(t *testing.T) {
  25. assert := assert.New(t)
  26. db := dbm.NewMemDB()
  27. store := NewEvidenceStore(db)
  28. // before we do anything, priority/pending are empty
  29. priorityEv := store.PriorityEvidence()
  30. pendingEv := store.PendingEvidence()
  31. assert.Equal(0, len(priorityEv))
  32. assert.Equal(0, len(pendingEv))
  33. priority := int64(10)
  34. ev := newMockGoodEvidence(2, 1, []byte("val1"))
  35. added := store.AddNewEvidence(ev, priority)
  36. assert.True(added)
  37. // get the evidence. verify. should be uncommitted
  38. ei := store.GetEvidence(ev.Height(), ev.Hash())
  39. assert.Equal(ev, ei.Evidence)
  40. assert.Equal(priority, ei.Priority)
  41. assert.False(ei.Committed)
  42. // new evidence should be returns in priority/pending
  43. priorityEv = store.PriorityEvidence()
  44. pendingEv = store.PendingEvidence()
  45. assert.Equal(1, len(priorityEv))
  46. assert.Equal(1, len(pendingEv))
  47. // priority is now empty
  48. store.MarkEvidenceAsBroadcasted(ev)
  49. priorityEv = store.PriorityEvidence()
  50. pendingEv = store.PendingEvidence()
  51. assert.Equal(0, len(priorityEv))
  52. assert.Equal(1, len(pendingEv))
  53. // priority and pending are now empty
  54. store.MarkEvidenceAsCommitted(ev)
  55. priorityEv = store.PriorityEvidence()
  56. pendingEv = store.PendingEvidence()
  57. assert.Equal(0, len(priorityEv))
  58. assert.Equal(0, len(pendingEv))
  59. // evidence should show committed
  60. ei = store.GetEvidence(ev.Height(), ev.Hash())
  61. assert.Equal(ev, ei.Evidence)
  62. assert.Equal(priority, ei.Priority)
  63. assert.True(ei.Committed)
  64. }
  65. func TestStorePriority(t *testing.T) {
  66. assert := assert.New(t)
  67. db := dbm.NewMemDB()
  68. store := NewEvidenceStore(db)
  69. // sorted by priority and then height
  70. cases := []struct {
  71. ev MockGoodEvidence
  72. priority int64
  73. }{
  74. {newMockGoodEvidence(2, 1, []byte("val1")), 17},
  75. {newMockGoodEvidence(5, 2, []byte("val2")), 15},
  76. {newMockGoodEvidence(10, 2, []byte("val2")), 13},
  77. {newMockGoodEvidence(100, 2, []byte("val2")), 11},
  78. {newMockGoodEvidence(90, 2, []byte("val2")), 11},
  79. {newMockGoodEvidence(80, 2, []byte("val2")), 11},
  80. }
  81. for _, c := range cases {
  82. added := store.AddNewEvidence(c.ev, c.priority)
  83. assert.True(added)
  84. }
  85. evList := store.PriorityEvidence()
  86. for i, ev := range evList {
  87. assert.Equal(ev, cases[i].ev)
  88. }
  89. }
  90. //-------------------------------------------
  91. const (
  92. evidenceTypeMock = byte(0x01)
  93. )
  94. var _ = wire.RegisterInterface(
  95. struct{ types.Evidence }{},
  96. wire.ConcreteType{MockGoodEvidence{}, evidenceTypeMock},
  97. )
  98. type MockGoodEvidence struct {
  99. Height_ int64
  100. Address_ []byte
  101. Index_ int
  102. }
  103. func newMockGoodEvidence(height int64, index int, address []byte) MockGoodEvidence {
  104. return MockGoodEvidence{height, address, index}
  105. }
  106. func (e MockGoodEvidence) Height() int64 { return e.Height_ }
  107. func (e MockGoodEvidence) Address() []byte { return e.Address_ }
  108. func (e MockGoodEvidence) Index() int { return e.Index_ }
  109. func (e MockGoodEvidence) Hash() []byte {
  110. return []byte(fmt.Sprintf("%d-%d", e.Height_, e.Index_))
  111. }
  112. func (e MockGoodEvidence) Verify(chainID string) error { return nil }
  113. func (e MockGoodEvidence) Equal(ev types.Evidence) bool {
  114. e2 := ev.(MockGoodEvidence)
  115. return e.Height_ == e2.Height_ &&
  116. bytes.Equal(e.Address_, e2.Address_) &&
  117. e.Index_ == e2.Index_
  118. }
  119. func (e MockGoodEvidence) String() string {
  120. return fmt.Sprintf("GoodEvidence: %d/%s/%d", e.Height_, e.Address_, e.Index_)
  121. }
  122. type MockBadEvidence struct {
  123. MockGoodEvidence
  124. }
  125. func (e MockBadEvidence) Verify(chainID string) error { return fmt.Errorf("MockBadEvidence") }
  126. func (e MockBadEvidence) Equal(ev types.Evidence) bool {
  127. e2 := ev.(MockBadEvidence)
  128. return e.Height_ == e2.Height_ &&
  129. bytes.Equal(e.Address_, e2.Address_) &&
  130. e.Index_ == e2.Index_
  131. }
  132. func (e MockBadEvidence) String() string {
  133. return fmt.Sprintf("BadEvidence: %d/%s/%d", e.Height_, e.Address_, e.Index_)
  134. }