@@ -3,9 +3,15 @@ package keeper_test
3
3
import (
4
4
"testing"
5
5
6
+ cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
7
+ cmttime "github.com/cometbft/cometbft/types/time"
8
+ gogotypes "github.com/cosmos/gogoproto/types"
9
+ "github.com/stretchr/testify/require"
6
10
"github.com/stretchr/testify/suite"
7
11
12
+ "cosmossdk.io/collections"
8
13
"cosmossdk.io/core/header"
14
+ "cosmossdk.io/core/store"
9
15
storetypes "cosmossdk.io/store/types"
10
16
11
17
"github.com/cosmos/cosmos-sdk/baseapp"
32
38
randomPermAcc = types .NewEmptyModuleAccount (randomPerm , "random" )
33
39
)
34
40
41
+ func getMaccPerms () map [string ][]string {
42
+ return map [string ][]string {
43
+ "fee_collector" : nil ,
44
+ "mint" : {"minter" },
45
+ "bonded_tokens_pool" : {"burner" , "staking" },
46
+ "not_bonded_tokens_pool" : {"burner" , "staking" },
47
+ multiPerm : {"burner" , "minter" , "staking" },
48
+ randomPerm : {"random" },
49
+ }
50
+ }
51
+
35
52
type KeeperTestSuite struct {
36
53
suite.Suite
37
54
@@ -51,20 +68,11 @@ func (suite *KeeperTestSuite) SetupTest() {
51
68
testCtx := testutil .DefaultContextWithDB (suite .T (), key , storetypes .NewTransientStoreKey ("transient_test" ))
52
69
suite .ctx = testCtx .Ctx .WithHeaderInfo (header.Info {})
53
70
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
71
suite .accountKeeper = keeper .NewAccountKeeper (
64
72
suite .encCfg .Codec ,
65
73
storeService ,
66
74
types .ProtoBaseAccount ,
67
- maccPerms ,
75
+ getMaccPerms () ,
68
76
authcodec .NewBech32Codec ("cosmos" ),
69
77
"cosmos" ,
70
78
types .NewModuleAddress ("gov" ).String (),
@@ -215,3 +223,104 @@ func (suite *KeeperTestSuite) TestInitGenesis() {
215
223
// we expect nextNum to be 2 because we initialize fee_collector as account number 1
216
224
suite .Require ().Equal (2 , int (nextNum ))
217
225
}
226
+
227
+ func setupAccountKeeper (t * testing.T ) (sdk.Context , keeper.AccountKeeper , store.KVStoreService ) {
228
+ t .Helper ()
229
+ key := storetypes .NewKVStoreKey (types .StoreKey )
230
+ storeService := runtime .NewKVStoreService (key )
231
+ testCtx := testutil .DefaultContextWithDB (t , key , storetypes .NewTransientStoreKey ("transient_test" ))
232
+ ctx := testCtx .Ctx .WithBlockHeader (cmtproto.Header {Time : cmttime .Now ()})
233
+ encCfg := moduletestutil .MakeTestEncodingConfig ()
234
+
235
+ ak := keeper .NewAccountKeeper (
236
+ encCfg .Codec ,
237
+ storeService ,
238
+ types .ProtoBaseAccount ,
239
+ getMaccPerms (),
240
+ authcodec .NewBech32Codec ("cosmos" ),
241
+ "cosmos" ,
242
+ types .NewModuleAddress ("gov" ).String (),
243
+ )
244
+
245
+ return ctx , ak , storeService
246
+ }
247
+
248
+ func TestNextAccountNumber (t * testing.T ) {
249
+ const newNum = uint64 (100 )
250
+ const legacyNum = uint64 (50 )
251
+ legacyVal := & gogotypes.UInt64Value {Value : legacyNum }
252
+ ctx , ak , storeService := setupAccountKeeper (t )
253
+ testCases := []struct {
254
+ name string
255
+ setup func ()
256
+ onNext func ()
257
+ expects []uint64
258
+ }{
259
+ {
260
+ name : "reset account number to 0 after using legacy key" ,
261
+ setup : func () {
262
+ data , err := legacyVal .Marshal ()
263
+ require .NoError (t , err )
264
+ store := storeService .OpenKVStore (ctx )
265
+ err = store .Set (types .LegacyGlobalAccountNumberKey , data )
266
+ require .NoError (t , err )
267
+ },
268
+ onNext : func () {
269
+ num := uint64 (0 )
270
+ err := ak .AccountNumber .Set (ctx , num )
271
+ require .NoError (t , err )
272
+ },
273
+ expects : []uint64 {legacyNum , 0 },
274
+ },
275
+ {
276
+ name : "no keys set, account number starts at 0" ,
277
+ setup : func () {},
278
+ expects : []uint64 {0 , 1 },
279
+ },
280
+ {
281
+ name : "fallback to legacy key when new key is unset" ,
282
+ setup : func () {
283
+ data , err := legacyVal .Marshal ()
284
+ require .NoError (t , err )
285
+ store := storeService .OpenKVStore (ctx )
286
+ err = store .Set (types .LegacyGlobalAccountNumberKey , data )
287
+ require .NoError (t , err )
288
+
289
+ // unset new key
290
+ err = (collections.Item [uint64 ])(ak .AccountNumber ).Remove (ctx )
291
+ require .NoError (t , err )
292
+ },
293
+ expects : []uint64 {legacyNum , legacyNum + 1 },
294
+ },
295
+ {
296
+ name : "new key takes precedence over legacy key" ,
297
+ setup : func () {
298
+ data , err := legacyVal .Marshal ()
299
+ require .NoError (t , err )
300
+ store := storeService .OpenKVStore (ctx )
301
+ err = store .Set (types .LegacyGlobalAccountNumberKey , data )
302
+ require .NoError (t , err )
303
+
304
+ err = ak .AccountNumber .Set (ctx , newNum )
305
+ require .NoError (t , err )
306
+ },
307
+ expects : []uint64 {newNum , newNum + 1 },
308
+ },
309
+ }
310
+
311
+ for _ , tc := range testCases {
312
+ t .Run (tc .name , func (t * testing.T ) {
313
+ ctx , ak , storeService = setupAccountKeeper (t )
314
+ tc .setup ()
315
+ nextNum := ak .NextAccountNumber (ctx )
316
+ require .Equal (t , tc .expects [0 ], nextNum )
317
+
318
+ if tc .onNext != nil {
319
+ tc .onNext ()
320
+ }
321
+
322
+ nextNum = ak .NextAccountNumber (ctx )
323
+ require .Equal (t , tc .expects [1 ], nextNum )
324
+ })
325
+ }
326
+ }
0 commit comments