From eacdade8e7fcf04fa0b9d33f709ba9bfa1042cef Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Mon, 31 Jan 2022 10:32:46 +0100 Subject: [PATCH 1/4] adding test for multiple controllers, single host --- .../controller/ibc_module_test.go | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go index ca1b0db6b06..aef5b02c616 100644 --- a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go +++ b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types" icatypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" + connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v3/modules/core/24-host" ibctesting "github.com/cosmos/ibc-go/v3/testing" @@ -46,6 +47,7 @@ type InterchainAccountsTestSuite struct { // testing chains used for convenience and readability chainA *ibctesting.TestChain chainB *ibctesting.TestChain + chainC *ibctesting.TestChain } func TestICATestSuite(t *testing.T) { @@ -53,9 +55,10 @@ func TestICATestSuite(t *testing.T) { } func (suite *InterchainAccountsTestSuite) SetupTest() { - suite.coordinator = ibctesting.NewCoordinator(suite.T(), 2) + suite.coordinator = ibctesting.NewCoordinator(suite.T(), 3) suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(1)) suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(2)) + suite.chainC = suite.coordinator.GetChain(ibctesting.GetChainID(3)) } func NewICAPath(chainA, chainB *ibctesting.TestChain) *ibctesting.Path { @@ -89,6 +92,7 @@ func RegisterInterchainAccount(endpoint *ibctesting.Endpoint, owner string) erro // update port/channel ids endpoint.ChannelID = channeltypes.FormatChannelIdentifier(channelSequence) endpoint.ChannelConfig.PortID = portID + endpoint.ChannelConfig.Version = TestVersion return nil } @@ -632,3 +636,69 @@ func (suite *InterchainAccountsTestSuite) TestOnTimeoutPacket() { }) } } + +func (suite *InterchainAccountsTestSuite) TestSingleHostMultipleControllers() { + var ( + pathAToB *ibctesting.Path + pathCToB *ibctesting.Path + ) + + testCases := []struct { + msg string + malleate func() + expPass bool + }{ + { + "success", + func() {}, + true, + }, + } + + for _, tc := range testCases { + suite.Run(tc.msg, func() { + suite.SetupTest() // reset + + // Setup a new path from A(controller) -> B(host) + pathAToB = NewICAPath(suite.chainA, suite.chainB) + suite.coordinator.SetupConnections(pathAToB) + + err := SetupICAPath(pathAToB, TestOwnerAddress) + suite.Require().NoError(err) + + // Setup a new path from C(controller) -> B(host) + // NOTE: Here the version metadata is overridden to include to the next controller connection sequence (i.e. chainC's connection to chainB) + nextConnectionSeq := suite.chainB.App.GetIBCKeeper().ConnectionKeeper.GetNextConnectionSequence(suite.chainB.GetContext()) + TestVersion = string(icatypes.ModuleCdc.MustMarshalJSON(&icatypes.Metadata{ + Version: icatypes.Version, + ControllerConnectionId: ibctesting.FirstConnectionID, + HostConnectionId: connectiontypes.FormatConnectionIdentifier(nextConnectionSeq), + })) + pathCToB = NewICAPath(suite.chainC, suite.chainB) + suite.coordinator.SetupConnections(pathCToB) + + err = SetupICAPath(pathCToB, TestOwnerAddress) + suite.Require().NoError(err) + + tc.malleate() // malleate mutates test data + + accAddressChainA, found := suite.chainB.GetSimApp().ICAHostKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), pathAToB.EndpointB.ConnectionID, pathAToB.EndpointA.ChannelConfig.PortID) + suite.Require().True(found) + + accAddressChainC, found := suite.chainB.GetSimApp().ICAHostKeeper.GetInterchainAccountAddress(suite.chainB.GetContext(), pathCToB.EndpointB.ConnectionID, pathCToB.EndpointA.ChannelConfig.PortID) + suite.Require().True(found) + + suite.Require().NotEqual(accAddressChainA, accAddressChainC) + + // TODO: Update icatypes.PortID to pathAToB.EndpointA.ChannelConfig.PortID + chainAChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathAToB.EndpointB.ConnectionID, icatypes.PortID) + suite.Require().True(found) + + // TODO: Update icatypes.PortID to pathCToB.EndpointA.ChannelConfig.PortID + chainCChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathCToB.EndpointB.ConnectionID, icatypes.PortID) + suite.Require().True(found) + + suite.Require().NotEqual(chainAChannelID, chainCChannelID) + }) + } +} From 33fa16de7d43d855b73be30aad8e596c8a63aa64 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Mon, 31 Jan 2022 14:12:21 +0100 Subject: [PATCH 2/4] updating inline comments --- .../apps/27-interchain-accounts/controller/ibc_module_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go index aef5b02c616..0405d09746a 100644 --- a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go +++ b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go @@ -667,7 +667,7 @@ func (suite *InterchainAccountsTestSuite) TestSingleHostMultipleControllers() { suite.Require().NoError(err) // Setup a new path from C(controller) -> B(host) - // NOTE: Here the version metadata is overridden to include to the next controller connection sequence (i.e. chainC's connection to chainB) + // NOTE: Here the version metadata is overridden to include to the next host connection sequence (i.e. chainB's connection to chainC) nextConnectionSeq := suite.chainB.App.GetIBCKeeper().ConnectionKeeper.GetNextConnectionSequence(suite.chainB.GetContext()) TestVersion = string(icatypes.ModuleCdc.MustMarshalJSON(&icatypes.Metadata{ Version: icatypes.Version, From 105767e65b876e0e699f28b0ca9de501a105aec2 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Mon, 31 Jan 2022 16:17:49 +0100 Subject: [PATCH 3/4] updating todos with correct ports --- .../27-interchain-accounts/controller/ibc_module_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go index 0405d09746a..72b816d0a16 100644 --- a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go +++ b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go @@ -690,12 +690,10 @@ func (suite *InterchainAccountsTestSuite) TestSingleHostMultipleControllers() { suite.Require().NotEqual(accAddressChainA, accAddressChainC) - // TODO: Update icatypes.PortID to pathAToB.EndpointA.ChannelConfig.PortID - chainAChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathAToB.EndpointB.ConnectionID, icatypes.PortID) + chainAChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathAToB.EndpointB.ConnectionID, pathAToB.EndpointA.ChannelConfig.PortID) suite.Require().True(found) - // TODO: Update icatypes.PortID to pathCToB.EndpointA.ChannelConfig.PortID - chainCChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathCToB.EndpointB.ConnectionID, icatypes.PortID) + chainCChannelID, found := suite.chainB.GetSimApp().ICAHostKeeper.GetActiveChannelID(suite.chainB.GetContext(), pathCToB.EndpointB.ConnectionID, pathCToB.EndpointA.ChannelConfig.PortID) suite.Require().True(found) suite.Require().NotEqual(chainAChannelID, chainCChannelID) From 229447ac42340e89c2736938ea4cf758df876e22 Mon Sep 17 00:00:00 2001 From: Damian Nolan Date: Wed, 2 Feb 2022 13:15:02 +0100 Subject: [PATCH 4/4] reorder to use pathCToB.Endpoint for connection IDs --- .../controller/ibc_module_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go index 72b816d0a16..9fd7486cf1a 100644 --- a/modules/apps/27-interchain-accounts/controller/ibc_module_test.go +++ b/modules/apps/27-interchain-accounts/controller/ibc_module_test.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types" icatypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types" clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - connectiontypes "github.com/cosmos/ibc-go/v3/modules/core/03-connection/types" channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" host "github.com/cosmos/ibc-go/v3/modules/core/24-host" ibctesting "github.com/cosmos/ibc-go/v3/testing" @@ -667,15 +666,16 @@ func (suite *InterchainAccountsTestSuite) TestSingleHostMultipleControllers() { suite.Require().NoError(err) // Setup a new path from C(controller) -> B(host) + pathCToB = NewICAPath(suite.chainC, suite.chainB) + suite.coordinator.SetupConnections(pathCToB) + // NOTE: Here the version metadata is overridden to include to the next host connection sequence (i.e. chainB's connection to chainC) - nextConnectionSeq := suite.chainB.App.GetIBCKeeper().ConnectionKeeper.GetNextConnectionSequence(suite.chainB.GetContext()) + // SetupICAPath() will set endpoint.ChannelConfig.Version to TestVersion TestVersion = string(icatypes.ModuleCdc.MustMarshalJSON(&icatypes.Metadata{ Version: icatypes.Version, - ControllerConnectionId: ibctesting.FirstConnectionID, - HostConnectionId: connectiontypes.FormatConnectionIdentifier(nextConnectionSeq), + ControllerConnectionId: pathCToB.EndpointA.ConnectionID, + HostConnectionId: pathCToB.EndpointB.ConnectionID, })) - pathCToB = NewICAPath(suite.chainC, suite.chainB) - suite.coordinator.SetupConnections(pathCToB) err = SetupICAPath(pathCToB, TestOwnerAddress) suite.Require().NoError(err)