package db
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
dbm "github.com/tendermint/tm-db"
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
tmrand "github.com/tendermint/tendermint/libs/rand"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
func TestLast_FirstSignedHeaderHeight(t *testing.T) {
|
|
dbStore := New(dbm.NewMemDB(), "TestLast_FirstSignedHeaderHeight")
|
|
vals, _ := types.RandValidatorSet(10, 100)
|
|
|
|
// Empty store
|
|
height, err := dbStore.LastSignedHeaderHeight()
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, -1, height)
|
|
|
|
height, err = dbStore.FirstSignedHeaderHeight()
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, -1, height)
|
|
|
|
// 1 key
|
|
err = dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: 1}}, vals)
|
|
require.NoError(t, err)
|
|
|
|
height, err = dbStore.LastSignedHeaderHeight()
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 1, height)
|
|
|
|
height, err = dbStore.FirstSignedHeaderHeight()
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 1, height)
|
|
}
|
|
|
|
func Test_SaveSignedHeaderAndValidatorSet(t *testing.T) {
|
|
dbStore := New(dbm.NewMemDB(), "Test_SaveSignedHeaderAndValidatorSet")
|
|
vals, _ := types.RandValidatorSet(10, 100)
|
|
// Empty store
|
|
h, err := dbStore.SignedHeader(1)
|
|
require.Error(t, err)
|
|
assert.Nil(t, h)
|
|
|
|
valSet, err := dbStore.ValidatorSet(1)
|
|
require.Error(t, err)
|
|
assert.Nil(t, valSet)
|
|
|
|
// 1 key
|
|
pa := vals.Validators[0].Address
|
|
err = dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: 1, ProposerAddress: pa}}, vals)
|
|
require.NoError(t, err)
|
|
|
|
h, err = dbStore.SignedHeader(1)
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, h)
|
|
|
|
valSet, err = dbStore.ValidatorSet(1)
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, valSet)
|
|
|
|
// Empty store
|
|
err = dbStore.DeleteSignedHeaderAndValidatorSet(1)
|
|
require.NoError(t, err)
|
|
|
|
h, err = dbStore.SignedHeader(1)
|
|
require.Error(t, err)
|
|
assert.Nil(t, h)
|
|
|
|
valSet, err = dbStore.ValidatorSet(1)
|
|
require.Error(t, err)
|
|
assert.Nil(t, valSet)
|
|
}
|
|
|
|
func Test_SignedHeaderBefore(t *testing.T) {
|
|
dbStore := New(dbm.NewMemDB(), "Test_SignedHeaderBefore")
|
|
valSet, _ := types.RandValidatorSet(10, 100)
|
|
pa := valSet.Proposer.Address
|
|
|
|
assert.Panics(t, func() {
|
|
_, _ = dbStore.SignedHeaderBefore(0)
|
|
_, _ = dbStore.SignedHeaderBefore(100)
|
|
})
|
|
|
|
err := dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: 2, ProposerAddress: pa}}, valSet)
|
|
require.NoError(t, err)
|
|
|
|
h, err := dbStore.SignedHeaderBefore(3)
|
|
require.NoError(t, err)
|
|
if assert.NotNil(t, h) {
|
|
assert.EqualValues(t, 2, h.Height)
|
|
}
|
|
}
|
|
|
|
func Test_Prune(t *testing.T) {
|
|
dbStore := New(dbm.NewMemDB(), "Test_Prune")
|
|
valSet, _ := types.RandValidatorSet(10, 100)
|
|
|
|
// Empty store
|
|
assert.EqualValues(t, 0, dbStore.Size())
|
|
err := dbStore.Prune(0)
|
|
require.NoError(t, err)
|
|
|
|
// One header
|
|
err = dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: 2}}, valSet)
|
|
require.NoError(t, err)
|
|
|
|
assert.EqualValues(t, 1, dbStore.Size())
|
|
|
|
err = dbStore.Prune(1)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 1, dbStore.Size())
|
|
|
|
err = dbStore.Prune(0)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 0, dbStore.Size())
|
|
|
|
// Multiple headers
|
|
for i := 1; i <= 10; i++ {
|
|
err = dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: int64(i)}}, valSet)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
err = dbStore.Prune(11)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 10, dbStore.Size())
|
|
|
|
err = dbStore.Prune(7)
|
|
require.NoError(t, err)
|
|
assert.EqualValues(t, 7, dbStore.Size())
|
|
}
|
|
|
|
func Test_Concurrency(t *testing.T) {
|
|
dbStore := New(dbm.NewMemDB(), "Test_Prune")
|
|
vals, _ := types.RandValidatorSet(10, 100)
|
|
|
|
var wg sync.WaitGroup
|
|
for i := 1; i <= 100; i++ {
|
|
wg.Add(1)
|
|
go func(i int64) {
|
|
defer wg.Done()
|
|
|
|
err := dbStore.SaveSignedHeaderAndValidatorSet(
|
|
&types.SignedHeader{Header: &types.Header{Height: i,
|
|
ProposerAddress: tmrand.Bytes(crypto.AddressSize)}}, vals)
|
|
require.NoError(t, err)
|
|
|
|
_, err = dbStore.SignedHeader(i)
|
|
if err != nil {
|
|
t.Log(err)
|
|
}
|
|
_, err = dbStore.ValidatorSet(i)
|
|
if err != nil {
|
|
t.Log(err) // could not find validator set
|
|
}
|
|
_, err = dbStore.LastSignedHeaderHeight()
|
|
if err != nil {
|
|
t.Log(err)
|
|
}
|
|
_, err = dbStore.FirstSignedHeaderHeight()
|
|
if err != nil {
|
|
t.Log(err)
|
|
}
|
|
|
|
err = dbStore.Prune(2)
|
|
if err != nil {
|
|
t.Log(err)
|
|
}
|
|
_ = dbStore.Size()
|
|
|
|
err = dbStore.DeleteSignedHeaderAndValidatorSet(1)
|
|
if err != nil {
|
|
t.Log(err)
|
|
}
|
|
}(int64(i))
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|