github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/staking/genesis_test.go (about) 1 package staking 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto/ed25519" 8 9 "github.com/stretchr/testify/assert" 10 11 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 12 "github.com/stretchr/testify/require" 13 14 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 15 keep "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/keeper" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types" 17 ) 18 19 func TestInitGenesis(t *testing.T) { 20 ctx, accKeeper, keeper, supplyKeeper := keep.CreateTestInput(t, false, 1000) 21 22 valTokens := sdk.TokensFromConsensusPower(1) 23 24 params := keeper.GetParams(ctx) 25 validators := make([]Validator, 2) 26 var delegations []Delegation 27 28 // initialize the validators 29 validators[0].OperatorAddress = sdk.ValAddress(keep.Addrs[0]) 30 validators[0].ConsPubKey = keep.PKs[0] 31 validators[0].Description = NewDescription("hoop", "", "", "", "") 32 validators[0].Status = sdk.Bonded 33 validators[0].Tokens = valTokens 34 validators[0].DelegatorShares = valTokens.ToDec() 35 validators[1].OperatorAddress = sdk.ValAddress(keep.Addrs[1]) 36 validators[1].ConsPubKey = keep.PKs[1] 37 validators[1].Description = NewDescription("bloop", "", "", "", "") 38 validators[1].Status = sdk.Bonded 39 validators[1].Tokens = valTokens 40 validators[1].DelegatorShares = valTokens.ToDec() 41 42 genesisState := types.NewGenesisState(params, validators, delegations) 43 vals := InitGenesis(ctx, keeper, accKeeper, supplyKeeper, genesisState) 44 45 actualGenesis := ExportGenesis(ctx, keeper) 46 require.Equal(t, genesisState.Params, actualGenesis.Params) 47 require.Equal(t, genesisState.Delegations, actualGenesis.Delegations) 48 require.EqualValues(t, keeper.GetAllValidators(ctx), actualGenesis.Validators) 49 50 // now make sure the validators are bonded and intra-tx counters are correct 51 resVal, found := keeper.GetValidator(ctx, sdk.ValAddress(keep.Addrs[0])) 52 require.True(t, found) 53 require.Equal(t, sdk.Bonded, resVal.Status) 54 55 resVal, found = keeper.GetValidator(ctx, sdk.ValAddress(keep.Addrs[1])) 56 require.True(t, found) 57 require.Equal(t, sdk.Bonded, resVal.Status) 58 59 abcivals := make([]abci.ValidatorUpdate, len(vals)) 60 for i, val := range validators { 61 abcivals[i] = val.ABCIValidatorUpdate() 62 } 63 64 require.Equal(t, abcivals, vals) 65 } 66 67 func TestInitGenesisLargeValidatorSet(t *testing.T) { 68 size := 200 69 require.True(t, size > 100) 70 71 ctx, accKeeper, keeper, supplyKeeper := keep.CreateTestInput(t, false, 1000) 72 73 params := keeper.GetParams(ctx) 74 delegations := []Delegation{} 75 validators := make([]Validator, size) 76 77 for i := range validators { 78 validators[i] = NewValidator(sdk.ValAddress(keep.Addrs[i]), 79 keep.PKs[i], NewDescription(fmt.Sprintf("#%d", i), "", "", "", "")) 80 81 validators[i].Status = sdk.Bonded 82 83 tokens := sdk.TokensFromConsensusPower(1) 84 if i < 100 { 85 tokens = sdk.TokensFromConsensusPower(2) 86 } 87 validators[i].Tokens = tokens 88 validators[i].DelegatorShares = tokens.ToDec() 89 } 90 91 genesisState := types.NewGenesisState(params, validators, delegations) 92 vals := InitGenesis(ctx, keeper, accKeeper, supplyKeeper, genesisState) 93 94 abcivals := make([]abci.ValidatorUpdate, 100) 95 for i, val := range validators[:100] { 96 abcivals[i] = val.ABCIValidatorUpdate() 97 } 98 99 require.Equal(t, abcivals, vals) 100 } 101 102 func TestValidateGenesis(t *testing.T) { 103 genValidators1 := make([]types.Validator, 1, 5) 104 pk := ed25519.GenPrivKey().PubKey() 105 genValidators1[0] = types.NewValidator(sdk.ValAddress(pk.Address()), pk, types.NewDescription("", "", "", "", "")) 106 genValidators1[0].Tokens = sdk.OneInt() 107 genValidators1[0].DelegatorShares = sdk.OneDec() 108 109 tests := []struct { 110 name string 111 mutate func(*types.GenesisState) 112 wantErr bool 113 }{ 114 {"default", func(*types.GenesisState) {}, false}, 115 // validate genesis validators 116 {"duplicate validator", func(data *types.GenesisState) { 117 data.Validators = genValidators1 118 data.Validators = append(data.Validators, genValidators1[0]) 119 }, true}, 120 {"no delegator shares", func(data *types.GenesisState) { 121 data.Validators = genValidators1 122 data.Validators[0].DelegatorShares = sdk.ZeroDec() 123 }, true}, 124 {"jailed and bonded validator", func(data *types.GenesisState) { 125 data.Validators = genValidators1 126 data.Validators[0].Jailed = true 127 data.Validators[0].Status = sdk.Bonded 128 }, true}, 129 } 130 131 for _, tt := range tests { 132 tt := tt 133 t.Run(tt.name, func(t *testing.T) { 134 genesisState := types.DefaultGenesisState() 135 tt.mutate(&genesisState) 136 if tt.wantErr { 137 assert.Error(t, ValidateGenesis(genesisState)) 138 } else { 139 assert.NoError(t, ValidateGenesis(genesisState)) 140 } 141 }) 142 } 143 }