github.com/Finschia/finschia-sdk@v0.48.1/x/authz/simulation/operations_test.go (about) 1 package simulation_test 2 3 import ( 4 "math/rand" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/suite" 9 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 10 11 ocabci "github.com/Finschia/ostracon/abci/types" 12 13 "github.com/Finschia/finschia-sdk/simapp" 14 sdk "github.com/Finschia/finschia-sdk/types" 15 simtypes "github.com/Finschia/finschia-sdk/types/simulation" 16 "github.com/Finschia/finschia-sdk/x/authz" 17 "github.com/Finschia/finschia-sdk/x/authz/simulation" 18 banktypes "github.com/Finschia/finschia-sdk/x/bank/types" 19 ) 20 21 type SimTestSuite struct { 22 suite.Suite 23 24 ctx sdk.Context 25 app *simapp.SimApp 26 } 27 28 func (suite *SimTestSuite) SetupTest() { 29 checkTx := false 30 app := simapp.Setup(checkTx) 31 suite.app = app 32 suite.ctx = app.BaseApp.NewContext(checkTx, tmproto.Header{}) 33 } 34 35 func (suite *SimTestSuite) TestWeightedOperations() { 36 cdc := suite.app.AppCodec() 37 appParams := make(simtypes.AppParams) 38 39 weightedOps := simulation.WeightedOperations(appParams, cdc, suite.app.AccountKeeper, 40 suite.app.BankKeeper, suite.app.AuthzKeeper, cdc, 41 ) 42 43 // setup 3 accounts 44 s := rand.NewSource(1) 45 r := rand.New(s) 46 accs := suite.getTestingAccounts(r, 3) 47 48 expected := []struct { 49 weight int 50 opMsgRoute string 51 opMsgName string 52 }{ 53 {simulation.WeightGrant, authz.ModuleName, simulation.TypeMsgGrant}, 54 {simulation.WeightRevoke, authz.ModuleName, simulation.TypeMsgRevoke}, 55 {simulation.WeightExec, authz.ModuleName, simulation.TypeMsgExec}, 56 } 57 58 for i, w := range weightedOps { 59 operationMsg, _, _ := w.Op()(r, suite.app.BaseApp, suite.ctx, accs, "") 60 // the following checks are very much dependent from the ordering of the output given 61 // by WeightedOperations. if the ordering in WeightedOperations changes some tests 62 // will fail 63 suite.Require().Equal(expected[i].weight, w.Weight(), "weight should be the same") 64 suite.Require().Equal(expected[i].opMsgRoute, operationMsg.Route, "route should be the same") 65 suite.Require().Equal(expected[i].opMsgName, operationMsg.Name, "operation Msg name should be the same") 66 } 67 } 68 69 func (suite *SimTestSuite) getTestingAccounts(r *rand.Rand, n int) []simtypes.Account { 70 accounts := simtypes.RandomAccounts(r, n) 71 72 initAmt := suite.app.StakingKeeper.TokensFromConsensusPower(suite.ctx, 200000) 73 initCoins := sdk.NewCoins(sdk.NewCoin("stake", initAmt)) 74 75 // add coins to the accounts 76 for _, account := range accounts { 77 acc := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, account.Address) 78 suite.app.AccountKeeper.SetAccount(suite.ctx, acc) 79 suite.Require().NoError(simapp.FundAccount(suite.app, suite.ctx, account.Address, initCoins)) 80 } 81 82 return accounts 83 } 84 85 func (suite *SimTestSuite) TestSimulateGrant() { 86 s := rand.NewSource(1) 87 r := rand.New(s) 88 accounts := suite.getTestingAccounts(r, 2) 89 blockTime := time.Now().UTC() 90 ctx := suite.ctx.WithBlockTime(blockTime) 91 92 // begin a new block 93 suite.app.BeginBlock(ocabci.RequestBeginBlock{ 94 Header: tmproto.Header{ 95 Height: suite.app.LastBlockHeight() + 1, 96 AppHash: suite.app.LastCommitID().Hash, 97 }, 98 }) 99 100 granter := accounts[0] 101 grantee := accounts[1] 102 103 // execute operation 104 op := simulation.SimulateMsgGrant(suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.AuthzKeeper) 105 operationMsg, futureOperations, err := op(r, suite.app.BaseApp, ctx, accounts, "") 106 suite.Require().NoError(err) 107 108 var msg authz.MsgGrant 109 suite.app.LegacyAmino().UnmarshalJSON(operationMsg.Msg, &msg) 110 suite.Require().True(operationMsg.OK) 111 suite.Require().Equal(granter.Address.String(), msg.Granter) 112 suite.Require().Equal(grantee.Address.String(), msg.Grantee) 113 suite.Require().Len(futureOperations, 0) 114 } 115 116 func (suite *SimTestSuite) TestSimulateRevoke() { 117 // setup 3 accounts 118 s := rand.NewSource(2) 119 r := rand.New(s) 120 accounts := suite.getTestingAccounts(r, 3) 121 122 // begin a new block 123 suite.app.BeginBlock(ocabci.RequestBeginBlock{ 124 Header: tmproto.Header{ 125 Height: suite.app.LastBlockHeight() + 1, 126 AppHash: suite.app.LastCommitID().Hash, 127 }, 128 }) 129 130 initAmt := suite.app.StakingKeeper.TokensFromConsensusPower(suite.ctx, 200000) 131 initCoins := sdk.NewCoins(sdk.NewCoin("stake", initAmt)) 132 133 granter := accounts[0] 134 grantee := accounts[1] 135 authorization := banktypes.NewSendAuthorization(initCoins) 136 137 err := suite.app.AuthzKeeper.SaveGrant(suite.ctx, grantee.Address, granter.Address, authorization, time.Now().Add(30*time.Hour)) 138 suite.Require().NoError(err) 139 140 // execute operation 141 op := simulation.SimulateMsgRevoke(suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.AuthzKeeper) 142 operationMsg, futureOperations, err := op(r, suite.app.BaseApp, suite.ctx, accounts, "") 143 suite.Require().NoError(err) 144 145 var msg authz.MsgRevoke 146 suite.app.LegacyAmino().UnmarshalJSON(operationMsg.Msg, &msg) 147 148 suite.Require().True(operationMsg.OK) 149 suite.Require().Equal(granter.Address.String(), msg.Granter) 150 suite.Require().Equal(grantee.Address.String(), msg.Grantee) 151 suite.Require().Equal(banktypes.SendAuthorization{}.MsgTypeURL(), msg.MsgTypeUrl) 152 suite.Require().Len(futureOperations, 0) 153 } 154 155 func (suite *SimTestSuite) TestSimulateExec() { 156 // setup 3 accounts 157 s := rand.NewSource(1) 158 r := rand.New(s) 159 accounts := suite.getTestingAccounts(r, 3) 160 161 // begin a new block 162 suite.app.BeginBlock(ocabci.RequestBeginBlock{Header: tmproto.Header{Height: suite.app.LastBlockHeight() + 1, AppHash: suite.app.LastCommitID().Hash}}) 163 164 initAmt := suite.app.StakingKeeper.TokensFromConsensusPower(suite.ctx, 200000) 165 initCoins := sdk.NewCoins(sdk.NewCoin("stake", initAmt)) 166 167 granter := accounts[0] 168 grantee := accounts[1] 169 authorization := banktypes.NewSendAuthorization(initCoins) 170 171 err := suite.app.AuthzKeeper.SaveGrant(suite.ctx, grantee.Address, granter.Address, authorization, time.Now().Add(30*time.Hour)) 172 suite.Require().NoError(err) 173 174 // execute operation 175 op := simulation.SimulateMsgExec(suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.AuthzKeeper, suite.app.AppCodec()) 176 operationMsg, futureOperations, err := op(r, suite.app.BaseApp, suite.ctx, accounts, "") 177 suite.Require().NoError(err) 178 179 var msg authz.MsgExec 180 181 suite.app.LegacyAmino().UnmarshalJSON(operationMsg.Msg, &msg) 182 183 suite.Require().True(operationMsg.OK) 184 suite.Require().Equal(grantee.Address.String(), msg.Grantee) 185 suite.Require().Len(futureOperations, 0) 186 } 187 188 func TestSimTestSuite(t *testing.T) { 189 suite.Run(t, new(SimTestSuite)) 190 }