package files_test
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/light"
|
|
lightErr "github.com/tendermint/tendermint/light/errors"
|
|
"github.com/tendermint/tendermint/light/files"
|
|
)
|
|
|
|
func checkEqual(stored, loaded light.FullCommit, chainID string) error {
|
|
err := loaded.ValidateBasic(chainID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !bytes.Equal(stored.ValidatorsHash(), loaded.ValidatorsHash()) {
|
|
return errors.New("Different block hashes")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func TestFileProvider(t *testing.T) {
|
|
assert, require := assert.New(t), require.New(t)
|
|
|
|
dir, err := ioutil.TempDir("", "fileprovider-test")
|
|
assert.Nil(err)
|
|
defer os.RemoveAll(dir)
|
|
p := files.NewProvider(dir)
|
|
|
|
chainID := "test-files"
|
|
appHash := []byte("some-data")
|
|
keys := light.GenValKeys(5)
|
|
count := 10
|
|
|
|
// make a bunch of seeds...
|
|
seeds := make([]light.FullCommit, count)
|
|
for i := 0; i < count; i++ {
|
|
// two seeds 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
|
|
check := keys.GenCommit(chainID, h, nil, vals, appHash, 0, 5)
|
|
seeds[i] = light.NewFullCommit(check, vals)
|
|
}
|
|
|
|
// check provider is empty
|
|
seed, err := p.GetByHeight(20)
|
|
require.NotNil(err)
|
|
assert.True(lightErr.IsCommitNotFoundErr(err))
|
|
|
|
seed, err = p.GetByHash(seeds[3].ValidatorsHash())
|
|
require.NotNil(err)
|
|
assert.True(lightErr.IsCommitNotFoundErr(err))
|
|
|
|
// now add them all to the provider
|
|
for _, s := range seeds {
|
|
err = p.StoreCommit(s)
|
|
require.Nil(err)
|
|
// and make sure we can get it back
|
|
s2, err := p.GetByHash(s.ValidatorsHash())
|
|
assert.Nil(err)
|
|
err = checkEqual(s, s2, chainID)
|
|
assert.Nil(err)
|
|
// by height as well
|
|
s2, err = p.GetByHeight(s.Height())
|
|
err = checkEqual(s, s2, chainID)
|
|
assert.Nil(err)
|
|
}
|
|
|
|
// make sure we get the last hash if we overstep
|
|
seed, err = p.GetByHeight(5000)
|
|
if assert.Nil(err, "%+v", err) {
|
|
assert.Equal(seeds[count-1].Height(), seed.Height())
|
|
err = checkEqual(seeds[count-1], seed, chainID)
|
|
assert.Nil(err)
|
|
}
|
|
|
|
// and middle ones as well
|
|
seed, err = p.GetByHeight(47)
|
|
if assert.Nil(err, "%+v", err) {
|
|
// we only step by 10, so 40 must be the one below this
|
|
assert.Equal(40, seed.Height())
|
|
}
|
|
|
|
// and proper error for too low
|
|
_, err = p.GetByHeight(5)
|
|
assert.NotNil(err)
|
|
assert.True(lightErr.IsCommitNotFoundErr(err))
|
|
}
|