github.com/cosmos/cosmos-sdk@v0.50.10/x/auth/keeper/keeper_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/suite"
     7  
     8  	"cosmossdk.io/core/header"
     9  	storetypes "cosmossdk.io/store/types"
    10  
    11  	"github.com/cosmos/cosmos-sdk/baseapp"
    12  	codectypes "github.com/cosmos/cosmos-sdk/codec/types"
    13  	"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
    14  	"github.com/cosmos/cosmos-sdk/runtime"
    15  	"github.com/cosmos/cosmos-sdk/testutil"
    16  	sdk "github.com/cosmos/cosmos-sdk/types"
    17  	moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
    18  	"github.com/cosmos/cosmos-sdk/x/auth"
    19  	authcodec "github.com/cosmos/cosmos-sdk/x/auth/codec"
    20  	"github.com/cosmos/cosmos-sdk/x/auth/keeper"
    21  	"github.com/cosmos/cosmos-sdk/x/auth/types"
    22  )
    23  
    24  const (
    25  	holder     = "holder"
    26  	multiPerm  = "multiple permissions account"
    27  	randomPerm = "random permission"
    28  )
    29  
    30  var (
    31  	multiPermAcc  = types.NewEmptyModuleAccount(multiPerm, types.Burner, types.Minter, types.Staking)
    32  	randomPermAcc = types.NewEmptyModuleAccount(randomPerm, "random")
    33  )
    34  
    35  type KeeperTestSuite struct {
    36  	suite.Suite
    37  
    38  	ctx sdk.Context
    39  
    40  	queryClient   types.QueryClient
    41  	accountKeeper keeper.AccountKeeper
    42  	msgServer     types.MsgServer
    43  	encCfg        moduletestutil.TestEncodingConfig
    44  }
    45  
    46  func (suite *KeeperTestSuite) SetupTest() {
    47  	suite.encCfg = moduletestutil.MakeTestEncodingConfig(auth.AppModuleBasic{})
    48  
    49  	key := storetypes.NewKVStoreKey(types.StoreKey)
    50  	storeService := runtime.NewKVStoreService(key)
    51  	testCtx := testutil.DefaultContextWithDB(suite.T(), key, storetypes.NewTransientStoreKey("transient_test"))
    52  	suite.ctx = testCtx.Ctx.WithHeaderInfo(header.Info{})
    53  
    54  	maccPerms := map[string][]string{
    55  		"fee_collector":          nil,
    56  		"mint":                   {"minter"},
    57  		"bonded_tokens_pool":     {"burner", "staking"},
    58  		"not_bonded_tokens_pool": {"burner", "staking"},
    59  		multiPerm:                {"burner", "minter", "staking"},
    60  		randomPerm:               {"random"},
    61  	}
    62  
    63  	suite.accountKeeper = keeper.NewAccountKeeper(
    64  		suite.encCfg.Codec,
    65  		storeService,
    66  		types.ProtoBaseAccount,
    67  		maccPerms,
    68  		authcodec.NewBech32Codec("cosmos"),
    69  		"cosmos",
    70  		types.NewModuleAddress("gov").String(),
    71  	)
    72  	suite.msgServer = keeper.NewMsgServerImpl(suite.accountKeeper)
    73  	queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.encCfg.InterfaceRegistry)
    74  	types.RegisterQueryServer(queryHelper, keeper.NewQueryServer(suite.accountKeeper))
    75  	suite.queryClient = types.NewQueryClient(queryHelper)
    76  }
    77  
    78  func TestKeeperTestSuite(t *testing.T) {
    79  	suite.Run(t, new(KeeperTestSuite))
    80  }
    81  
    82  func (suite *KeeperTestSuite) TestSupply_ValidatePermissions() {
    83  	err := suite.accountKeeper.ValidatePermissions(multiPermAcc)
    84  	suite.Require().NoError(err)
    85  
    86  	err = suite.accountKeeper.ValidatePermissions(randomPermAcc)
    87  	suite.Require().NoError(err)
    88  
    89  	// unregistered permissions
    90  	otherAcc := types.NewEmptyModuleAccount("other", "other")
    91  	err = suite.accountKeeper.ValidatePermissions(otherAcc)
    92  	suite.Require().Error(err)
    93  }
    94  
    95  func (suite *KeeperTestSuite) TestInitGenesis() {
    96  	suite.SetupTest() // reset
    97  
    98  	// Check if params are set
    99  	genState := types.GenesisState{
   100  		Params: types.Params{
   101  			MaxMemoCharacters:      types.DefaultMaxMemoCharacters + 1,
   102  			TxSigLimit:             types.DefaultTxSigLimit + 1,
   103  			TxSizeCostPerByte:      types.DefaultTxSizeCostPerByte + 1,
   104  			SigVerifyCostED25519:   types.DefaultSigVerifyCostED25519 + 1,
   105  			SigVerifyCostSecp256k1: types.DefaultSigVerifyCostSecp256k1 + 1,
   106  		},
   107  	}
   108  
   109  	ctx := suite.ctx
   110  	suite.accountKeeper.InitGenesis(ctx, genState)
   111  
   112  	params := suite.accountKeeper.GetParams(ctx)
   113  	suite.Require().Equal(genState.Params.MaxMemoCharacters, params.MaxMemoCharacters, "MaxMemoCharacters")
   114  	suite.Require().Equal(genState.Params.TxSigLimit, params.TxSigLimit, "TxSigLimit")
   115  	suite.Require().Equal(genState.Params.TxSizeCostPerByte, params.TxSizeCostPerByte, "TxSizeCostPerByte")
   116  	suite.Require().Equal(genState.Params.SigVerifyCostED25519, params.SigVerifyCostED25519, "SigVerifyCostED25519")
   117  	suite.Require().Equal(genState.Params.SigVerifyCostSecp256k1, params.SigVerifyCostSecp256k1, "SigVerifyCostSecp256k1")
   118  
   119  	suite.SetupTest() // reset
   120  	ctx = suite.ctx
   121  	// Fix duplicate account numbers
   122  	pubKey1 := ed25519.GenPrivKey().PubKey()
   123  	pubKey2 := ed25519.GenPrivKey().PubKey()
   124  	accts := []sdk.AccountI{
   125  		&types.BaseAccount{
   126  			Address:       sdk.AccAddress(pubKey1.Address()).String(),
   127  			PubKey:        codectypes.UnsafePackAny(pubKey1),
   128  			AccountNumber: 0,
   129  			Sequence:      5,
   130  		},
   131  		&types.ModuleAccount{
   132  			BaseAccount: &types.BaseAccount{
   133  				Address:       types.NewModuleAddress("testing").String(),
   134  				PubKey:        nil,
   135  				AccountNumber: 0,
   136  				Sequence:      6,
   137  			},
   138  			Name:        "testing",
   139  			Permissions: nil,
   140  		},
   141  		&types.BaseAccount{
   142  			Address:       sdk.AccAddress(pubKey2.Address()).String(),
   143  			PubKey:        codectypes.UnsafePackAny(pubKey2),
   144  			AccountNumber: 5,
   145  			Sequence:      7,
   146  		},
   147  	}
   148  	genState = types.GenesisState{
   149  		Params:   types.DefaultParams(),
   150  		Accounts: nil,
   151  	}
   152  	for _, acct := range accts {
   153  		genState.Accounts = append(genState.Accounts, codectypes.UnsafePackAny(acct))
   154  	}
   155  
   156  	suite.accountKeeper.InitGenesis(ctx, genState)
   157  
   158  	keeperAccts := suite.accountKeeper.GetAllAccounts(ctx)
   159  	// len(accts)+1 because we initialize fee_collector account after the genState accounts
   160  	suite.Require().Equal(len(keeperAccts), len(accts)+1, "number of accounts in the keeper vs in genesis state")
   161  	for i, genAcct := range accts {
   162  		genAcctAddr := genAcct.GetAddress()
   163  		var keeperAcct sdk.AccountI
   164  		for _, kacct := range keeperAccts {
   165  			if genAcctAddr.Equals(kacct.GetAddress()) {
   166  				keeperAcct = kacct
   167  				break
   168  			}
   169  		}
   170  		suite.Require().NotNilf(keeperAcct, "genesis account %s not in keeper accounts", genAcctAddr)
   171  		suite.Require().Equal(genAcct.GetPubKey(), keeperAcct.GetPubKey())
   172  		suite.Require().Equal(genAcct.GetSequence(), keeperAcct.GetSequence())
   173  		if i == 1 {
   174  			suite.Require().Equalf(1, int(keeperAcct.GetAccountNumber()), genAcctAddr.String())
   175  		} else {
   176  			suite.Require().Equal(genAcct.GetSequence(), keeperAcct.GetSequence())
   177  		}
   178  	}
   179  
   180  	// fee_collector's is the last account to be set, so it has +1 of the highest in the accounts list
   181  	feeCollector := suite.accountKeeper.GetModuleAccount(ctx, "fee_collector")
   182  	suite.Require().Equal(6, int(feeCollector.GetAccountNumber()))
   183  
   184  	// The 3rd account has account number 5, but because the FeeCollector account gets initialized last, the next should be 7.
   185  	nextNum := suite.accountKeeper.NextAccountNumber(ctx)
   186  	suite.Require().Equal(7, int(nextNum))
   187  
   188  	suite.SetupTest() // reset
   189  	ctx = suite.ctx
   190  	// one zero account still sets global account number
   191  	genState = types.GenesisState{
   192  		Params: types.DefaultParams(),
   193  		Accounts: []*codectypes.Any{
   194  			codectypes.UnsafePackAny(&types.BaseAccount{
   195  				Address:       sdk.AccAddress(pubKey1.Address()).String(),
   196  				PubKey:        codectypes.UnsafePackAny(pubKey1),
   197  				AccountNumber: 0,
   198  				Sequence:      5,
   199  			}),
   200  		},
   201  	}
   202  
   203  	suite.accountKeeper.InitGenesis(ctx, genState)
   204  
   205  	keeperAccts = suite.accountKeeper.GetAllAccounts(ctx)
   206  	// len(genState.Accounts)+1 because we initialize fee_collector as account number 1 (last)
   207  	suite.Require().Equal(len(keeperAccts), len(genState.Accounts)+1, "number of accounts in the keeper vs in genesis state")
   208  
   209  	// Check both accounts account numbers
   210  	suite.Require().Equal(0, int(suite.accountKeeper.GetAccount(ctx, sdk.AccAddress(pubKey1.Address())).GetAccountNumber()))
   211  	feeCollector = suite.accountKeeper.GetModuleAccount(ctx, "fee_collector")
   212  	suite.Require().Equal(1, int(feeCollector.GetAccountNumber()))
   213  
   214  	nextNum = suite.accountKeeper.NextAccountNumber(ctx)
   215  	// we expect nextNum to be 2 because we initialize fee_collector as account number 1
   216  	suite.Require().Equal(2, int(nextNum))
   217  }