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  }