github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/invariants_test.go (about) 1 package keeper 2 3 import ( 4 "testing" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 "github.com/fibonacci-chain/fbc/x/distribution/types" 8 "github.com/stretchr/testify/require" 9 ) 10 11 type testInvariantParam struct { 12 totalCommission sdk.SysCoins 13 commissions []sdk.SysCoins 14 expected bool 15 } 16 17 func getTestInvariantParams() []testInvariantParam { 18 return []testInvariantParam{ 19 { // when commission is zero 20 nil, 21 []sdk.SysCoins{NewTestSysCoins(0, 0)}, 22 true, 23 }, 24 { // when withdraw commission failed 25 NewTestSysCoins(5, 1), 26 []sdk.SysCoins{NewTestSysCoins(15, 1)}, 27 false, 28 }, 29 { // when the sum of commission is not equal to distribution account 30 NewTestSysCoins(30, 1), 31 []sdk.SysCoins{NewTestSysCoins(15, 1), NewTestSysCoins(20, 1)}, 32 false, 33 }, 34 { // when the sum of commission is not equal to distribution account 35 NewTestSysCoins(45, 1), 36 []sdk.SysCoins{NewTestSysCoins(15, 1), NewTestSysCoins(20, 1)}, 37 false, 38 }, 39 { // success 40 NewTestSysCoins(45, 1), 41 []sdk.SysCoins{NewTestSysCoins(15, 1), NewTestSysCoins(30, 1)}, 42 true, 43 }, 44 } 45 } 46 47 func TestInvariants(t *testing.T) { 48 valOpAddrs, _, _ := GetTestAddrs() 49 tests := getTestInvariantParams() 50 for _, test := range tests { 51 ctx, ak, keeper, sk, supplyKeeper := CreateTestInputDefault(t, false, 1000) 52 acc := supplyKeeper.GetModuleAccount(ctx, types.ModuleName) 53 err := acc.SetCoins(test.totalCommission) 54 require.NoError(t, err) 55 ak.SetAccount(ctx, acc) 56 for i, commission := range test.commissions { 57 val := sk.Validator(ctx, valOpAddrs[i]) 58 keeper.AllocateTokensToValidator(ctx, val, commission) 59 } 60 61 var invariants [3]sdk.Invariant 62 invariants[0] = NonNegativeCommissionsInvariant(keeper) 63 invariants[1] = CanWithdrawInvariant(keeper) 64 invariants[2] = ModuleAccountInvariant(keeper) 65 count := 0 66 for _, invariant := range invariants { 67 if _, broken := invariant(ctx); broken { 68 count++ 69 } 70 } 71 isSuccess := true 72 if count != 0 { 73 isSuccess = false 74 } 75 require.Equal(t, test.expected, isSuccess) 76 } 77 }