github.com/cosmos/cosmos-sdk@v0.50.10/x/group/keeper/invariants_test.go (about) 1 package keeper_test 2 3 import ( 4 "testing" 5 6 cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" 7 dbm "github.com/cosmos/cosmos-db" 8 "github.com/stretchr/testify/suite" 9 10 "cosmossdk.io/log" 11 "cosmossdk.io/store" 12 "cosmossdk.io/store/metrics" 13 storetypes "cosmossdk.io/store/types" 14 15 "github.com/cosmos/cosmos-sdk/codec" 16 "github.com/cosmos/cosmos-sdk/codec/types" 17 "github.com/cosmos/cosmos-sdk/testutil/testdata" 18 sdk "github.com/cosmos/cosmos-sdk/types" 19 "github.com/cosmos/cosmos-sdk/x/group" 20 "github.com/cosmos/cosmos-sdk/x/group/internal/orm" 21 "github.com/cosmos/cosmos-sdk/x/group/keeper" 22 ) 23 24 type invariantTestSuite struct { 25 suite.Suite 26 27 ctx sdk.Context 28 cdc *codec.ProtoCodec 29 key *storetypes.KVStoreKey 30 } 31 32 func TestInvariantTestSuite(t *testing.T) { 33 suite.Run(t, new(invariantTestSuite)) 34 } 35 36 func (s *invariantTestSuite) SetupSuite() { 37 interfaceRegistry := types.NewInterfaceRegistry() 38 group.RegisterInterfaces(interfaceRegistry) 39 cdc := codec.NewProtoCodec(interfaceRegistry) 40 key := storetypes.NewKVStoreKey(group.ModuleName) 41 db := dbm.NewMemDB() 42 cms := store.NewCommitMultiStore(db, log.NewNopLogger(), metrics.NewNoOpMetrics()) 43 cms.MountStoreWithDB(key, storetypes.StoreTypeIAVL, db) 44 _ = cms.LoadLatestVersion() 45 sdkCtx := sdk.NewContext(cms, cmtproto.Header{}, false, log.NewNopLogger()) 46 47 s.ctx = sdkCtx 48 s.cdc = cdc 49 s.key = key 50 } 51 52 func (s *invariantTestSuite) TestGroupTotalWeightInvariant() { 53 sdkCtx, _ := s.ctx.CacheContext() 54 curCtx, cdc, key := sdkCtx, s.cdc, s.key 55 56 // Group Table 57 groupTable, err := orm.NewAutoUInt64Table([2]byte{keeper.GroupTablePrefix}, keeper.GroupTableSeqPrefix, &group.GroupInfo{}, cdc) 58 s.Require().NoError(err) 59 60 // Group Member Table 61 groupMemberTable, err := orm.NewPrimaryKeyTable([2]byte{keeper.GroupMemberTablePrefix}, &group.GroupMember{}, cdc) 62 s.Require().NoError(err) 63 64 groupMemberByGroupIndex, err := orm.NewIndex(groupMemberTable, keeper.GroupMemberByGroupIndexPrefix, func(val interface{}) ([]interface{}, error) { 65 group := val.(*group.GroupMember).GroupId 66 return []interface{}{group}, nil 67 }, group.GroupMember{}.GroupId) 68 s.Require().NoError(err) 69 70 _, _, addr1 := testdata.KeyTestPubAddr() 71 _, _, addr2 := testdata.KeyTestPubAddr() 72 73 specs := map[string]struct { 74 groupsInfo *group.GroupInfo 75 groupMembers []*group.GroupMember 76 expBroken bool 77 }{ 78 "invariant not broken": { 79 groupsInfo: &group.GroupInfo{ 80 Id: 1, 81 Admin: addr1.String(), 82 Version: 1, 83 TotalWeight: "3", 84 }, 85 groupMembers: []*group.GroupMember{ 86 { 87 GroupId: 1, 88 Member: &group.Member{ 89 Address: addr1.String(), 90 Weight: "1", 91 }, 92 }, 93 { 94 GroupId: 1, 95 Member: &group.Member{ 96 Address: addr2.String(), 97 Weight: "2", 98 }, 99 }, 100 }, 101 expBroken: false, 102 }, 103 104 "group's TotalWeight must be equal to sum of its members weight ": { 105 groupsInfo: &group.GroupInfo{ 106 Id: 1, 107 Admin: addr1.String(), 108 Version: 1, 109 TotalWeight: "3", 110 }, 111 groupMembers: []*group.GroupMember{ 112 { 113 GroupId: 1, 114 Member: &group.Member{ 115 Address: addr1.String(), 116 Weight: "2", 117 }, 118 }, 119 { 120 GroupId: 1, 121 Member: &group.Member{ 122 Address: addr2.String(), 123 Weight: "2", 124 }, 125 }, 126 }, 127 expBroken: true, 128 }, 129 } 130 131 for _, spec := range specs { 132 cacheCurCtx, _ := curCtx.CacheContext() 133 groupsInfo := spec.groupsInfo 134 groupMembers := spec.groupMembers 135 136 _, err := groupTable.Create(cacheCurCtx.KVStore(key), groupsInfo) 137 s.Require().NoError(err) 138 139 for i := 0; i < len(groupMembers); i++ { 140 err := groupMemberTable.Create(cacheCurCtx.KVStore(key), groupMembers[i]) 141 s.Require().NoError(err) 142 } 143 144 _, broken := keeper.GroupTotalWeightInvariantHelper(cacheCurCtx, key, *groupTable, groupMemberByGroupIndex) 145 s.Require().Equal(spec.expBroken, broken) 146 147 } 148 }