diff --git a/tests/tsdk/doc.go b/tests/tsdk/doc.go new file mode 100644 index 0000000000..05df667cc8 --- /dev/null +++ b/tests/tsdk/doc.go @@ -0,0 +1,2 @@ +// Package tsdk provides test utilities related to Cosmos SDK +package tsdk diff --git a/tests/tsdk/store.go b/tests/tsdk/store.go new file mode 100644 index 0000000000..ed47740723 --- /dev/null +++ b/tests/tsdk/store.go @@ -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 +} diff --git a/util/store/iter_test.go b/util/store/iter_test.go new file mode 100644 index 0000000000..0e28666bcf --- /dev/null +++ b/util/store/iter_test.go @@ -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) +} diff --git a/x/uibc/quota/keeper/keeper_test.go b/x/uibc/quota/keeper/keeper_test.go index df348c2d35..4aab08ed68 100644 --- a/x/uibc/quota/keeper/keeper_test.go +++ b/x/uibc/quota/keeper/keeper_test.go @@ -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" @@ -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" ) @@ -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 +} diff --git a/x/uibc/quota/keeper/quota_test.go b/x/uibc/quota/keeper/quota_test.go index dc82c5d39b..3cd6d94f89 100644 --- a/x/uibc/quota/keeper/quota_test.go +++ b/x/uibc/quota/keeper/quota_test.go @@ -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) @@ -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) }