package lite import ( "testing" "github.com/stretchr/testify/assert" "github.com/tendermint/tendermint/crypto/tmhash" lerr "github.com/tendermint/tendermint/lite/errors" "github.com/tendermint/tendermint/types" ) func TestBaseCert(t *testing.T) { // TODO: Requires proposer address to be set in header. t.SkipNow() 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, tmhash.Sum([]byte("foo")), tmhash.Sum([]byte("params")), tmhash.Sum([]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) } } } }