Skip to content

Commit

Permalink
Add open channel error tests
Browse files Browse the repository at this point in the history
  • Loading branch information
alpe committed Aug 25, 2020
1 parent 809b9fb commit cf23dfe
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 15 deletions.
39 changes: 24 additions & 15 deletions x/wasm/ibc_testing/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ type TestChain struct {
// IBC specific helpers
ClientIDs []string // ClientID's used on this chain
Connections []*TestConnection // track connectionID's created for this chain

// ExpSimulationPass sets assertions for sign and deliver
ExpSimulationPass bool
// ExpDeliveryPass sets assertions for sign and deliver
ExpDeliveryPass bool
}

// NewTestChain initializes a new TestChain instance with a single validator set using a
Expand Down Expand Up @@ -136,20 +141,22 @@ func NewTestChain(t *testing.T, chainID string) *TestChain {

// create an account to send transactions from
chain := &TestChain{
t: t,
ChainID: chainID,
App: app,
CurrentHeader: header,
Querier: keeper.NewQuerier(*app.IBCKeeper, legacyQuerierCdc),
QueryServer: app.IBCKeeper,
TxConfig: txConfig,
Codec: app.AppCodec(),
Vals: valSet,
Signers: signers,
senderPrivKey: senderPrivKey,
SenderAccount: acc,
ClientIDs: make([]string, 0),
Connections: make([]*TestConnection, 0),
t: t,
ChainID: chainID,
App: app,
CurrentHeader: header,
Querier: keeper.NewQuerier(*app.IBCKeeper, legacyQuerierCdc),
QueryServer: app.IBCKeeper,
TxConfig: txConfig,
Codec: app.AppCodec(),
Vals: valSet,
Signers: signers,
senderPrivKey: senderPrivKey,
SenderAccount: acc,
ClientIDs: make([]string, 0),
Connections: make([]*TestConnection, 0),
ExpSimulationPass: true,
ExpDeliveryPass: true,
}

chain.NextBlock()
Expand Down Expand Up @@ -238,7 +245,9 @@ func (chain *TestChain) SendMsgs(msgs ...sdk.Msg) (*sdk.Result, error) {
msgs,
[]uint64{chain.SenderAccount.GetAccountNumber()},
[]uint64{chain.SenderAccount.GetSequence()},
true, true, chain.senderPrivKey,
// instead of passing assertions in the helper function a detailed result object would be nice
// assertions would improve readability in tests a lot
chain.ExpSimulationPass, chain.ExpDeliveryPass, chain.senderPrivKey,
)
if err != nil {
return nil, err
Expand Down
77 changes: 77 additions & 0 deletions x/wasm/relay_pingpong_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,83 @@ func TestPinPongWithAppLevelError(t *testing.T) {
assert.Equal(t, uint64(1), pongContract.QueryState(receivedErrorBallsCountKey))
}

func TestWithNonMatchingProtocolVersionOnInit(t *testing.T) {
var (
coordinator = ibc_testing.NewCoordinator(t, 2)
chainA = coordinator.GetChain(ibc_testing.GetChainID(0))
chainB = coordinator.GetChain(ibc_testing.GetChainID(1))
)
_ = chainB.NewRandomContractInstance() // skip 1 id
var (
pingContractAddr = chainA.NewRandomContractInstance()
pongContractAddr = chainB.NewRandomContractInstance()
)
require.NotEqual(t, pingContractAddr, pongContractAddr)

pingContract := &player{t: t, actor: ping, chain: chainA, contractAddr: pingContractAddr}
pongContract := &player{t: t, actor: pong, chain: chainB, contractAddr: pongContractAddr}

wasmkeeper.MockContracts[pingContractAddr.String()] = pingContract
wasmkeeper.MockContracts[pongContractAddr.String()] = pongContract

var (
sourcePortID = wasmkeeper.PortIDForContract(pingContractAddr)
counterpartyPortID = wasmkeeper.PortIDForContract(pongContractAddr)
)
_, _, connA, _ := coordinator.SetupClientConnections(chainA, chainB, clientexported.Tendermint)

chainA.ExpSimulationPass = false
chainA.ExpDeliveryPass = false
msg := channeltypes.NewMsgChannelOpenInit(
sourcePortID, "mychannelid", "non-matching", channeltypes.UNORDERED, []string{connA.ID},
counterpartyPortID, "otherchannelid", chainA.SenderAccount.GetAddress(),
)
// when
_, err := chainA.SendMsgs(msg)
// then
require.Error(t, err)
assert.Contains(t, err.Error(), "expected \"ping\" but got \"non-matching\": invalid")
}

func TestWithNonMatchingProtocolVersionOnTry(t *testing.T) {
var (
coordinator = ibc_testing.NewCoordinator(t, 2)
chainA = coordinator.GetChain(ibc_testing.GetChainID(0))
chainB = coordinator.GetChain(ibc_testing.GetChainID(1))
)
_ = chainB.NewRandomContractInstance() // skip 1 id
var (
pingContractAddr = chainA.NewRandomContractInstance()
pongContractAddr = chainB.NewRandomContractInstance()
)
require.NotEqual(t, pingContractAddr, pongContractAddr)

pingContract := &player{t: t, actor: ping, chain: chainA, contractAddr: pingContractAddr}
pongContract := &player{t: t, actor: pong, chain: chainB, contractAddr: pongContractAddr}

wasmkeeper.MockContracts[pingContractAddr.String()] = pingContract
wasmkeeper.MockContracts[pongContractAddr.String()] = pongContract

var (
sourcePortID = wasmkeeper.PortIDForContract(pingContractAddr)
counterpartyPortID = wasmkeeper.PortIDForContract(pongContractAddr)
)
_, _, connA, connB := coordinator.SetupClientConnections(chainA, chainB, clientexported.Tendermint)
connA.NextChannelVersion = ping
connB.NextChannelVersion = "non-matching"

channelA, channelB, err := coordinator.ChanOpenInit(chainA, chainB, connA, connB, sourcePortID, counterpartyPortID, channeltypes.UNORDERED)
require.NoError(t, err)

chainB.ExpSimulationPass = false
chainB.ExpDeliveryPass = false

// when tried to open a channel on the other side
err = coordinator.ChanOpenTry(chainB, chainA, channelB, channelA, connB, channeltypes.UNORDERED)
require.Error(t, err)
assert.Contains(t, err.Error(), "expected \"pong\" but got \"non-matching\": invalid")
}

// hit is ibc packet payload
type hit map[string]uint64

Expand Down

0 comments on commit cf23dfe

Please sign in to comment.