From cf23dfe41a4fa13fdf2f2775fdb80ee3dd62c6d9 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Tue, 25 Aug 2020 10:58:40 +0200 Subject: [PATCH] Add open channel error tests --- x/wasm/ibc_testing/chain.go | 39 +++++++++++------- x/wasm/relay_pingpong_test.go | 77 +++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 15 deletions(-) diff --git a/x/wasm/ibc_testing/chain.go b/x/wasm/ibc_testing/chain.go index d466b315ea..e396adf54a 100644 --- a/x/wasm/ibc_testing/chain.go +++ b/x/wasm/ibc_testing/chain.go @@ -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 @@ -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() @@ -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 diff --git a/x/wasm/relay_pingpong_test.go b/x/wasm/relay_pingpong_test.go index a3d3021697..241e4e6155 100644 --- a/x/wasm/relay_pingpong_test.go +++ b/x/wasm/relay_pingpong_test.go @@ -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