github.com/Finschia/finschia-sdk@v0.48.1/store/gaskv/store_test.go (about) 1 package gaskv_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 dbm "github.com/tendermint/tm-db" 10 11 "github.com/Finschia/finschia-sdk/store/dbadapter" 12 "github.com/Finschia/finschia-sdk/store/gaskv" 13 "github.com/Finschia/finschia-sdk/store/types" 14 ) 15 16 func bz(s string) []byte { return []byte(s) } 17 18 func keyFmt(i int) []byte { return bz(fmt.Sprintf("key%0.8d", i)) } 19 func valFmt(i int) []byte { return bz(fmt.Sprintf("value%0.8d", i)) } 20 21 func TestGasKVStoreBasic(t *testing.T) { 22 mem := dbadapter.Store{DB: dbm.NewMemDB()} 23 meter := types.NewGasMeter(10000) 24 st := gaskv.NewStore(mem, meter, types.KVGasConfig()) 25 26 require.Equal(t, types.StoreTypeDB, st.GetStoreType()) 27 require.Panics(t, func() { st.CacheWrap() }) 28 require.Panics(t, func() { st.CacheWrapWithTrace(nil, nil) }) 29 require.Panics(t, func() { st.CacheWrapWithListeners(nil, nil) }) 30 31 require.Panics(t, func() { st.Set(nil, []byte("value")) }, "setting a nil key should panic") 32 require.Panics(t, func() { st.Set([]byte(""), []byte("value")) }, "setting an empty key should panic") 33 34 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 35 st.Set(keyFmt(1), valFmt(1)) 36 require.Equal(t, valFmt(1), st.Get(keyFmt(1))) 37 st.Delete(keyFmt(1)) 38 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 39 require.Equal(t, meter.GasConsumed(), types.Gas(6858)) 40 } 41 42 func TestGasKVStoreIterator(t *testing.T) { 43 mem := dbadapter.Store{DB: dbm.NewMemDB()} 44 meter := types.NewGasMeter(100000) 45 st := gaskv.NewStore(mem, meter, types.KVGasConfig()) 46 require.False(t, st.Has(keyFmt(1))) 47 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 48 require.Empty(t, st.Get(keyFmt(2)), "Expected `key2` to be empty") 49 require.Empty(t, st.Get(keyFmt(3)), "Expected `key3` to be empty") 50 51 st.Set(keyFmt(1), valFmt(1)) 52 require.True(t, st.Has(keyFmt(1))) 53 st.Set(keyFmt(2), valFmt(2)) 54 require.True(t, st.Has(keyFmt(2))) 55 st.Set(keyFmt(3), valFmt(0)) 56 57 iterator := st.Iterator(nil, nil) 58 start, end := iterator.Domain() 59 require.Nil(t, start) 60 require.Nil(t, end) 61 require.NoError(t, iterator.Error()) 62 63 t.Cleanup(func() { 64 if err := iterator.Close(); err != nil { 65 t.Fatal(err) 66 } 67 }) 68 ka := iterator.Key() 69 require.Equal(t, ka, keyFmt(1)) 70 va := iterator.Value() 71 require.Equal(t, va, valFmt(1)) 72 iterator.Next() 73 kb := iterator.Key() 74 require.Equal(t, kb, keyFmt(2)) 75 vb := iterator.Value() 76 require.Equal(t, vb, valFmt(2)) 77 iterator.Next() 78 79 require.Equal(t, types.Gas(14565), meter.GasConsumed()) 80 kc := iterator.Key() 81 require.Equal(t, kc, keyFmt(3)) 82 vc := iterator.Value() 83 require.Equal(t, vc, valFmt(0)) 84 iterator.Next() 85 require.Equal(t, types.Gas(14667), meter.GasConsumed()) 86 require.False(t, iterator.Valid()) 87 require.Panics(t, iterator.Next) 88 require.Equal(t, types.Gas(14697), meter.GasConsumed()) 89 90 require.NoError(t, iterator.Error()) 91 92 reverseIterator := st.ReverseIterator(nil, nil) 93 t.Cleanup(func() { 94 if err := reverseIterator.Close(); err != nil { 95 t.Fatal(err) 96 } 97 }) 98 require.Equal(t, reverseIterator.Key(), keyFmt(3)) 99 reverseIterator.Next() 100 require.Equal(t, reverseIterator.Key(), keyFmt(2)) 101 reverseIterator.Next() 102 require.Equal(t, reverseIterator.Key(), keyFmt(1)) 103 reverseIterator.Next() 104 require.False(t, reverseIterator.Valid()) 105 require.Panics(t, reverseIterator.Next) 106 107 require.Equal(t, types.Gas(15135), meter.GasConsumed()) 108 } 109 110 func TestGasKVStoreOutOfGasSet(t *testing.T) { 111 mem := dbadapter.Store{DB: dbm.NewMemDB()} 112 meter := types.NewGasMeter(0) 113 st := gaskv.NewStore(mem, meter, types.KVGasConfig()) 114 require.Panics(t, func() { st.Set(keyFmt(1), valFmt(1)) }, "Expected out-of-gas") 115 } 116 117 func TestGasKVStoreOutOfGasIterator(t *testing.T) { 118 mem := dbadapter.Store{DB: dbm.NewMemDB()} 119 meter := types.NewGasMeter(20000) 120 st := gaskv.NewStore(mem, meter, types.KVGasConfig()) 121 st.Set(keyFmt(1), valFmt(1)) 122 iterator := st.Iterator(nil, nil) 123 iterator.Next() 124 require.Panics(t, func() { iterator.Value() }, "Expected out-of-gas") 125 }