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  }