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 }