github.com/Finschia/finschia-sdk@v0.49.1/x/params/types/subspace_test.go (about)

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