cosmos-sdk/x/ibc/ibc_test.go

135 lines
3.1 KiB
Go
Raw Normal View History

2018-03-18 15:38:18 -07:00
package ibc
import (
"testing"
"github.com/stretchr/testify/assert"
abci "github.com/tendermint/abci/types"
2018-05-23 22:09:01 -07:00
crypto "github.com/tendermint/go-crypto"
2018-03-18 15:38:18 -07:00
dbm "github.com/tendermint/tmlibs/db"
2018-04-23 03:35:09 -07:00
"github.com/tendermint/tmlibs/log"
2018-03-18 15:38:18 -07:00
"github.com/cosmos/cosmos-sdk/store"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
"github.com/cosmos/cosmos-sdk/x/auth"
"github.com/cosmos/cosmos-sdk/x/bank"
)
2018-04-18 21:49:24 -07:00
// AccountMapper(/Keeper) and IBCMapper should use different StoreKey later
2018-03-18 15:38:18 -07:00
func defaultContext(key sdk.StoreKey) sdk.Context {
db := dbm.NewMemDB()
cms := store.NewCommitMultiStore(db)
cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db)
cms.LoadLatestVersion()
2018-04-23 03:35:09 -07:00
ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger())
2018-03-18 15:38:18 -07:00
return ctx
}
func newAddress() crypto.Address {
return crypto.GenPrivKeyEd25519().PubKey().Address()
}
2018-04-18 21:49:24 -07:00
func getCoins(ck bank.Keeper, ctx sdk.Context, addr crypto.Address) (sdk.Coins, sdk.Error) {
2018-04-07 00:02:00 -07:00
zero := sdk.Coins(nil)
coins, _, err := ck.AddCoins(ctx, addr, zero)
return coins, err
2018-03-18 15:38:18 -07:00
}
func makeCodec() *wire.Codec {
2018-04-06 17:25:08 -07:00
var cdc = wire.NewCodec()
// Register Msgs
cdc.RegisterInterface((*sdk.Msg)(nil), nil)
2018-04-18 21:49:24 -07:00
cdc.RegisterConcrete(bank.MsgSend{}, "test/ibc/Send", nil)
cdc.RegisterConcrete(bank.MsgIssue{}, "test/ibc/Issue", nil)
2018-04-06 17:25:08 -07:00
cdc.RegisterConcrete(IBCTransferMsg{}, "test/ibc/IBCTransferMsg", nil)
cdc.RegisterConcrete(IBCReceiveMsg{}, "test/ibc/IBCReceiveMsg", nil)
// Register AppAccount
2018-05-23 22:09:01 -07:00
cdc.RegisterInterface((*auth.Account)(nil), nil)
2018-04-06 17:25:08 -07:00
cdc.RegisterConcrete(&auth.BaseAccount{}, "test/ibc/Account", nil)
2018-04-07 00:02:00 -07:00
wire.RegisterCrypto(cdc)
2018-03-18 15:38:18 -07:00
return cdc
}
func TestIBC(t *testing.T) {
2018-03-19 16:22:49 -07:00
cdc := makeCodec()
2018-03-18 15:38:18 -07:00
key := sdk.NewKVStoreKey("ibc")
ctx := defaultContext(key)
2018-04-07 00:02:00 -07:00
am := auth.NewAccountMapper(cdc, key, &auth.BaseAccount{})
2018-04-18 21:49:24 -07:00
ck := bank.NewKeeper(am)
2018-03-18 15:38:18 -07:00
src := newAddress()
dest := newAddress()
chainid := "ibcchain"
2018-04-07 00:02:00 -07:00
zero := sdk.Coins(nil)
mycoins := sdk.Coins{sdk.NewCoin("mycoin", 10)}
2018-03-18 15:38:18 -07:00
coins, _, err := ck.AddCoins(ctx, src, mycoins)
2018-03-18 15:38:18 -07:00
assert.Nil(t, err)
assert.Equal(t, mycoins, coins)
2018-04-18 21:49:24 -07:00
ibcm := NewMapper(cdc, key, DefaultCodespace)
2018-03-18 15:38:18 -07:00
h := NewHandler(ibcm, ck)
packet := IBCPacket{
SrcAddr: src,
DestAddr: dest,
Coins: mycoins,
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())
coins, err = getCoins(ck, ctx, src)
assert.Nil(t, err)
assert.Equal(t, zero, coins)
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())
coins, err = getCoins(ck, ctx, dest)
assert.Nil(t, err)
assert.Equal(t, mycoins, coins)
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))
}