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  }