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  }