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