diff --git a/evidence/pool.go b/evidence/pool.go index 0f296f464..bfc04f44b 100644 --- a/evidence/pool.go +++ b/evidence/pool.go @@ -1,4 +1,4 @@ -package evpool +package evidence import ( "github.com/tendermint/tmlibs/log" @@ -60,10 +60,8 @@ func (evpool *EvidencePool) AddEvidence(evidence types.Evidence) (err error) { return err } - added, err := evpool.evidenceStore.AddNewEvidence(evidence, priority) - if err != nil { - return err - } else if !added { + added := evpool.evidenceStore.AddNewEvidence(evidence, priority) + if !added { // evidence already known, just ignore return } diff --git a/evidence/pool_test.go b/evidence/pool_test.go new file mode 100644 index 000000000..2908bb425 --- /dev/null +++ b/evidence/pool_test.go @@ -0,0 +1,54 @@ +package evidence + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/assert" + + cfg "github.com/tendermint/tendermint/config" + "github.com/tendermint/tendermint/types" + dbm "github.com/tendermint/tmlibs/db" +) + +type mockState struct{} + +func (m mockState) VerifyEvidence(ev types.Evidence) (int, error) { + err := ev.Verify("") + return 10, err +} + +func TestEvidencePool(t *testing.T) { + assert := assert.New(t) + + config := &cfg.EvidenceConfig{} + store := NewEvidenceStore(dbm.NewMemDB()) + state := mockState{} + pool := NewEvidencePool(config, store, state) + + goodEvidence := newMockGoodEvidence(5, 1, []byte("val1")) + badEvidence := MockBadEvidence{goodEvidence} + + err := pool.AddEvidence(badEvidence) + assert.NotNil(err) + + var wg sync.WaitGroup + wg.Add(1) + go func() { + <-pool.EvidenceChan() + wg.Done() + }() + + err = pool.AddEvidence(goodEvidence) + assert.Nil(err) + wg.Wait() + + // if we send it again it wont fire on the chan + err = pool.AddEvidence(goodEvidence) + assert.Nil(err) + select { + case <-pool.EvidenceChan(): + t.Fatal("unexpected read on EvidenceChan") + default: + } +} diff --git a/evidence/reactor.go b/evidence/reactor.go index f6e7501aa..9ea5f9a50 100644 --- a/evidence/reactor.go +++ b/evidence/reactor.go @@ -1,4 +1,4 @@ -package evpool +package evidence import ( "bytes" diff --git a/evidence/store.go b/evidence/store.go index 1b4708eaf..fa070303b 100644 --- a/evidence/store.go +++ b/evidence/store.go @@ -1,4 +1,4 @@ -package evpool +package evidence import ( "fmt" @@ -124,11 +124,11 @@ func (store *EvidenceStore) GetEvidence(height int, hash []byte) *EvidenceInfo { } // AddNewEvidence adds the given evidence to the database. -func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int) (bool, error) { +func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int) bool { // check if we already have seen it ei_ := store.GetEvidence(evidence.Height(), evidence.Hash()) if ei_ != nil && ei_.Evidence != nil { - return false, nil + return false } ei := EvidenceInfo{ @@ -148,7 +148,7 @@ func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int key = keyLookup(evidence) store.db.SetSync(key, eiBytes) - return true, nil + return true } // MarkEvidenceAsBroadcasted removes evidence from Outqueue. diff --git a/evidence/store_test.go b/evidence/store_test.go index 76cb794a7..6cd9b244e 100644 --- a/evidence/store_test.go +++ b/evidence/store_test.go @@ -1,4 +1,4 @@ -package evpool +package evidence import ( "bytes" @@ -22,13 +22,11 @@ func TestStoreAddDuplicate(t *testing.T) { priority := 10 ev := newMockGoodEvidence(2, 1, []byte("val1")) - added, err := store.AddNewEvidence(ev, priority) - assert.Nil(err) + added := store.AddNewEvidence(ev, priority) assert.True(added) // cant add twice - added, err = store.AddNewEvidence(ev, priority) - assert.Nil(err) + added = store.AddNewEvidence(ev, priority) assert.False(added) } @@ -47,8 +45,7 @@ func TestStoreMark(t *testing.T) { priority := 10 ev := newMockGoodEvidence(2, 1, []byte("val1")) - added, err := store.AddNewEvidence(ev, priority) - assert.Nil(err) + added := store.AddNewEvidence(ev, priority) assert.True(added) // get the evidence. verify. should be uncommitted @@ -104,9 +101,8 @@ func TestStorePriority(t *testing.T) { } for _, c := range cases { - added, err := store.AddNewEvidence(c.ev, c.priority) + added := store.AddNewEvidence(c.ev, c.priority) assert.True(added) - assert.Nil(err) } evList := store.PriorityEvidence() diff --git a/node/node.go b/node/node.go index 0d20df66b..8134074ab 100644 --- a/node/node.go +++ b/node/node.go @@ -19,7 +19,7 @@ import ( bc "github.com/tendermint/tendermint/blockchain" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/consensus" - evidence "github.com/tendermint/tendermint/evidence" + "github.com/tendermint/tendermint/evidence" mempl "github.com/tendermint/tendermint/mempool" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/p2p/trust"