cosmos-sdk/store/gaskvstore_test.go

107 lines
3.0 KiB
Go
Raw Normal View History

2018-05-11 08:46:50 -07:00
package store
import (
"testing"
"github.com/tendermint/iavl"
2018-07-26 18:24:18 -07:00
dbm "github.com/tendermint/tendermint/libs/db"
2018-05-11 08:46:50 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
2018-07-26 18:24:18 -07:00
2018-05-11 08:46:50 -07:00
"github.com/stretchr/testify/require"
)
func newGasKVStore() KVStore {
meter := sdk.NewGasMeter(1000)
mem := dbStoreAdapter{dbm.NewMemDB()}
2018-09-27 11:52:29 -07:00
return NewGasKVStore(meter, sdk.KVGasConfig(), mem)
2018-05-11 08:46:50 -07:00
}
2018-09-18 10:16:51 -07:00
func TestGasKVStoreBasic(t *testing.T) {
2018-05-11 08:46:50 -07:00
mem := dbStoreAdapter{dbm.NewMemDB()}
meter := sdk.NewGasMeter(1000)
2018-09-27 11:52:29 -07:00
st := NewGasKVStore(meter, sdk.KVGasConfig(), mem)
2018-05-11 08:46:50 -07:00
require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty")
st.Set(keyFmt(1), valFmt(1))
require.Equal(t, valFmt(1), st.Get(keyFmt(1)))
2018-05-11 11:02:05 -07:00
st.Delete(keyFmt(1))
require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty")
require.Equal(t, meter.GasConsumed(), sdk.Gas(193))
2018-05-11 08:46:50 -07:00
}
2018-09-18 10:16:51 -07:00
func TestGasKVStoreIterator(t *testing.T) {
2018-05-11 11:02:05 -07:00
mem := dbStoreAdapter{dbm.NewMemDB()}
meter := sdk.NewGasMeter(1000)
2018-09-27 11:52:29 -07:00
st := NewGasKVStore(meter, sdk.KVGasConfig(), mem)
2018-05-11 11:02:05 -07:00
require.Empty(t, st.Get(keyFmt(1)), "Expected `key1` to be empty")
require.Empty(t, st.Get(keyFmt(2)), "Expected `key2` to be empty")
st.Set(keyFmt(1), valFmt(1))
st.Set(keyFmt(2), valFmt(2))
iterator := st.Iterator(nil, nil)
ka := iterator.Key()
require.Equal(t, ka, keyFmt(1))
va := iterator.Value()
require.Equal(t, va, valFmt(1))
iterator.Next()
kb := iterator.Key()
require.Equal(t, kb, keyFmt(2))
vb := iterator.Value()
require.Equal(t, vb, valFmt(2))
iterator.Next()
require.False(t, iterator.Valid())
require.Panics(t, iterator.Next)
require.Equal(t, meter.GasConsumed(), sdk.Gas(384))
2018-05-11 11:02:05 -07:00
}
2018-09-18 10:16:51 -07:00
func TestGasKVStoreOutOfGasSet(t *testing.T) {
2018-05-11 08:46:50 -07:00
mem := dbStoreAdapter{dbm.NewMemDB()}
meter := sdk.NewGasMeter(0)
2018-09-27 11:52:29 -07:00
st := NewGasKVStore(meter, sdk.KVGasConfig(), mem)
2018-05-11 08:46:50 -07:00
require.Panics(t, func() { st.Set(keyFmt(1), valFmt(1)) }, "Expected out-of-gas")
}
2018-05-11 11:02:05 -07:00
2018-09-18 10:16:51 -07:00
func TestGasKVStoreOutOfGasIterator(t *testing.T) {
2018-05-11 11:02:05 -07:00
mem := dbStoreAdapter{dbm.NewMemDB()}
meter := sdk.NewGasMeter(200)
2018-09-27 11:52:29 -07:00
st := NewGasKVStore(meter, sdk.KVGasConfig(), mem)
2018-05-11 11:02:05 -07:00
st.Set(keyFmt(1), valFmt(1))
iterator := st.Iterator(nil, nil)
iterator.Next()
require.Panics(t, func() { iterator.Value() }, "Expected out-of-gas")
}
2018-07-26 18:24:18 -07:00
2018-09-18 10:16:51 -07:00
func testGasKVStoreWrap(t *testing.T, store KVStore) {
2018-07-26 18:24:18 -07:00
meter := sdk.NewGasMeter(10000)
store = store.Gas(meter, sdk.GasConfig{HasCost: 10})
require.Equal(t, uint64(0), meter.GasConsumed())
2018-07-26 18:24:18 -07:00
store.Has([]byte("key"))
require.Equal(t, uint64(10), meter.GasConsumed())
2018-07-26 18:24:18 -07:00
store = store.Gas(meter, sdk.GasConfig{HasCost: 20})
store.Has([]byte("key"))
require.Equal(t, uint64(40), meter.GasConsumed())
2018-07-26 18:24:18 -07:00
}
2018-09-18 10:16:51 -07:00
func TestGasKVStoreWrap(t *testing.T) {
2018-07-26 18:24:18 -07:00
db := dbm.NewMemDB()
tree := iavl.NewMutableTree(db, cacheSize)
2018-07-26 18:24:18 -07:00
iavl := newIAVLStore(tree, numRecent, storeEvery)
2018-09-18 10:16:51 -07:00
testGasKVStoreWrap(t, iavl)
2018-07-26 18:24:18 -07:00
st := NewCacheKVStore(iavl)
2018-09-18 10:16:51 -07:00
testGasKVStoreWrap(t, st)
2018-07-26 18:24:18 -07:00
pref := st.Prefix([]byte("prefix"))
2018-09-18 10:16:51 -07:00
testGasKVStoreWrap(t, pref)
2018-07-26 18:24:18 -07:00
dsa := dbStoreAdapter{dbm.NewMemDB()}
2018-09-18 10:16:51 -07:00
testGasKVStoreWrap(t, dsa)
2018-07-26 18:24:18 -07:00
ts := newTransientStore()
2018-09-18 10:16:51 -07:00
testGasKVStoreWrap(t, ts)
2018-07-26 18:24:18 -07:00
}