add CacheContext

This commit is contained in:
mossid
2018-04-10 17:04:27 +02:00
parent 3f2a8e789a
commit 442e677300
2 changed files with 50 additions and 2 deletions
+9 -2
View File
@@ -16,12 +16,13 @@ The intent of Context is for it to be an immutable object that can be
cloned and updated cheaply with WithValue() and passed forward to the
next decorator or handler. For example,
func MsgHandler(ctx Context, tx Tx) Result {
func MsgHandler(context Context, tx Tx) Result {
...
ctx = ctx.WithValue(key, value)
context = context.WithValue(key, value)
...
}
*/
type Context struct {
context.Context
pst *thePast
@@ -171,6 +172,12 @@ func (c Context) WithTxBytes(txBytes []byte) Context {
return c.withValue(contextKeyTxBytes, txBytes)
}
func (c Context) CacheContext() (Context, func()) {
cms := c.multiStore().CacheMultiStore()
cc := c.WithMultiStore(cms)
return cc, cms.Write
}
//----------------------------------------
// thePast
+41
View File
@@ -3,6 +3,11 @@ package types_test
import (
"testing"
"github.com/stretchr/testify/assert"
dbm "github.com/tendermint/tmlibs/db"
"github.com/cosmos/cosmos-sdk/store"
"github.com/cosmos/cosmos-sdk/types"
abci "github.com/tendermint/abci/types"
)
@@ -18,3 +23,39 @@ func TestContextGetOpShouldNeverPanic(t *testing.T) {
_, _ = ctx.GetOp(index)
}
}
func defaultContext(key types.StoreKey) types.Context {
db := dbm.NewMemDB()
cms := store.NewCommitMultiStore(db)
cms.MountStoreWithDB(key, types.StoreTypeIAVL, db)
cms.LoadLatestVersion()
ctx := types.NewContext(cms, abci.Header{}, false, nil)
return ctx
}
func TestCacheContext(t *testing.T) {
key := types.NewKVStoreKey(t.Name())
k1 := []byte("hello")
v1 := []byte("world")
k2 := []byte("key")
v2 := []byte("value")
ctx := defaultContext(key)
store := ctx.KVStore(key)
store.Set(k1, v1)
assert.Equal(t, v1, store.Get(k1))
assert.Nil(t, store.Get(k2))
cctx, write := ctx.CacheContext()
cstore := cctx.KVStore(key)
assert.Equal(t, v1, cstore.Get(k1))
assert.Nil(t, cstore.Get(k2))
cstore.Set(k2, v2)
assert.Equal(t, v2, cstore.Get(k2))
assert.Nil(t, store.Get(k2))
write()
assert.Equal(t, v2, store.Get(k2))
}