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