add test
This commit is contained in:
parent
cd79574927
commit
5c2805dbec
13
x/ibc/errors.go
Normal file
13
x/ibc/errors.go
Normal file
@ -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, "")
|
||||
}
|
||||
@ -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)
|
||||
|
||||
|
||||
87
x/ibc/ibc_test.go
Normal file
87
x/ibc/ibc_test.go
Normal file
@ -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))
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user