package lite
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
lerr "github.com/tendermint/tendermint/lite/errors"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
func TestBaseCert(t *testing.T) {
|
|
assert := assert.New(t)
|
|
|
|
keys := genPrivKeys(4)
|
|
// 20, 30, 40, 50 - the first 3 don't have 2/3, the last 3 do!
|
|
vals := keys.ToValidators(20, 10)
|
|
// and a Verifier based on our known set
|
|
chainID := "test-static"
|
|
cert := NewBaseVerifier(chainID, 2, vals)
|
|
|
|
cases := []struct {
|
|
keys privKeys
|
|
vals *types.ValidatorSet
|
|
height int64
|
|
first, last int // who actually signs
|
|
proper bool // true -> expect no error
|
|
changed bool // true -> expect validator change error
|
|
}{
|
|
// height regression
|
|
{keys, vals, 1, 0, len(keys), false, false},
|
|
// perfect, signed by everyone
|
|
{keys, vals, 2, 0, len(keys), true, false},
|
|
// skip little guy is okay
|
|
{keys, vals, 3, 1, len(keys), true, false},
|
|
// but not the big guy
|
|
{keys, vals, 4, 0, len(keys) - 1, false, false},
|
|
// Changing the power a little bit breaks the static validator.
|
|
// The sigs are enough, but the validator hash is unknown.
|
|
{keys, keys.ToValidators(20, 11), 5, 0, len(keys), false, true},
|
|
}
|
|
|
|
for _, tc := range cases {
|
|
sh := tc.keys.GenSignedHeader(chainID, tc.height, nil, tc.vals, tc.vals,
|
|
[]byte("foo"), []byte("params"), []byte("results"), tc.first, tc.last)
|
|
err := cert.Verify(sh)
|
|
if tc.proper {
|
|
assert.Nil(err, "%+v", err)
|
|
} else {
|
|
assert.NotNil(err)
|
|
if tc.changed {
|
|
assert.True(lerr.IsErrUnexpectedValidators(err), "%+v", err)
|
|
}
|
|
}
|
|
}
|
|
}
|