github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/store/gas/store_test.go (about) 1 package gas_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/gnolang/gno/tm2/pkg/db/memdb" 8 "github.com/gnolang/gno/tm2/pkg/store/dbadapter" 9 "github.com/gnolang/gno/tm2/pkg/store/gas" 10 "github.com/gnolang/gno/tm2/pkg/store/types" 11 12 "github.com/stretchr/testify/require" 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 t.Parallel() 22 23 mem := dbadapter.Store{memdb.NewMemDB()} 24 meter := types.NewGasMeter(10000) 25 st := gas.New(mem, meter, types.DefaultGasConfig()) 26 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 27 st.Set(keyFmt(1), valFmt(1)) 28 require.Equal(t, valFmt(1), st.Get(keyFmt(1))) 29 st.Delete(keyFmt(1)) 30 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 31 require.Equal(t, meter.GasConsumed(), types.Gas(6429)) 32 } 33 34 func TestGasKVStoreIterator(t *testing.T) { 35 t.Parallel() 36 37 mem := dbadapter.Store{memdb.NewMemDB()} 38 meter := types.NewGasMeter(10000) 39 st := gas.New(mem, meter, types.DefaultGasConfig()) 40 require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty") 41 require.Empty(t, st.Get(keyFmt(2)), "Expected `key2` to be empty") 42 st.Set(keyFmt(1), valFmt(1)) 43 st.Set(keyFmt(2), valFmt(2)) 44 iterator := st.Iterator(nil, nil) 45 ka := iterator.Key() 46 require.Equal(t, ka, keyFmt(1)) 47 va := iterator.Value() 48 require.Equal(t, va, valFmt(1)) 49 iterator.Next() 50 kb := iterator.Key() 51 require.Equal(t, kb, keyFmt(2)) 52 vb := iterator.Value() 53 require.Equal(t, vb, valFmt(2)) 54 iterator.Next() 55 require.False(t, iterator.Valid()) 56 require.Panics(t, iterator.Next) 57 require.Equal(t, meter.GasConsumed(), types.Gas(6987)) 58 } 59 60 func TestGasKVStoreOutOfGasSet(t *testing.T) { 61 t.Parallel() 62 63 mem := dbadapter.Store{memdb.NewMemDB()} 64 meter := types.NewGasMeter(0) 65 st := gas.New(mem, meter, types.DefaultGasConfig()) 66 require.Panics(t, func() { st.Set(keyFmt(1), valFmt(1)) }, "Expected out-of-gas") 67 } 68 69 func TestGasKVStoreOutOfGasIterator(t *testing.T) { 70 t.Parallel() 71 72 mem := dbadapter.Store{memdb.NewMemDB()} 73 meter := types.NewGasMeter(20000) 74 st := gas.New(mem, meter, types.DefaultGasConfig()) 75 st.Set(keyFmt(1), valFmt(1)) 76 iterator := st.Iterator(nil, nil) 77 iterator.Next() 78 require.Panics(t, func() { iterator.Value() }, "Expected out-of-gas") 79 }