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 }