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  }