package evidence
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
sm "github.com/tendermint/tendermint/state"
|
|
"github.com/tendermint/tendermint/types"
|
|
dbm "github.com/tendermint/tmlibs/db"
|
|
)
|
|
|
|
var mockState = sm.State{}
|
|
|
|
func initializeValidatorState(valAddr []byte, height int64) dbm.DB {
|
|
stateDB := dbm.NewMemDB()
|
|
|
|
// create validator set and state
|
|
valSet := &types.ValidatorSet{
|
|
Validators: []*types.Validator{
|
|
{Address: valAddr},
|
|
},
|
|
}
|
|
state := sm.State{
|
|
LastBlockHeight: 0,
|
|
LastBlockTime: time.Now(),
|
|
Validators: valSet,
|
|
LastHeightValidatorsChanged: 1,
|
|
ConsensusParams: types.ConsensusParams{
|
|
EvidenceParams: types.EvidenceParams{
|
|
MaxAge: 1000000,
|
|
},
|
|
},
|
|
}
|
|
|
|
// save all states up to height
|
|
for i := int64(0); i < height; i++ {
|
|
state.LastBlockHeight = i
|
|
sm.SaveState(stateDB, state)
|
|
}
|
|
|
|
return stateDB
|
|
}
|
|
|
|
func TestEvidencePool(t *testing.T) {
|
|
assert := assert.New(t)
|
|
|
|
valAddr := []byte("val1")
|
|
height := int64(5)
|
|
stateDB := initializeValidatorState(valAddr, height)
|
|
store := NewEvidenceStore(dbm.NewMemDB())
|
|
pool := NewEvidencePool(stateDB, store)
|
|
|
|
goodEvidence := newMockGoodEvidence(height, 0, valAddr)
|
|
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:
|
|
}
|
|
}
|