github.com/Finschia/finschia-sdk@v0.49.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 t.Helper() 32 return &Helper{t, staking.NewHandler(k), k, ctx, ZeroCommission(), sdk.DefaultBondDenom} 33 } 34 35 // CreateValidator calls handler to create a new staking validator 36 func (sh *Helper) CreateValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int, ok bool) { 37 coin := sdk.NewCoin(sh.Denom, stakeAmount) 38 sh.createValidator(addr, pk, coin, ok) 39 } 40 41 // CreateValidatorWithValPower calls handler to create a new staking validator with zero 42 // commission 43 func (sh *Helper) CreateValidatorWithValPower(addr sdk.ValAddress, pk cryptotypes.PubKey, valPower int64, ok bool) sdk.Int { 44 amount := sh.k.TokensFromConsensusPower(sh.Ctx, valPower) 45 coin := sdk.NewCoin(sh.Denom, amount) 46 sh.createValidator(addr, pk, coin, ok) 47 return amount 48 } 49 50 // CreateValidatorMsg returns a message used to create validator in this service. 51 func (sh *Helper) CreateValidatorMsg(addr sdk.ValAddress, pk cryptotypes.PubKey, stakeAmount sdk.Int) *stakingtypes.MsgCreateValidator { 52 coin := sdk.NewCoin(sh.Denom, stakeAmount) 53 msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) 54 require.NoError(sh.t, err) 55 return msg 56 } 57 58 func (sh *Helper) createValidator(addr sdk.ValAddress, pk cryptotypes.PubKey, coin sdk.Coin, ok bool) { 59 msg, err := stakingtypes.NewMsgCreateValidator(addr, pk, coin, stakingtypes.Description{}, sh.Commission, sdk.OneInt()) 60 require.NoError(sh.t, err) 61 sh.Handle(msg, ok) 62 } 63 64 // Delegate calls handler to delegate stake for a validator 65 func (sh *Helper) Delegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int) { 66 coin := sdk.NewCoin(sh.Denom, amount) 67 msg := stakingtypes.NewMsgDelegate(delegator, val, coin) 68 sh.Handle(msg, true) 69 } 70 71 // DelegateWithPower calls handler to delegate stake for a validator 72 func (sh *Helper) DelegateWithPower(delegator sdk.AccAddress, val sdk.ValAddress, power int64) { 73 coin := sdk.NewCoin(sh.Denom, sh.k.TokensFromConsensusPower(sh.Ctx, power)) 74 msg := stakingtypes.NewMsgDelegate(delegator, val, coin) 75 sh.Handle(msg, true) 76 } 77 78 // Undelegate calls handler to unbound some stake from a validator. 79 func (sh *Helper) Undelegate(delegator sdk.AccAddress, val sdk.ValAddress, amount sdk.Int, ok bool) *sdk.Result { 80 unbondAmt := sdk.NewCoin(sh.Denom, amount) 81 msg := stakingtypes.NewMsgUndelegate(delegator, val, unbondAmt) 82 return sh.Handle(msg, ok) 83 } 84 85 // Handle calls staking handler on a given message 86 func (sh *Helper) Handle(msg sdk.Msg, ok bool) *sdk.Result { 87 res, err := sh.h(sh.Ctx, msg) 88 if ok { 89 require.NoError(sh.t, err) 90 require.NotNil(sh.t, res) 91 } else { 92 require.Error(sh.t, err) 93 require.Nil(sh.t, res) 94 } 95 return res 96 } 97 98 // CheckValidator asserts that a validor exists and has a given status (if status!="") 99 // and if has a right jailed flag. 100 func (sh *Helper) CheckValidator(addr sdk.ValAddress, status stakingtypes.BondStatus, jailed bool) stakingtypes.Validator { 101 v, ok := sh.k.GetValidator(sh.Ctx, addr) 102 require.True(sh.t, ok) 103 require.Equal(sh.t, jailed, v.Jailed, "wrong Jalied status") 104 if status >= 0 { 105 require.Equal(sh.t, status, v.Status) 106 } 107 return v 108 } 109 110 // CheckDelegator asserts that a delegator exists 111 func (sh *Helper) CheckDelegator(delegator sdk.AccAddress, val sdk.ValAddress, found bool) { 112 _, ok := sh.k.GetDelegation(sh.Ctx, delegator, val) 113 require.Equal(sh.t, ok, found) 114 } 115 116 // TurnBlock calls EndBlocker and updates the block time 117 func (sh *Helper) TurnBlock(newTime time.Time) sdk.Context { 118 sh.Ctx = sh.Ctx.WithBlockTime(newTime) 119 staking.EndBlocker(sh.Ctx, sh.k) 120 return sh.Ctx 121 } 122 123 // TurnBlockTimeDiff calls EndBlocker and updates the block time by adding the 124 // duration to the current block time 125 func (sh *Helper) TurnBlockTimeDiff(diff time.Duration) sdk.Context { 126 sh.Ctx = sh.Ctx.WithBlockTime(sh.Ctx.BlockHeader().Time.Add(diff)) 127 staking.EndBlocker(sh.Ctx, sh.k) 128 return sh.Ctx 129 } 130 131 // ZeroCommission constructs a commission rates with all zeros. 132 func ZeroCommission() stakingtypes.CommissionRates { 133 return stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()) 134 }