github.com/Finschia/finschia-sdk@v0.48.1/store/types/utils_test.go (about) 1 package types_test 2 3 import ( 4 "bytes" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 dbm "github.com/tendermint/tm-db" 9 10 "github.com/Finschia/ostracon/libs/log" 11 12 "github.com/Finschia/finschia-sdk/store/rootmulti" 13 "github.com/Finschia/finschia-sdk/store/types" 14 ) 15 16 func initTestStores(t *testing.T) (types.KVStore, types.KVStore) { 17 db := dbm.NewMemDB() 18 ms := rootmulti.NewStore(db, log.NewNopLogger()) 19 20 key1 := types.NewKVStoreKey("store1") 21 key2 := types.NewKVStoreKey("store2") 22 require.NotPanics(t, func() { ms.MountStoreWithDB(key1, types.StoreTypeIAVL, db) }) 23 require.NotPanics(t, func() { ms.MountStoreWithDB(key2, types.StoreTypeIAVL, db) }) 24 require.NoError(t, ms.LoadLatestVersion()) 25 return ms.GetKVStore(key1), ms.GetKVStore(key2) 26 } 27 28 func TestDiffKVStores(t *testing.T) { 29 t.Parallel() 30 store1, store2 := initTestStores(t) 31 // Two equal stores 32 k1, v1 := []byte("k1"), []byte("v1") 33 store1.Set(k1, v1) 34 store2.Set(k1, v1) 35 36 kvAs, kvBs := types.DiffKVStores(store1, store2, nil) 37 require.Equal(t, 0, len(kvAs)) 38 require.Equal(t, len(kvAs), len(kvBs)) 39 40 // delete k1 from store2, which is now empty 41 store2.Delete(k1) 42 kvAs, kvBs = types.DiffKVStores(store1, store2, nil) 43 require.Equal(t, 1, len(kvAs)) 44 require.Equal(t, len(kvAs), len(kvBs)) 45 46 // set k1 in store2, different value than what store1 holds for k1 47 v2 := []byte("v2") 48 store2.Set(k1, v2) 49 kvAs, kvBs = types.DiffKVStores(store1, store2, nil) 50 require.Equal(t, 1, len(kvAs)) 51 require.Equal(t, len(kvAs), len(kvBs)) 52 53 // add k2 to store2 54 k2 := []byte("k2") 55 store2.Set(k2, v2) 56 kvAs, kvBs = types.DiffKVStores(store1, store2, nil) 57 require.Equal(t, 2, len(kvAs)) 58 require.Equal(t, len(kvAs), len(kvBs)) 59 60 // Reset stores 61 store1.Delete(k1) 62 store2.Delete(k1) 63 store2.Delete(k2) 64 65 // Same keys, different value. Comparisons will be nil as prefixes are skipped. 66 prefix := []byte("prefix:") 67 k1Prefixed := append(prefix, k1...) 68 store1.Set(k1Prefixed, v1) 69 store2.Set(k1Prefixed, v2) 70 kvAs, kvBs = types.DiffKVStores(store1, store2, [][]byte{prefix}) 71 require.Equal(t, 0, len(kvAs)) 72 require.Equal(t, len(kvAs), len(kvBs)) 73 } 74 75 func TestPrefixEndBytes(t *testing.T) { 76 t.Parallel() 77 bs1 := []byte{0x23, 0xA5, 0x06} 78 require.True(t, bytes.Equal([]byte{0x23, 0xA5, 0x07}, types.PrefixEndBytes(bs1))) 79 bs2 := []byte{0x23, 0xA5, 0xFF} 80 require.True(t, bytes.Equal([]byte{0x23, 0xA6}, types.PrefixEndBytes(bs2))) 81 require.Nil(t, types.PrefixEndBytes([]byte{0xFF})) 82 require.Nil(t, types.PrefixEndBytes(nil)) 83 } 84 85 func TestInclusiveEndBytes(t *testing.T) { 86 t.Parallel() 87 require.True(t, bytes.Equal([]byte{0x00}, types.InclusiveEndBytes(nil))) 88 bs := []byte("test") 89 require.True(t, bytes.Equal(append(bs, byte(0x00)), types.InclusiveEndBytes(bs))) 90 }