github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/x/params/subspace/subspace_test.go (about)

     1  package subspace_test
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    10  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    11  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    12  	"github.com/stretchr/testify/suite"
    13  
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    16  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/params/subspace"
    18  )
    19  
    20  type SubspaceTestSuite struct {
    21  	suite.Suite
    22  
    23  	cdc *codec.Codec
    24  	ctx sdk.Context
    25  	ss  subspace.Subspace
    26  }
    27  
    28  func (suite *SubspaceTestSuite) SetupTest() {
    29  	cdc := codec.New()
    30  	db := dbm.NewMemDB()
    31  
    32  	ms := store.NewCommitMultiStore(db)
    33  	ms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db)
    34  	ms.MountStoreWithDB(tkey, sdk.StoreTypeTransient, db)
    35  	suite.NoError(ms.LoadLatestVersion())
    36  
    37  	ss := subspace.NewSubspace(cdc, key, tkey, "testsubspace")
    38  
    39  	suite.cdc = cdc
    40  	suite.ctx = sdk.NewContext(ms, abci.Header{}, false, log.NewNopLogger())
    41  	suite.ss = ss.WithKeyTable(paramKeyTable())
    42  }
    43  
    44  func (suite *SubspaceTestSuite) TestKeyTable() {
    45  	suite.Require().True(suite.ss.HasKeyTable())
    46  	suite.Require().Panics(func() {
    47  		suite.ss.WithKeyTable(paramKeyTable())
    48  	})
    49  	suite.Require().NotPanics(func() {
    50  		ss := subspace.NewSubspace(codec.New(), key, tkey, "testsubspace2")
    51  		ss = ss.WithKeyTable(paramKeyTable())
    52  	})
    53  }
    54  
    55  func (suite *SubspaceTestSuite) TestGetSet() {
    56  	var v time.Duration
    57  	t := time.Hour * 48
    58  
    59  	suite.Require().Panics(func() {
    60  		suite.ss.Get(suite.ctx, keyUnbondingTime, &v)
    61  	})
    62  	suite.Require().NotEqual(t, v)
    63  	suite.Require().NotPanics(func() {
    64  		suite.ss.Set(suite.ctx, keyUnbondingTime, t)
    65  	})
    66  	suite.Require().NotPanics(func() {
    67  		suite.ss.Get(suite.ctx, keyUnbondingTime, &v)
    68  	})
    69  	suite.Require().Equal(t, v)
    70  }
    71  
    72  func (suite *SubspaceTestSuite) TestGetIfExists() {
    73  	var v time.Duration
    74  
    75  	suite.Require().NotPanics(func() {
    76  		suite.ss.GetIfExists(suite.ctx, keyUnbondingTime, &v)
    77  	})
    78  	suite.Require().Equal(time.Duration(0), v)
    79  }
    80  
    81  func (suite *SubspaceTestSuite) TestGetRaw() {
    82  	t := time.Hour * 48
    83  
    84  	suite.Require().NotPanics(func() {
    85  		suite.ss.Set(suite.ctx, keyUnbondingTime, t)
    86  	})
    87  	suite.Require().NotPanics(func() {
    88  		res := suite.ss.GetRaw(suite.ctx, keyUnbondingTime)
    89  		suite.Require().Equal("2231373238303030303030303030303022", fmt.Sprintf("%X", res))
    90  	})
    91  }
    92  
    93  func (suite *SubspaceTestSuite) TestHas() {
    94  	t := time.Hour * 48
    95  
    96  	suite.Require().False(suite.ss.Has(suite.ctx, keyUnbondingTime))
    97  	suite.Require().NotPanics(func() {
    98  		suite.ss.Set(suite.ctx, keyUnbondingTime, t)
    99  	})
   100  	suite.Require().True(suite.ss.Has(suite.ctx, keyUnbondingTime))
   101  }
   102  
   103  func (suite *SubspaceTestSuite) TestModified() {
   104  	t := time.Hour * 48
   105  
   106  	suite.Require().False(suite.ss.Modified(suite.ctx, keyUnbondingTime))
   107  	suite.Require().NotPanics(func() {
   108  		suite.ss.Set(suite.ctx, keyUnbondingTime, t)
   109  	})
   110  	suite.Require().True(suite.ss.Modified(suite.ctx, keyUnbondingTime))
   111  }
   112  
   113  func (suite *SubspaceTestSuite) TestUpdate() {
   114  	suite.Require().Panics(func() {
   115  		suite.ss.Update(suite.ctx, []byte("invalid_key"), nil)
   116  	})
   117  
   118  	t := time.Hour * 48
   119  	suite.Require().NotPanics(func() {
   120  		suite.ss.Set(suite.ctx, keyUnbondingTime, t)
   121  	})
   122  
   123  	bad := time.Minute * 5
   124  
   125  	bz, err := suite.cdc.MarshalJSON(bad)
   126  	suite.Require().NoError(err)
   127  	suite.Require().Error(suite.ss.Update(suite.ctx, keyUnbondingTime, bz))
   128  
   129  	good := time.Hour * 360
   130  	bz, err = suite.cdc.MarshalJSON(good)
   131  	suite.Require().NoError(err)
   132  	suite.Require().NoError(suite.ss.Update(suite.ctx, keyUnbondingTime, bz))
   133  
   134  	var v time.Duration
   135  
   136  	suite.Require().NotPanics(func() {
   137  		suite.ss.Get(suite.ctx, keyUnbondingTime, &v)
   138  	})
   139  	suite.Require().Equal(good, v)
   140  }
   141  
   142  func (suite *SubspaceTestSuite) TestGetParamSet() {
   143  	a := params{
   144  		UnbondingTime: time.Hour * 48,
   145  		MaxValidators: 100,
   146  		BondDenom:     "stake",
   147  	}
   148  	suite.Require().NotPanics(func() {
   149  		suite.ss.Set(suite.ctx, keyUnbondingTime, a.UnbondingTime)
   150  		suite.ss.Set(suite.ctx, keyMaxValidators, a.MaxValidators)
   151  		suite.ss.Set(suite.ctx, keyBondDenom, a.BondDenom)
   152  	})
   153  
   154  	b := params{}
   155  	suite.Require().NotPanics(func() {
   156  		suite.ss.GetParamSet(suite.ctx, &b)
   157  	})
   158  	suite.Require().Equal(a.UnbondingTime, b.UnbondingTime)
   159  	suite.Require().Equal(a.MaxValidators, b.MaxValidators)
   160  	suite.Require().Equal(a.BondDenom, b.BondDenom)
   161  }
   162  
   163  func (suite *SubspaceTestSuite) TestSetParamSet() {
   164  	testCases := []struct {
   165  		name string
   166  		ps   subspace.ParamSet
   167  	}{
   168  		{"invalid unbonding time", &params{time.Hour * 1, 100, "stake"}},
   169  		{"invalid bond denom", &params{time.Hour * 48, 100, ""}},
   170  	}
   171  
   172  	for _, tc := range testCases {
   173  		tc := tc
   174  		suite.Run(tc.name, func() {
   175  			suite.Require().Panics(func() {
   176  				suite.ss.SetParamSet(suite.ctx, tc.ps)
   177  			})
   178  		})
   179  	}
   180  
   181  	a := params{
   182  		UnbondingTime: time.Hour * 48,
   183  		MaxValidators: 100,
   184  		BondDenom:     "stake",
   185  	}
   186  	suite.Require().NotPanics(func() {
   187  		suite.ss.SetParamSet(suite.ctx, &a)
   188  	})
   189  
   190  	b := params{}
   191  	suite.Require().NotPanics(func() {
   192  		suite.ss.GetParamSet(suite.ctx, &b)
   193  	})
   194  	suite.Require().Equal(a.UnbondingTime, b.UnbondingTime)
   195  	suite.Require().Equal(a.MaxValidators, b.MaxValidators)
   196  	suite.Require().Equal(a.BondDenom, b.BondDenom)
   197  }
   198  
   199  func (suite *SubspaceTestSuite) TestSetParamSetForInitGenesis() {
   200  	testCases := []struct {
   201  		name       string
   202  		ps         subspace.ParamSet
   203  		ignoreList [][]byte
   204  	}{
   205  		{"ignore all", &params{time.Hour * 48, 100, "stake"}, [][]byte{keyUnbondingTime, keyMaxValidators, keyBondDenom}},
   206  		{"ignore two", &params{time.Hour * 48, 100, "stake"}, [][]byte{keyUnbondingTime, keyMaxValidators}},
   207  		{"ignore one", &params{time.Hour * 48, 100, "stake"}, [][]byte{keyUnbondingTime}},
   208  		{"ignore nil", &params{time.Hour * 48, 100, "stake"}, [][]byte{}},
   209  	}
   210  
   211  	for _, tc := range testCases {
   212  		tc := tc
   213  		suite.Run(tc.name, func() {
   214  			suite.ss.SetParamSetForInitGenesis(suite.ctx, tc.ps, tc.ignoreList)
   215  			for _, pair := range tc.ps.ParamSetPairs() {
   216  				beIgnore := false
   217  				for _, ignore := range tc.ignoreList {
   218  					if bytes.Equal(ignore, pair.Key) {
   219  						beIgnore = true
   220  						break
   221  					}
   222  				}
   223  
   224  				if beIgnore {
   225  					suite.Require().False(suite.ss.Has(suite.ctx, pair.Key))
   226  				} else {
   227  					suite.Require().True(suite.ss.Has(suite.ctx, pair.Key))
   228  				}
   229  				suite.Require().NotPanics(func() {
   230  					suite.ss.GetParamSetForInitGenesis(suite.ctx, tc.ps, tc.ignoreList)
   231  				})
   232  			}
   233  		})
   234  	}
   235  }
   236  
   237  func (suite *SubspaceTestSuite) TestName() {
   238  	suite.Require().Equal("testsubspace", suite.ss.Name())
   239  }
   240  
   241  func TestKeeperTestSuite(t *testing.T) {
   242  	suite.Run(t, new(SubspaceTestSuite))
   243  }