github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/types/validator_test.go (about)

     1  package types
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/ari-anchor/sei-tendermint/crypto"
    11  )
    12  
    13  func TestValidatorProtoBuf(t *testing.T) {
    14  	ctx, cancel := context.WithCancel(context.Background())
    15  	defer cancel()
    16  
    17  	val, _, err := randValidator(ctx, true, 100)
    18  	require.NoError(t, err)
    19  
    20  	testCases := []struct {
    21  		msg      string
    22  		v1       *Validator
    23  		expPass1 bool
    24  		expPass2 bool
    25  	}{
    26  		{"success validator", val, true, true},
    27  		{"failure empty", &Validator{}, false, false},
    28  		{"failure nil", nil, false, false},
    29  	}
    30  	for _, tc := range testCases {
    31  		protoVal, err := tc.v1.ToProto()
    32  
    33  		if tc.expPass1 {
    34  			require.NoError(t, err, tc.msg)
    35  		} else {
    36  			require.Error(t, err, tc.msg)
    37  		}
    38  
    39  		val, err := ValidatorFromProto(protoVal)
    40  		if tc.expPass2 {
    41  			require.NoError(t, err, tc.msg)
    42  			require.Equal(t, tc.v1, val, tc.msg)
    43  		} else {
    44  			require.Error(t, err, tc.msg)
    45  		}
    46  	}
    47  }
    48  
    49  func TestValidatorValidateBasic(t *testing.T) {
    50  	ctx, cancel := context.WithCancel(context.Background())
    51  	defer cancel()
    52  
    53  	priv := NewMockPV()
    54  	pubKey, _ := priv.GetPubKey(ctx)
    55  	testCases := []struct {
    56  		val *Validator
    57  		err bool
    58  		msg string
    59  	}{
    60  		{
    61  			val: NewValidator(pubKey, 1),
    62  			err: false,
    63  			msg: "",
    64  		},
    65  		{
    66  			val: nil,
    67  			err: true,
    68  			msg: "nil validator",
    69  		},
    70  		{
    71  			val: &Validator{
    72  				PubKey: nil,
    73  			},
    74  			err: true,
    75  			msg: "validator does not have a public key",
    76  		},
    77  		{
    78  			val: NewValidator(pubKey, -1),
    79  			err: true,
    80  			msg: "validator has negative voting power",
    81  		},
    82  		{
    83  			val: &Validator{
    84  				PubKey:  pubKey,
    85  				Address: nil,
    86  			},
    87  			err: true,
    88  			msg: "validator address is the wrong size: ",
    89  		},
    90  		{
    91  			val: &Validator{
    92  				PubKey:  pubKey,
    93  				Address: []byte{'a'},
    94  			},
    95  			err: true,
    96  			msg: "validator address is the wrong size: 61",
    97  		},
    98  	}
    99  
   100  	for _, tc := range testCases {
   101  		err := tc.val.ValidateBasic()
   102  		if tc.err {
   103  			if assert.Error(t, err) {
   104  				assert.Equal(t, tc.msg, err.Error())
   105  			}
   106  		} else {
   107  			assert.NoError(t, err)
   108  		}
   109  	}
   110  }
   111  
   112  // Testing util functions
   113  
   114  // deterministicValidator returns a deterministic validator, useful for testing.
   115  // UNSTABLE
   116  func deterministicValidator(ctx context.Context, t *testing.T, key crypto.PrivKey) (*Validator, PrivValidator) {
   117  	t.Helper()
   118  	privVal := NewMockPV()
   119  	privVal.PrivKey = key
   120  	var votePower int64 = 50
   121  	pubKey, err := privVal.GetPubKey(ctx)
   122  	require.NoError(t, err, "could not retrieve pubkey")
   123  	val := NewValidator(pubKey, votePower)
   124  	return val, privVal
   125  }