Skip to content

Commit

Permalink
test: helper Context and KVStore functions + sample usage (#1946)
Browse files Browse the repository at this point in the history
* feat: adding Cosmos SDK context and store utils

* adding unit test

* adding iterate test

* linting

* adding a comment
  • Loading branch information
robert-zaremba authored Mar 23, 2023
1 parent b5d1760 commit b170df4
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 4 deletions.
2 changes: 2 additions & 0 deletions tests/tsdk/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// Package tsdk provides test utilities related to Cosmos SDK
package tsdk
99 changes: 99 additions & 0 deletions tests/tsdk/store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package tsdk

import (
"io"
"testing"

"github.com/cosmos/cosmos-sdk/store"
types "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/stretchr/testify/assert"
"github.com/tendermint/tendermint/libs/log"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
dbm "github.com/tendermint/tm-db"
)

// NewCommitMultiStore creats SDK Multistore
func NewCommitMultiStore(t *testing.T, keys []types.StoreKey, tkeys []types.StoreKey) types.CommitMultiStore {
db := dbm.NewMemDB()
cms := store.NewCommitMultiStore(db)
for _, k := range keys {
cms.MountStoreWithDB(k, types.StoreTypeIAVL, db)
}
for _, k := range tkeys {
cms.MountStoreWithDB(k, types.StoreTypeTransient, db)
}
err := cms.LoadLatestVersion()
assert.NoError(t, err)
return cms
}

// NewCtx creates new context with store and mounted store keys and transient store keys.
func NewCtx(t *testing.T, keys []types.StoreKey, tkeys []types.StoreKey) (sdk.Context, types.CommitMultiStore) {
cms := NewCommitMultiStore(t, keys, tkeys)
ctx := sdk.NewContext(cms, tmproto.Header{}, false, log.NewNopLogger())

return ctx, cms
}

// NewCtxq creates new context with only one store key
func NewCtxOneStore(t *testing.T, keys types.StoreKey) (sdk.Context, types.CommitMultiStore) {
return NewCtx(t, []types.StoreKey{keys}, nil)
}

// NewKVStore creates a memory based kv store without commit / wrapping functionality
func NewKVStore(t *testing.T) types.KVStore {
db := dbm.NewMemDB()
return kvStoreDB{db, t}
}

type kvStoreDB struct {
db *dbm.MemDB
t *testing.T
}

func (kvStoreDB) CacheWrap() types.CacheWrap {
panic("not implemented")
}

func (kvStoreDB) CacheWrapWithTrace(_ io.Writer, _ types.TraceContext) types.CacheWrap {
panic("not implemented")
}

func (s kvStoreDB) Get(key []byte) []byte {
o, err := s.db.Get(key)
assert.NoError(s.t, err)
return o
}

func (s kvStoreDB) Has(key []byte) bool {
o, err := s.db.Has(key)
assert.NoError(s.t, err)
return o
}

func (s kvStoreDB) Set(key, val []byte) {
err := s.db.Set(key, val)
assert.NoError(s.t, err)
}

func (s kvStoreDB) Delete(key []byte) {
err := s.db.Delete(key)
assert.NoError(s.t, err)
}

func (s kvStoreDB) GetStoreType() types.StoreType {
return types.StoreTypeMemory
}

func (s kvStoreDB) Iterator(start, end []byte) types.Iterator {
o, err := s.db.Iterator(start, end)
assert.NoError(s.t, err)
return o
}

func (s kvStoreDB) ReverseIterator(start, end []byte) types.Iterator {
o, err := s.db.ReverseIterator(start, end)
assert.NoError(s.t, err)
return o
}
40 changes: 40 additions & 0 deletions util/store/iter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package store

import (
"testing"

"github.com/umee-network/umee/v4/tests/tsdk"
"gotest.tools/v3/assert"
)

func TestIterate(t *testing.T) {
// test: insert data out of order
// expect: iterate will fetch data in order.

type pair struct {
K, V []byte
}
pairs := []pair{
{[]byte{0}, []byte{0}},
{[]byte{1, 1}, []byte{0}},
{[]byte{1, 7}, []byte{3}},
{[]byte{1, 8}, []byte{2}},
{[]byte{2, 4}, []byte{1}},
}

db := tsdk.NewKVStore(t)
db.Set(pairs[0].K, pairs[0].V)
db.Set(pairs[4].K, pairs[4].V)
db.Set(pairs[3].K, pairs[3].V)
db.Set(pairs[1].K, pairs[1].V)
db.Set(pairs[2].K, pairs[2].V)

collected := []pair{}
collect := func(k, v []byte) error {
collected = append(collected, pair{k, v})
return nil
}
Iterate(db, []byte{1}, collect)

assert.DeepEqual(t, pairs[1:4], collected)
}
10 changes: 10 additions & 0 deletions x/uibc/quota/keeper/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/cosmos/cosmos-sdk/simapp"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
"github.com/cosmos/cosmos-sdk/x/staking"
Expand All @@ -17,6 +18,7 @@ import (

umeeapp "github.com/umee-network/umee/v4/app"
appparams "github.com/umee-network/umee/v4/app/params"
"github.com/umee-network/umee/v4/tests/tsdk"
"github.com/umee-network/umee/v4/x/uibc"
"github.com/umee-network/umee/v4/x/uibc/quota/keeper"
)
Expand Down Expand Up @@ -86,3 +88,11 @@ func initKeeperTestSuite(t *testing.T) *KeeperTestSuite {

return s
}

// creates keeper without external dependencies (app, leverage etc...)
func initSimpleKeeper(t *testing.T) (sdk.Context, keeper.Keeper) {
storeKey := storetypes.NewMemoryStoreKey("quota")
k := keeper.NewKeeper(nil, storeKey, nil, nil, nil)
ctx, _ := tsdk.NewCtxOneStore(t, storeKey)
return ctx, k
}
8 changes: 4 additions & 4 deletions x/uibc/quota/keeper/quota_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import (

sdk "github.com/cosmos/cosmos-sdk/types"
"gotest.tools/v3/assert"

"github.com/umee-network/umee/v4/x/uibc/quota/keeper"
)

func TestGetQuotas(t *testing.T) {
s := initKeeperTestSuite(t)
ctx, k := s.ctx, s.app.UIbcQuotaKeeper
ctx, k := initSimpleKeeper(t)

quotas, err := k.GetAllOutflows(ctx)
assert.NilError(t, err)
Expand All @@ -29,8 +30,7 @@ func TestGetQuotas(t *testing.T) {
}

func TestGetLocalDenom(t *testing.T) {
s := initKeeperTestSuite(t)
k := s.app.UIbcQuotaKeeper
k := keeper.Keeper{}
out := k.GetLocalDenom("umee")
assert.Equal(t, "umee", out)
}
Expand Down

0 comments on commit b170df4

Please sign in to comment.