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  }