628 lines
21 KiB
Go
628 lines
21 KiB
Go
package keeper_test
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
|
|
connection "github.com/cosmos/cosmos-sdk/x/ibc/03-connection"
|
|
"github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types"
|
|
host "github.com/cosmos/cosmos-sdk/x/ibc/24-host"
|
|
)
|
|
|
|
func (suite *KeeperTestSuite) TestChanOpenInit() {
|
|
counterparty := types.NewCounterparty(testPort2, testChannel2)
|
|
|
|
var portCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDB, testClientIDA,
|
|
connection.INIT,
|
|
)
|
|
}, true},
|
|
{"channel already exists", func() {
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.INIT,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"connection doesn't exist", func() {}, false},
|
|
{"connection is UNINITIALIZED", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDB, testClientIDA,
|
|
connection.UNINITIALIZED,
|
|
)
|
|
}, false},
|
|
{"capability is incorrect", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDB, testClientIDA,
|
|
connection.INIT,
|
|
)
|
|
portCap = capabilitytypes.NewCapability(3)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
portCap, err = suite.chainA.App.ScopedIBCKeeper.NewCapability(
|
|
suite.chainA.GetContext(), host.PortPath(testPort1),
|
|
)
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
cap, err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenInit(
|
|
suite.chainA.GetContext(), types.ORDERED, []string{testConnectionIDA},
|
|
testPort1, testChannel1, portCap, counterparty, testChannelVersion,
|
|
)
|
|
|
|
if tc.expPass {
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
suite.Require().NotNil(cap)
|
|
chanCap, ok := suite.chainA.App.ScopedIBCKeeper.GetCapability(
|
|
suite.chainA.GetContext(),
|
|
host.ChannelCapabilityPath(testPort1, testChannel1),
|
|
)
|
|
suite.Require().True(ok, "could not retrieve channel capapbility after successful ChanOpenInit")
|
|
suite.Require().Equal(chanCap.String(), cap.String(), "channel capability is not correct")
|
|
} else {
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *KeeperTestSuite) TestChanOpenTry() {
|
|
counterparty := types.NewCounterparty(testPort1, testChannel1)
|
|
channelKey := host.KeyChannel(testPort1, testChannel1)
|
|
|
|
var portCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB, connection.OPEN)
|
|
suite.chainB.createChannel(testPort1, testChannel1, testPort2, testChannel2, types.INIT, types.ORDERED, testConnectionIDA)
|
|
}, true},
|
|
{"previous channel with invalid state", func() {
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.UNINITIALIZED,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"connection doesn't exist", func() {}, false},
|
|
{"connection is not OPEN", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.INIT,
|
|
)
|
|
}, false},
|
|
{"consensus state not found", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
}, false},
|
|
{"channel verification failed", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
}, false},
|
|
{"port capability not found", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB, connection.OPEN)
|
|
suite.chainB.createChannel(testPort1, testChannel1, testPort2, testChannel2, types.INIT, types.ORDERED, testConnectionIDA)
|
|
portCap = capabilitytypes.NewCapability(3)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
portCap, err = suite.chainA.App.ScopedIBCKeeper.NewCapability(suite.chainA.GetContext(), host.PortPath(testPort2))
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
|
|
suite.chainA.updateClient(suite.chainB)
|
|
suite.chainB.updateClient(suite.chainA)
|
|
proof, proofHeight := queryProof(suite.chainB, channelKey)
|
|
|
|
if tc.expPass {
|
|
cap, err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenTry(
|
|
suite.chainA.GetContext(), types.ORDERED, []string{testConnectionIDB},
|
|
testPort2, testChannel2, portCap, counterparty, testChannelVersion, testChannelVersion,
|
|
proof, proofHeight+1,
|
|
)
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
suite.Require().NotNil(cap)
|
|
chanCap, ok := suite.chainA.App.ScopedIBCKeeper.GetCapability(
|
|
suite.chainA.GetContext(),
|
|
host.ChannelCapabilityPath(testPort2, testChannel2),
|
|
)
|
|
suite.Require().True(ok, "could not retrieve channel capapbility after successful ChanOpenInit")
|
|
suite.Require().Equal(chanCap.String(), cap.String(), "channel capability is not correct")
|
|
} else {
|
|
_, err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenTry(
|
|
suite.chainA.GetContext(), types.ORDERED, []string{testConnectionIDB},
|
|
testPort2, testChannel2, portCap, counterparty, testChannelVersion, testChannelVersion,
|
|
proof, proofHeight,
|
|
)
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *KeeperTestSuite) TestChanOpenAck() {
|
|
channelKey := host.KeyChannel(testPort2, testChannel2)
|
|
|
|
var channelCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.INIT,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, true},
|
|
{"channel doesn't exist", func() {}, false},
|
|
{"channel state is not INIT or TRYOPEN", func() {
|
|
suite.chainB.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.UNINITIALIZED,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"connection not found", func() {
|
|
suite.chainB.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"connection is not OPEN", func() {
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"consensus state not found", func() {
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"channel verification failed", func() {
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"channel capability not found", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.INIT,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
channelCap = capabilitytypes.NewCapability(3)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
channelCap, err = suite.chainA.App.ScopedIBCKeeper.NewCapability(suite.chainA.GetContext(), host.ChannelCapabilityPath(testPort1, testChannel1))
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
|
|
suite.chainA.updateClient(suite.chainB)
|
|
suite.chainB.updateClient(suite.chainA)
|
|
proof, proofHeight := queryProof(suite.chainB, channelKey)
|
|
|
|
if tc.expPass {
|
|
err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenAck(
|
|
suite.chainA.GetContext(), testPort1, testChannel1, channelCap, testChannelVersion,
|
|
proof, proofHeight+1,
|
|
)
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
} else {
|
|
err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenAck(
|
|
suite.chainA.GetContext(), testPort1, testChannel1, channelCap, testChannelVersion,
|
|
proof, proofHeight+1,
|
|
)
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *KeeperTestSuite) TestChanOpenConfirm() {
|
|
channelKey := host.KeyChannel(testPort2, testChannel2)
|
|
|
|
var channelCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainB.createChannel(testPort1, testChannel1, testPort2, testChannel2,
|
|
types.TRYOPEN, types.ORDERED, testConnectionIDA)
|
|
}, true},
|
|
{"channel doesn't exist", func() {}, false},
|
|
{"channel state is not TRYOPEN", func() {
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.UNINITIALIZED,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"connection not found", func() {
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"connection is not OPEN", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"consensus state not found", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"channel verification failed", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.TRYOPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"channel capability not found", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDB, testClientIDA,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainB.createChannel(testPort1, testChannel1, testPort2, testChannel2,
|
|
types.TRYOPEN, types.ORDERED, testConnectionIDA)
|
|
channelCap = capabilitytypes.NewCapability(3)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
channelCap, err = suite.chainB.App.ScopedIBCKeeper.NewCapability(suite.chainB.GetContext(), host.ChannelCapabilityPath(testPort1, testChannel1))
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
|
|
suite.chainA.updateClient(suite.chainB)
|
|
suite.chainB.updateClient(suite.chainA)
|
|
proof, proofHeight := queryProof(suite.chainA, channelKey)
|
|
|
|
if tc.expPass {
|
|
err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanOpenConfirm(
|
|
suite.chainB.GetContext(), testPort1, testChannel1,
|
|
channelCap, proof, proofHeight+1,
|
|
)
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
} else {
|
|
err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanOpenConfirm(
|
|
suite.chainB.GetContext(), testPort1, testChannel1, channelCap,
|
|
proof, proofHeight+1,
|
|
)
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *KeeperTestSuite) TestChanCloseInit() {
|
|
var channelCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.OPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, true},
|
|
{"channel doesn't exist", func() {}, false},
|
|
{"channel state is CLOSED", func() {
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.CLOSED,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"connection not found", func() {
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.OPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"connection is not OPEN", func() {
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.UNINITIALIZED,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"channel capability not found", func() {
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.OPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
channelCap = capabilitytypes.NewCapability(3)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
channelCap, err = suite.chainA.App.ScopedIBCKeeper.NewCapability(suite.chainA.GetContext(), host.ChannelCapabilityPath(testPort1, testChannel1))
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
err = suite.chainA.App.IBCKeeper.ChannelKeeper.ChanCloseInit(
|
|
suite.chainA.GetContext(), testPort1, testChannel1, channelCap,
|
|
)
|
|
|
|
if tc.expPass {
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
} else {
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *KeeperTestSuite) TestChanCloseConfirm() {
|
|
channelKey := host.KeyChannel(testPort1, testChannel1)
|
|
|
|
var channelCap *capabilitytypes.Capability
|
|
testCases := []testCase{
|
|
{"success", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.CLOSED,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, true},
|
|
{"channel doesn't exist", func() {}, false},
|
|
{"channel state is CLOSED", func() {
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.CLOSED,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"connection not found", func() {
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
{"connection is not OPEN", func() {
|
|
suite.chainB.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDA, testClientIDB,
|
|
connection.TRYOPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"consensus state not found", func() {
|
|
suite.chainB.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"channel verification failed", func() {
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
}, false},
|
|
{"channel capability not found", func() {
|
|
suite.chainA.CreateClient(suite.chainB)
|
|
suite.chainB.CreateClient(suite.chainA)
|
|
suite.chainB.createConnection(
|
|
testConnectionIDB, testConnectionIDA, testClientIDA, testClientIDB,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainA.createConnection(
|
|
testConnectionIDA, testConnectionIDB, testClientIDB, testClientIDA,
|
|
connection.OPEN,
|
|
)
|
|
suite.chainB.createChannel(
|
|
testPort2, testChannel2, testPort1, testChannel1, types.OPEN,
|
|
types.ORDERED, testConnectionIDB,
|
|
)
|
|
suite.chainA.createChannel(
|
|
testPort1, testChannel1, testPort2, testChannel2, types.CLOSED,
|
|
types.ORDERED, testConnectionIDA,
|
|
)
|
|
}, false},
|
|
}
|
|
|
|
for i, tc := range testCases {
|
|
tc := tc
|
|
i := i
|
|
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
|
|
suite.SetupTest() // reset
|
|
|
|
var err error
|
|
channelCap, err = suite.chainB.App.ScopedIBCKeeper.NewCapability(suite.chainB.GetContext(), host.ChannelCapabilityPath(testPort2, testChannel2))
|
|
suite.Require().NoError(err, "could not create capability")
|
|
|
|
tc.malleate()
|
|
|
|
suite.chainA.updateClient(suite.chainB)
|
|
suite.chainB.updateClient(suite.chainA)
|
|
proof, proofHeight := queryProof(suite.chainA, channelKey)
|
|
|
|
if tc.expPass {
|
|
err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanCloseConfirm(
|
|
suite.chainB.GetContext(), testPort2, testChannel2, channelCap,
|
|
proof, proofHeight+1,
|
|
)
|
|
suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg)
|
|
} else {
|
|
err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanCloseConfirm(
|
|
suite.chainB.GetContext(), testPort2, testChannel2, channelCap,
|
|
proof, proofHeight,
|
|
)
|
|
suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
type testCase = struct {
|
|
msg string
|
|
malleate func()
|
|
expPass bool
|
|
}
|