From 5c2805dbec37e8e4831a05a6eed8a6fe8e80ac9a Mon Sep 17 00:00:00 2001 From: mossid Date: Thu, 15 Mar 2018 16:34:24 +0100 Subject: [PATCH] add test --- x/ibc/errors.go | 13 +++++++ x/ibc/handler.go | 14 ++++---- x/ibc/ibc_test.go | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 x/ibc/errors.go create mode 100644 x/ibc/ibc_test.go diff --git a/x/ibc/errors.go b/x/ibc/errors.go new file mode 100644 index 0000000000..00762d5899 --- /dev/null +++ b/x/ibc/errors.go @@ -0,0 +1,13 @@ +package ibc + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +const ( + CodeInvalidSequence sdk.CodeType = 201 +) + +func ErrInvalidSequence() sdk.Error { + return sdk.NewError(CodeInvalidSequence, "") +} diff --git a/x/ibc/handler.go b/x/ibc/handler.go index 3db752fd65..8f55d647f6 100644 --- a/x/ibc/handler.go +++ b/x/ibc/handler.go @@ -4,15 +4,17 @@ import ( "reflect" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/cosmos/cosmos-sdk/x/bank" ) -func NewHandler(ibcm IBCMapper) sdk.Handler { +func NewHandler(ibcm IBCMapper, ck bank.CoinKeeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { switch msg := msg.(type) { case IBCTransferMsg: - return handleIBCTransferMsg(ctx, ibcm, msg) + return handleIBCTransferMsg(ctx, ibcm, ck, msg) case IBCReceiveMsg: - return handleIBCReceiveMsg(ctx, ibcm, msg) + return handleIBCReceiveMsg(ctx, ibcm, ck, msg) default: errMsg := "Unrecognized IBC Msg type: " + reflect.TypeOf(msg).Name() return sdk.ErrUnknownRequest(errMsg).Result() @@ -20,16 +22,16 @@ func NewHandler(ibcm IBCMapper) sdk.Handler { } } -func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCTransferMsg) sdk.Result { +func handleIBCTransferMsg(ctx sdk.Context, ibcm IBCMapper, ck bank.CoinKeeper, msg IBCTransferMsg) sdk.Result { ibcm.PushPacket(ctx, msg.IBCPacket) return sdk.Result{} } -func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, msg IBCReceiveMsg) sdk.Result { +func handleIBCReceiveMsg(ctx sdk.Context, ibcm IBCMapper, ck bank.CoinKeeper, msg IBCReceiveMsg) sdk.Result { packet := msg.IBCPacket seq := ibcm.GetIngressSequence(ctx, packet.SrcChain) if msg.Sequence != seq { - return sdk.Result{} // error + return ErrInvalidSequence().Result() } ibcm.SetIngressSequence(ctx, packet.SrcChain, seq+1) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go new file mode 100644 index 0000000000..0aca03d781 --- /dev/null +++ b/x/ibc/ibc_test.go @@ -0,0 +1,87 @@ +package ibc + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + abci "github.com/tendermint/abci/types" + "github.com/tendermint/go-crypto" + dbm "github.com/tendermint/tmlibs/db" + + "github.com/cosmos/cosmos-sdk/store" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func defaultContext(key sdk.StoreKey) sdk.Context { + db := dbm.NewMemDB() + cms := store.NewCommitMultiStore(db) + cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) + cms.LoadLatestVersion() + ctx := sdk.NewContext(cms, abci.Header{}, false, nil) + return ctx +} + +func newAddress() crypto.Address { + return crypto.GenPrivKeyEd25519().PubKey().Address() +} + +func TestHandler(t *testing.T) { + key := sdk.NewKVStoreKey("ibc") + ctx := defaultContext(key) + ibcm := NewIBCMapper(key) + + h := NewHandler(ibcm) + + src := newAddress() + dest := newAddress() + chainid := "ibcchain" + coin := sdk.Coin{Denom: "neutron", Amount: 10000} + + packet := IBCPacket{ + SrcAddr: src, + DestAddr: dest, + Coins: sdk.Coins{coin}, + SrcChain: chainid, + DestChain: chainid, + } + + store := ctx.KVStore(key) + + var msg sdk.Msg + var res sdk.Result + var egl int64 + var igs int64 + + egl = ibcm.getEgressLength(store, chainid) + assert.Equal(t, egl, int64(0)) + + msg = IBCTransferMsg{ + IBCPacket: packet, + } + res = h(ctx, msg) + assert.True(t, res.IsOK()) + + egl = ibcm.getEgressLength(store, chainid) + assert.Equal(t, egl, int64(1)) + + igs = ibcm.GetIngressSequence(ctx, chainid) + assert.Equal(t, igs, int64(0)) + + msg = IBCReceiveMsg{ + IBCPacket: packet, + Relayer: src, + Sequence: 0, + } + res = h(ctx, msg) + assert.True(t, res.IsOK()) + + igs = ibcm.GetIngressSequence(ctx, chainid) + assert.Equal(t, igs, int64(1)) + + res = h(ctx, msg) + assert.False(t, res.IsOK()) + + igs = ibcm.GetIngressSequence(ctx, chainid) + assert.Equal(t, igs, int64(1)) +}