github.com/Finschia/finschia-sdk@v0.48.1/types/store_test.go (about)

     1  package types_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/suite"
     7  	dbm "github.com/tendermint/tm-db"
     8  
     9  	"github.com/Finschia/ostracon/libs/log"
    10  
    11  	"github.com/Finschia/finschia-sdk/store/rootmulti"
    12  	"github.com/Finschia/finschia-sdk/store/types"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  )
    15  
    16  type storeTestSuite struct {
    17  	suite.Suite
    18  }
    19  
    20  func TestStoreTestSuite(t *testing.T) {
    21  	suite.Run(t, new(storeTestSuite))
    22  }
    23  
    24  func (s *storeTestSuite) SetupSuite() {
    25  	s.T().Parallel()
    26  }
    27  
    28  func (s *storeTestSuite) TestPrefixEndBytes() {
    29  	testCases := []struct {
    30  		prefix   []byte
    31  		expected []byte
    32  	}{
    33  		{[]byte{byte(55), byte(255), byte(255), byte(0)}, []byte{byte(55), byte(255), byte(255), byte(1)}},
    34  		{[]byte{byte(55), byte(255), byte(255), byte(15)}, []byte{byte(55), byte(255), byte(255), byte(16)}},
    35  		{[]byte{byte(55), byte(200), byte(255)}, []byte{byte(55), byte(201)}},
    36  		{[]byte{byte(55), byte(255), byte(255)}, []byte{byte(56)}},
    37  		{[]byte{byte(255), byte(255), byte(255)}, nil},
    38  		{[]byte{byte(255)}, nil},
    39  		{nil, nil},
    40  	}
    41  
    42  	for _, test := range testCases {
    43  		end := sdk.PrefixEndBytes(test.prefix)
    44  		s.Require().Equal(test.expected, end)
    45  	}
    46  }
    47  
    48  func (s *storeTestSuite) TestCommitID() {
    49  	var empty sdk.CommitID
    50  	s.Require().True(empty.IsZero())
    51  
    52  	nonempty := sdk.CommitID{
    53  		Version: 1,
    54  		Hash:    []byte("testhash"),
    55  	}
    56  	s.Require().False(nonempty.IsZero())
    57  }
    58  
    59  func (s *storeTestSuite) TestNewTransientStoreKeys() {
    60  	s.Require().Equal(map[string]*sdk.TransientStoreKey{}, sdk.NewTransientStoreKeys())
    61  	s.Require().Equal(1, len(sdk.NewTransientStoreKeys("one")))
    62  }
    63  
    64  func (s *storeTestSuite) TestNewInfiniteGasMeter() {
    65  	gm := sdk.NewInfiniteGasMeter()
    66  	s.Require().NotNil(gm)
    67  	_, ok := gm.(types.GasMeter)
    68  	s.Require().True(ok)
    69  }
    70  
    71  func (s *storeTestSuite) TestStoreTypes() {
    72  	s.Require().Equal(sdk.InclusiveEndBytes([]byte("endbytes")), types.InclusiveEndBytes([]byte("endbytes")))
    73  }
    74  
    75  func (s *storeTestSuite) TestDiffKVStores() {
    76  	store1, store2 := s.initTestStores()
    77  	// Two equal stores
    78  	k1, v1 := []byte("k1"), []byte("v1")
    79  	store1.Set(k1, v1)
    80  	store2.Set(k1, v1)
    81  
    82  	s.checkDiffResults(store1, store2)
    83  
    84  	// delete k1 from store2, which is now empty
    85  	store2.Delete(k1)
    86  	s.checkDiffResults(store1, store2)
    87  
    88  	// set k1 in store2, different value than what store1 holds for k1
    89  	v2 := []byte("v2")
    90  	store2.Set(k1, v2)
    91  	s.checkDiffResults(store1, store2)
    92  
    93  	// add k2 to store2
    94  	k2 := []byte("k2")
    95  	store2.Set(k2, v2)
    96  	s.checkDiffResults(store1, store2)
    97  
    98  	// Reset stores
    99  	store1.Delete(k1)
   100  	store2.Delete(k1)
   101  	store2.Delete(k2)
   102  
   103  	// Same keys, different value. Comparisons will be nil as prefixes are skipped.
   104  	prefix := []byte("prefix:")
   105  	k1Prefixed := append(prefix, k1...)
   106  	store1.Set(k1Prefixed, v1)
   107  	store2.Set(k1Prefixed, v2)
   108  	s.checkDiffResults(store1, store2)
   109  }
   110  
   111  func (s *storeTestSuite) initTestStores() (types.KVStore, types.KVStore) {
   112  	db := dbm.NewMemDB()
   113  	ms := rootmulti.NewStore(db, log.NewNopLogger())
   114  
   115  	key1 := types.NewKVStoreKey("store1")
   116  	key2 := types.NewKVStoreKey("store2")
   117  	s.Require().NotPanics(func() { ms.MountStoreWithDB(key1, types.StoreTypeIAVL, db) })
   118  	s.Require().NotPanics(func() { ms.MountStoreWithDB(key2, types.StoreTypeIAVL, db) })
   119  	s.Require().NoError(ms.LoadLatestVersion())
   120  	return ms.GetKVStore(key1), ms.GetKVStore(key2)
   121  }
   122  
   123  func (s *storeTestSuite) checkDiffResults(store1, store2 types.KVStore) {
   124  	kvAs1, kvBs1 := sdk.DiffKVStores(store1, store2, nil)
   125  	kvAs2, kvBs2 := types.DiffKVStores(store1, store2, nil)
   126  	s.Require().Equal(kvAs1, kvAs2)
   127  	s.Require().Equal(kvBs1, kvBs2)
   128  }