package certifiers_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/certifiers"
|
|
"github.com/tendermint/tendermint/certifiers/errors"
|
|
)
|
|
|
|
func TestMemProvider(t *testing.T) {
|
|
p := certifiers.NewMemStoreProvider()
|
|
checkProvider(t, p, "test-mem", "empty")
|
|
}
|
|
|
|
func TestCacheProvider(t *testing.T) {
|
|
p := certifiers.NewCacheProvider(
|
|
certifiers.NewMissingProvider(),
|
|
certifiers.NewMemStoreProvider(),
|
|
certifiers.NewMissingProvider(),
|
|
)
|
|
checkProvider(t, p, "test-cache", "kjfhekfhkewhgit")
|
|
}
|
|
|
|
func checkProvider(t *testing.T, p certifiers.Provider, chainID, app string) {
|
|
assert, require := assert.New(t), require.New(t)
|
|
appHash := []byte(app)
|
|
keys := certifiers.GenValKeys(5)
|
|
count := 10
|
|
|
|
// make a bunch of commits...
|
|
commits := make([]certifiers.FullCommit, count)
|
|
for i := 0; i < count; i++ {
|
|
// two commits for each validator, to check how we handle dups
|
|
// (10, 0), (10, 1), (10, 1), (10, 2), (10, 2), ...
|
|
vals := keys.ToValidators(10, int64(count/2))
|
|
h := 20 + 10*i
|
|
commits[i] = keys.GenFullCommit(chainID, h, nil, vals, appHash, 0, 5)
|
|
}
|
|
|
|
// check provider is empty
|
|
fc, err := p.GetByHeight(20)
|
|
require.NotNil(err)
|
|
assert.True(errors.IsCommitNotFoundErr(err))
|
|
|
|
fc, err = p.GetByHash(commits[3].ValidatorsHash())
|
|
require.NotNil(err)
|
|
assert.True(errors.IsCommitNotFoundErr(err))
|
|
|
|
// now add them all to the provider
|
|
for _, s := range commits {
|
|
err = p.StoreCommit(s)
|
|
require.Nil(err)
|
|
// and make sure we can get it back
|
|
s2, err := p.GetByHash(s.ValidatorsHash())
|
|
assert.Nil(err)
|
|
assert.Equal(s, s2)
|
|
// by height as well
|
|
s2, err = p.GetByHeight(s.Height())
|
|
assert.Nil(err)
|
|
assert.Equal(s, s2)
|
|
}
|
|
|
|
// make sure we get the last hash if we overstep
|
|
fc, err = p.GetByHeight(5000)
|
|
if assert.Nil(err) {
|
|
assert.Equal(commits[count-1].Height(), fc.Height())
|
|
assert.Equal(commits[count-1], fc)
|
|
}
|
|
|
|
// and middle ones as well
|
|
fc, err = p.GetByHeight(47)
|
|
if assert.Nil(err) {
|
|
// we only step by 10, so 40 must be the one below this
|
|
assert.Equal(40, fc.Height())
|
|
}
|
|
|
|
}
|
|
|
|
// this will make a get height, and if it is good, set the data as well
|
|
func checkGetHeight(t *testing.T, p certifiers.Provider, ask, expect int) {
|
|
fc, err := p.GetByHeight(ask)
|
|
require.Nil(t, err, "%+v", err)
|
|
if assert.Equal(t, expect, fc.Height()) {
|
|
err = p.StoreCommit(fc)
|
|
require.Nil(t, err, "%+v", err)
|
|
}
|
|
}
|
|
|
|
func TestCacheGetsBestHeight(t *testing.T) {
|
|
// assert, require := assert.New(t), require.New(t)
|
|
require := require.New(t)
|
|
|
|
// we will write data to the second level of the cache (p2),
|
|
// and see what gets cached, stored in
|
|
p := certifiers.NewMemStoreProvider()
|
|
p2 := certifiers.NewMemStoreProvider()
|
|
cp := certifiers.NewCacheProvider(p, p2)
|
|
|
|
chainID := "cache-best-height"
|
|
appHash := []byte("01234567")
|
|
keys := certifiers.GenValKeys(5)
|
|
count := 10
|
|
|
|
// set a bunch of commits
|
|
for i := 0; i < count; i++ {
|
|
vals := keys.ToValidators(10, int64(count/2))
|
|
h := 10 * (i + 1)
|
|
fc := keys.GenFullCommit(chainID, h, nil, vals, appHash, 0, 5)
|
|
err := p2.StoreCommit(fc)
|
|
require.NoError(err)
|
|
}
|
|
|
|
// let's get a few heights from the cache and set them proper
|
|
checkGetHeight(t, cp, 57, 50)
|
|
checkGetHeight(t, cp, 33, 30)
|
|
|
|
// make sure they are set in p as well (but nothing else)
|
|
checkGetHeight(t, p, 44, 30)
|
|
checkGetHeight(t, p, 50, 50)
|
|
checkGetHeight(t, p, 99, 50)
|
|
|
|
// now, query the cache for a higher value
|
|
checkGetHeight(t, p2, 99, 90)
|
|
checkGetHeight(t, cp, 99, 90)
|
|
}
|