github.com/Finschia/finschia-sdk@v0.48.1/x/staking/teststaking/helper.go (about) 1 package teststaking 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/require" 8 9 cryptotypes "github.com/Finschia/finschia-sdk/crypto/types" 10 sdk "github.com/Finschia/finschia-sdk/types" 11 "github.com/Finschia/finschia-sdk/x/staking" 12 "github.com/Finschia/finschia-sdk/x/staking/keeper" 13 stakingtypes "github.com/Finschia/finschia-sdk/x/staking/types" 14 ) 15 16 // Helper is a structure which wraps the staking handler 17 // and provides methods useful in tests 18 type Helper struct { 19 t *testing.T 20 h sdk.Handler 21 k keeper.Keeper 22 23 Ctx sdk.Context 24 Commission stakingtypes.CommissionRates 25 // Coin Denomination 26 Denom string 27 } 28 29 // NewHelper creates staking Handler wrapper for tests 30 func NewHelper(t *testing.T, ctx sdk.Context, k keeper.Keeper) *Helper { 31 return &Helper{t, staking.NewHandler(k), k, ctx, ZeroCommission(), sdk.DefaultBondDenom} 32 } 33 34 // CreateValidator calls handler to create a new staking validator 35 func (sh *Helper) CreateValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int, ok bool) { 36 coin := sdk.NewCoin(sh.Denom, stakeAmount) 37 sh.createValidator(addr, pk, coin, ok) 38 } 39 40 // CreateValidatorWithValPower calls handler to create a new staking validator with zero 41 // commission 42 func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotypes.PubKey, valPower int64, ok bool) sdk.Int { 43 amount := sh.k.TokensFromConsensusPower(sh.Ctx, valPower) 44 coin := sdk.NewCoin(sh.Denom, amount) 45 sh.createValidator(addr, pk, coin, ok) 46 return amount 47 } 48 49 // CreateValidatorMsg returns a message used to create validator in this service. 50 func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int) *stakingtypes.MsgCreateValidator { 51 coin := sdk.NewCoin(sh.Denom, stakeAmount) 52 msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) 53 require.NoError(sh.t, err) 54 return msg 55 } 56 57 func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) { 58 msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) 59 require.NoError(sh.t, err) 60 sh.Handle(msg, ok) 61 } 62 63 // Delegate calls handler to delegate stake for a validator 64 func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int) { 65 coin := sdk.NewCoin(sh.Denom, amount) 66 msg := stakingtypes.NewMsgDelegate(delegator, val, coin) 67 sh.Handle(msg, true) 68 } 69 70 // DelegateWithPower calls handler to delegate stake for a validator 71 func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress, power int64) { 72 coin := sdk.NewCoin(sh.Denom, sh.k.TokensFromConsensusPower(sh.Ctx, power)) 73 msg := stakingtypes.NewMsgDelegate(delegator, val, coin) 74 sh.Handle(msg, true) 75 } 76 77 // Undelegate calls handler to unbound some stake from a validator. 78 func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int, ok bool) *sdk.Result { 79 unbondAmt := sdk.NewCoin(sh.Denom, amount) 80 msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt) 81 return sh.Handle(msg, ok) 82 } 83 84 // Handle calls staking handler on a given message 85 func (sh *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { 86 res, err := sh.h(sh.Ctx, msg) 87 if ok { 88 require.NoError(sh.t, err) 89 require.NotNil(sh.t, res) 90 } else { 91 require.Error(sh.t, err) 92 require.Nil(sh.t, res) 93 } 94 return res 95 } 96 97 // CheckValidator asserts that a validor exists and has a given status (if status!="") 98 // and if has a right jailed flag. 99 func (sh *Helper) CheckValidator(addr sdk.ValAddress, status stakingtypes.BondStatus, jailed bool) stakingtypes.Validator { 100 v, ok := sh.k.GetValidator(sh.Ctx, addr) 101 require.True(sh.t, ok) 102 require.Equal(sh.t, jailed, v.Jailed, "wrong Jalied status") 103 if status >= 0 { 104 require.Equal(sh.t, status, v.Status) 105 } 106 return v 107 } 108 109 // CheckDelegator asserts that a delegator exists 110 func (sh *Helper) CheckDelegator(delegator sdk.AccAddress, val sdk.ValAddress, found bool) { 111 _, ok := sh.k.GetDelegation(sh.Ctx, delegator, val) 112 require.Equal(sh.t, ok, found) 113 } 114 115 // TurnBlock calls EndBlocker and updates the block time 116 func (sh *Helper) TurnBlock(newTime time.Time) sdk.Context { 117 sh.Ctx = sh.Ctx.WithBlockTime(newTime) 118 staking.EndBlocker(sh.Ctx, sh.k) 119 return sh.Ctx 120 } 121 122 // TurnBlockTimeDiff calls EndBlocker and updates the block time by adding the 123 // duration to the current block time 124 func (sh *Helper) TurnBlockTimeDiff(diff time.Duration) sdk.Context { 125 sh.Ctx = sh.Ctx.WithBlockTime(sh.Ctx.BlockHeader().Time.Add(diff)) 126 staking.EndBlocker(sh.Ctx, sh.k) 127 return sh.Ctx 128 } 129 130 // ZeroCommission constructs a commission rates with all zeros. 131 func ZeroCommission() stakingtypes.CommissionRates { 132 return stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) 133 }