-
Notifications
You must be signed in to change notification settings - Fork 624
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
e2e: adding e2e upgrade test for ibc-go v7 #2902
Changes from all commits
b75938b
75db3a9
bd2834e
b3b63e2
59546d8
9013bcb
376b7cd
8a24eef
f3be122
bb07835
546c4a6
01e50c1
86cccb9
d5cca8b
623b6b7
deaa5ca
e6f1d2b
c9cc0b5
7960c22
1788963
d30011b
f13dc99
b21ebe1
d25710b
1a43b17
e037284
a2bf19c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,8 +24,13 @@ import ( | |
"github.com/cosmos/ibc-go/e2e/testvalues" | ||
controllertypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/controller/types" | ||
icatypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/types" | ||
v7migrations "github.com/cosmos/ibc-go/v6/modules/core/02-client/migrations/v7" | ||
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types" | ||
"github.com/cosmos/ibc-go/v6/modules/core/exported" | ||
solomachine "github.com/cosmos/ibc-go/v6/modules/light-clients/06-solomachine" | ||
ibctesting "github.com/cosmos/ibc-go/v6/testing" | ||
simappupgrades "github.com/cosmos/ibc-go/v6/testing/simapp/upgrades" | ||
v7upgrades "github.com/cosmos/ibc-go/v6/testing/simapp/upgrades/v7" | ||
) | ||
|
||
const ( | ||
|
@@ -70,6 +75,10 @@ func (s *UpgradeTestSuite) UpgradeChain(ctx context.Context, chain *cosmos.Cosmo | |
err = chain.StartAllNodes(ctx) | ||
s.Require().NoError(err, "error starting upgraded node(s)") | ||
|
||
// we are reinitializing the clients because we need to update the hostGRPCAddress after | ||
// the upgrade and subsequent restarting of nodes | ||
s.InitGRPCClients(chain) | ||
chatton marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
timeoutCtx, timeoutCtxCancel = context.WithTimeout(ctx, time.Minute*2) | ||
defer timeoutCtxCancel() | ||
|
||
|
@@ -386,6 +395,160 @@ func (s *UpgradeTestSuite) TestV5ToV6ChainUpgrade() { | |
}) | ||
} | ||
|
||
// TestV6ToV7ChainUpgrade will test that an upgrade from a v6 ibc-go binary to a v7 ibc-go binary is successful | ||
// and that the automatic migrations associated with the 02-client module are performed. Namely that the solo machine | ||
// proto definition is migrated in state from the v2 to v3 definition. This is checked by creating a solo machine client | ||
// before the upgrade and asserting that its TypeURL has been changed after the upgrade. The test also ensure packets | ||
// can be sent before and after the upgrade without issue | ||
func (s *UpgradeTestSuite) TestV6ToV7ChainUpgrade() { | ||
colin-axner marked this conversation as resolved.
Show resolved
Hide resolved
|
||
t := s.T() | ||
testCfg := testconfig.FromEnv() | ||
|
||
ctx := context.Background() | ||
relayer, channelA := s.SetupChainsRelayerAndChannel(ctx) | ||
chainA, chainB := s.GetChains() | ||
|
||
var ( | ||
chainADenom = chainA.Config().Denom | ||
chainBIBCToken = testsuite.GetIBCToken(chainADenom, channelA.Counterparty.PortID, channelA.Counterparty.ChannelID) // IBC token sent to chainB | ||
) | ||
|
||
chainAWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) | ||
chainAAddress := chainAWallet.Bech32Address(chainA.Config().Bech32Prefix) | ||
|
||
chainBWallet := s.CreateUserOnChainB(ctx, testvalues.StartingTokenAmount) | ||
chainBAddress := chainBWallet.Bech32Address(chainB.Config().Bech32Prefix) | ||
|
||
// create second tendermint client | ||
createClientOptions := ibc.CreateClientOptions{ | ||
TrustingPeriod: ibctesting.TrustingPeriod.String(), | ||
} | ||
|
||
s.SetupClients(ctx, relayer, createClientOptions) | ||
|
||
s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") | ||
|
||
t.Run("check that both tendermint clients are active", func(t *testing.T) { | ||
status, err := s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(0)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(exported.Active.String(), status) | ||
|
||
status, err = s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(1)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(exported.Active.String(), status) | ||
}) | ||
|
||
// create solo machine client using the solomachine implementation from ibctesting | ||
// TODO: the solomachine clientID should be updated when after fix of this issue: https://github.com/cosmos/ibc-go/issues/2907 | ||
solo := ibctesting.NewSolomachine(t, testsuite.Codec(), "solomachine", "testing", 1) | ||
|
||
legacyConsensusState := &v7migrations.ConsensusState{ | ||
PublicKey: solo.ConsensusState().PublicKey, | ||
Diversifier: solo.ConsensusState().Diversifier, | ||
Timestamp: solo.ConsensusState().Timestamp, | ||
} | ||
|
||
legacyClientState := &v7migrations.ClientState{ | ||
Sequence: solo.ClientState().Sequence, | ||
IsFrozen: solo.ClientState().IsFrozen, | ||
ConsensusState: legacyConsensusState, | ||
AllowUpdateAfterProposal: true, | ||
} | ||
|
||
msgCreateSoloMachineClient, err := clienttypes.NewMsgCreateClient(legacyClientState, legacyConsensusState, chainAAddress) | ||
s.Require().NoError(err) | ||
|
||
resp, err := s.BroadcastMessages( | ||
ctx, | ||
chainA, | ||
chainAWallet, | ||
msgCreateSoloMachineClient, | ||
) | ||
|
||
s.AssertValidTxResponse(resp) | ||
s.Require().NoError(err) | ||
|
||
t.Run("check that the solomachine is now active and that the clientstate is a pre-upgrade v2 solomachine clientstate", func(t *testing.T) { | ||
status, err := s.QueryClientStatus(ctx, chainA, testvalues.SolomachineClientID(2)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(exported.Active.String(), status) | ||
|
||
res, err := s.ClientState(ctx, chainA, testvalues.SolomachineClientID(2)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(fmt.Sprint("/", proto.MessageName(&v7migrations.ClientState{})), res.ClientState.TypeUrl) | ||
}) | ||
|
||
s.Require().NoError(test.WaitForBlocks(ctx, 1, chainA, chainB), "failed to wait for blocks") | ||
|
||
t.Run("IBC token transfer from chainA to chainB, sender is source of tokens", func(t *testing.T) { | ||
transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "") | ||
s.Require().NoError(err) | ||
s.AssertValidTxResponse(transferTxResp) | ||
}) | ||
|
||
t.Run("tokens are escrowed", func(t *testing.T) { | ||
actualBalance, err := s.GetChainANativeBalance(ctx, chainAWallet) | ||
s.Require().NoError(err) | ||
|
||
expected := testvalues.StartingTokenAmount - testvalues.IBCTransferAmount | ||
s.Require().Equal(expected, actualBalance) | ||
}) | ||
|
||
t.Run("start relayer", func(t *testing.T) { | ||
s.StartRelayer(relayer) | ||
}) | ||
|
||
t.Run("packets are relayed", func(t *testing.T) { | ||
s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1) | ||
|
||
actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom()) | ||
s.Require().NoError(err) | ||
|
||
expected := testvalues.IBCTransferAmount | ||
s.Require().Equal(expected, actualBalance) | ||
}) | ||
|
||
// create separate user specifically for the upgrade proposal to more easily verify starting | ||
// and end balances of the chainA users. | ||
chainAUpgradeProposalWallet := s.CreateUserOnChainA(ctx, testvalues.StartingTokenAmount) | ||
|
||
t.Run("upgrade chainA", func(t *testing.T) { | ||
s.UpgradeChain(ctx, chainA, chainAUpgradeProposalWallet, v7upgrades.UpgradeName, testCfg.ChainAConfig.Tag, testCfg.UpgradeTag) | ||
}) | ||
|
||
t.Run("check that the tendermint clients are active again after upgrade", func(t *testing.T) { | ||
status, err := s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(0)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(exported.Active.String(), status) | ||
|
||
status, err = s.QueryClientStatus(ctx, chainA, testvalues.TendermintClientID(1)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(exported.Active.String(), status) | ||
}) | ||
|
||
t.Run("IBC token transfer from chainA to chainB, to make sure the upgrade did not break the packet flow", func(t *testing.T) { | ||
transferTxResp, err := s.Transfer(ctx, chainA, chainAWallet, channelA.PortID, channelA.ChannelID, testvalues.DefaultTransferAmount(chainADenom), chainAAddress, chainBAddress, s.GetTimeoutHeight(ctx, chainB), 0, "") | ||
s.Require().NoError(err) | ||
s.AssertValidTxResponse(transferTxResp) | ||
}) | ||
|
||
t.Run("packets are relayed", func(t *testing.T) { | ||
s.AssertPacketRelayed(ctx, chainA, channelA.PortID, channelA.ChannelID, 1) | ||
|
||
actualBalance, err := chainB.GetBalance(ctx, chainBAddress, chainBIBCToken.IBCDenom()) | ||
s.Require().NoError(err) | ||
|
||
expected := testvalues.IBCTransferAmount * 2 | ||
s.Require().Equal(expected, actualBalance) | ||
}) | ||
|
||
t.Run("check that the v2 solo machine clientstate has been updated to the v3 solo machine clientstate", func(t *testing.T) { | ||
res, err := s.ClientState(ctx, chainA, testvalues.SolomachineClientID(2)) | ||
s.Require().NoError(err) | ||
s.Require().Equal(fmt.Sprint("/", proto.MessageName(&solomachine.ClientState{})), res.ClientState.TypeUrl) | ||
}) | ||
} | ||
|
||
// RegisterInterchainAccount will attempt to register an interchain account on the counterparty chain. | ||
func (s *UpgradeTestSuite) RegisterInterchainAccount(ctx context.Context, chain *cosmos.CosmosChain, user *ibc.Wallet, msgRegisterAccount *intertxtypes.MsgRegisterAccount) error { | ||
txResp, err := s.BroadcastMessages(ctx, chain, user, msgRegisterAccount) | ||
|
@@ -405,3 +568,16 @@ func getICAVersion(chainAVersion, chainBVersion string) string { | |
// explicitly set the version string because the host chain might not yet support incentivized channels. | ||
return icatypes.NewDefaultMetadataString(ibctesting.FirstConnectionID, ibctesting.FirstConnectionID) | ||
} | ||
|
||
// ClientState queries the current ClientState by clientID | ||
func (s *UpgradeTestSuite) ClientState(ctx context.Context, chain ibc.Chain, clientID string) (*clienttypes.QueryClientStateResponse, error) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. fetching client state might be something we want to do in other tests, I'm happy to leave it here for now, but it might be worth moving this to the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i could move this one and Status as well, I think they are generic enough functions There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah you mean to return
colin-axner marked this conversation as resolved.
Show resolved
Hide resolved
|
||
queryClient := s.GetChainGRCPClients(chain).ClientQueryClient | ||
res, err := queryClient.ClientState(ctx, &clienttypes.QueryClientStateRequest{ | ||
ClientId: clientID, | ||
}) | ||
if err != nil { | ||
return res, err | ||
} | ||
|
||
return res, nil | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks for adding this!