package types import ( "context" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" ) func TestValidatorProtoBuf(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() val, _, err := randValidator(ctx, true, 100) require.NoError(t, err) testCases := []struct { msg string v1 *Validator expPass1 bool expPass2 bool }{ {"success validator", val, true, true}, {"failure empty", &Validator{}, false, false}, {"failure nil", nil, false, false}, } for _, tc := range testCases { protoVal, err := tc.v1.ToProto() if tc.expPass1 { require.NoError(t, err, tc.msg) } else { require.Error(t, err, tc.msg) } val, err := ValidatorFromProto(protoVal) if tc.expPass2 { require.NoError(t, err, tc.msg) require.Equal(t, tc.v1, val, tc.msg) } else { require.Error(t, err, tc.msg) } } } func TestValidatorValidateBasic(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() priv := NewMockPV() pubKey, _ := priv.GetPubKey(ctx) testCases := []struct { val *Validator err bool msg string }{ { val: NewValidator(pubKey, 1), err: false, msg: "", }, { val: nil, err: true, msg: "nil validator", }, { val: &Validator{ PubKey: nil, }, err: true, msg: "validator does not have a public key", }, { val: NewValidator(pubKey, -1), err: true, msg: "validator has negative voting power", }, { val: &Validator{ PubKey: pubKey, Address: nil, }, err: true, msg: "validator address is the wrong size: ", }, { val: &Validator{ PubKey: pubKey, Address: []byte{'a'}, }, err: true, msg: "validator address is the wrong size: 61", }, } for _, tc := range testCases { err := tc.val.ValidateBasic() if tc.err { if assert.Error(t, err) { assert.Equal(t, tc.msg, err.Error()) } } else { assert.NoError(t, err) } } } // Testing util functions // deterministicValidator returns a deterministic validator, useful for testing. // UNSTABLE func deterministicValidator(ctx context.Context, t *testing.T, key crypto.PrivKey) (*Validator, PrivValidator) { t.Helper() privVal := NewMockPV() privVal.PrivKey = key var votePower int64 = 50 pubKey, err := privVal.GetPubKey(ctx) require.NoError(t, err, "could not retrieve pubkey") val := NewValidator(pubKey, votePower) return val, privVal }