From c729a6e8e3f07b3f806aa3cb9cdfb9fecd28d873 Mon Sep 17 00:00:00 2001 From: violet Date: Thu, 12 Sep 2024 10:25:55 -0400 Subject: [PATCH] Add a test for pre-upgrade wasm contracts --- tests/interchain/cosmwasm_test.go | 148 ++++++++++++++++++++---------- 1 file changed, 98 insertions(+), 50 deletions(-) diff --git a/tests/interchain/cosmwasm_test.go b/tests/interchain/cosmwasm_test.go index f6a4f709fe..fd55c46bf5 100644 --- a/tests/interchain/cosmwasm_test.go +++ b/tests/interchain/cosmwasm_test.go @@ -13,30 +13,56 @@ import ( type CosmWasmSuite struct { *chainsuite.Suite + ContractWasm []byte + ContractPath string + PreUpgradeContractCode string + PreUpgradeContractAddr string } -func (s *CosmWasmSuite) TestPermissionedCosmWasm() { - const ( - initState = `{"count": 100}` - query = `{"get_count":{}}` - increment = `{"increment":{}}` - ) +const ( + initState = `{"count": 100}` + query = `{"get_count":{}}` + increment = `{"increment":{}}` +) + +func (s *CosmWasmSuite) SetupSuite() { + s.Suite.SetupSuite() contractWasm, err := os.ReadFile("testdata/contract.wasm") s.Require().NoError(err) + s.ContractWasm = contractWasm + s.Require().NoError(s.Chain.GetNode().WriteFile(s.GetContext(), s.ContractWasm, "contract.wasm")) + s.ContractPath = path.Join(s.Chain.GetNode().HomeDir(), "contract.wasm") - s.Require().NoError(s.Chain.GetNode().WriteFile(s.GetContext(), contractWasm, "contract.wasm")) - contractPath := path.Join(s.Chain.GetNode().HomeDir(), "contract.wasm") + code, contractAddr := s.storeInstantiateProposal(initState) + s.PreUpgradeContractCode = code + s.PreUpgradeContractAddr = contractAddr - govAddr, err := s.Chain.GetGovernanceAddress(s.GetContext()) - s.Require().NoError(err) + s.UpgradeChain() +} + +func (s *CosmWasmSuite) TestPreUpgradeContract() { + count := s.getContractCount(s.PreUpgradeContractAddr) + s.Require().Equal(int64(100), count) + + s.executeContractByTx(s.PreUpgradeContractAddr) + + count = s.getContractCount(s.PreUpgradeContractAddr) + s.Require().Equal(int64(101), count) + s.executeContractByProposal(s.PreUpgradeContractAddr) + + count = s.getContractCount(s.PreUpgradeContractAddr) + s.Require().Equal(int64(102), count) +} + +func (s *CosmWasmSuite) TestCantStoreWithoutProp() { infos, err := s.Chain.QueryJSON(s.GetContext(), "code_infos", "wasm", "list-code") s.Require().NoError(err) codeCountBefore := len(infos.Array()) _, err = s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, - "wasm", "store", contractPath, + "wasm", "store", s.ContractPath, ) s.Require().Error(err) @@ -44,53 +70,42 @@ func (s *CosmWasmSuite) TestPermissionedCosmWasm() { s.Require().NoError(err) codeCountAfter := len(infos.Array()) s.Require().Equal(codeCountBefore, codeCountAfter) +} - txhash, err := s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, - "wasm", "submit-proposal", "store-instantiate", - contractPath, - initState, "--label", "my-contract", - "--no-admin", "--instantiate-nobody", "true", - "--title", "Store and instantiate template", - "--summary", "Store and instantiate template", - "--deposit", fmt.Sprintf("10000000%s", s.Config.ChainSpec.Denom), +func (s *CosmWasmSuite) TestCantInstantiateWithoutProp() { + _, err := s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, + "wasm", "instantiate", s.PreUpgradeContractCode, initState, "--label", "my-contract", "--no-admin", ) - s.Require().NoError(err) + s.Require().Error(err) +} - proposalId, err := s.Chain.GetProposalID(s.GetContext(), txhash) - s.Require().NoError(err) +func (s *CosmWasmSuite) TestCreateNewContract() { - err = s.Chain.PassProposal(s.GetContext(), proposalId) - s.Require().NoError(err) + _, contractAddr := s.storeInstantiateProposal(initState) - codeJSON, err := s.Chain.QueryJSON(s.GetContext(), fmt.Sprintf("code_infos.#(creator=\"%s\").code_id", govAddr), "wasm", "list-code") - s.Require().NoError(err) - code := codeJSON.String() + count := s.getContractCount(contractAddr) + s.Require().Equal(int64(100), count) - contractAddrJSON, err := s.Chain.QueryJSON(s.GetContext(), "contracts.0", "wasm", "list-contract-by-code", code) - s.Require().NoError(err) - contractAddr := contractAddrJSON.String() + s.executeContractByTx(contractAddr) - _, err = s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, - "wasm", "instantiate", code, initState, "--label", "my-contract", "--no-admin", - ) - s.Require().Error(err) + count = s.getContractCount(contractAddr) + s.Require().Equal(int64(101), count) - countJSON, err := s.Chain.QueryJSON(s.GetContext(), "data.count", "wasm", "contract-state", "smart", contractAddr, query) - s.Require().NoError(err) - count := countJSON.Int() - s.Require().Equal(int64(100), count) + s.executeContractByProposal(contractAddr) - _, err = s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, + count = s.getContractCount(contractAddr) + s.Require().Equal(int64(102), count) +} + +func (s *CosmWasmSuite) executeContractByTx(contractAddr string) { + _, err := s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, "wasm", "execute", contractAddr, increment, ) s.Require().NoError(err) +} - countJSON, err = s.Chain.QueryJSON(s.GetContext(), "data.count", "wasm", "contract-state", "smart", contractAddr, query) - s.Require().NoError(err) - count = countJSON.Int() - s.Require().Equal(int64(101), count) - - txhash, err = s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, +func (s *CosmWasmSuite) executeContractByProposal(contractAddr string) { + txhash, err := s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, "wasm", "submit-proposal", "execute-contract", contractAddr, increment, "--title", "Increment count", @@ -99,21 +114,54 @@ func (s *CosmWasmSuite) TestPermissionedCosmWasm() { ) s.Require().NoError(err) - proposalId, err = s.Chain.GetProposalID(s.GetContext(), txhash) + proposalId, err := s.Chain.GetProposalID(s.GetContext(), txhash) s.Require().NoError(err) err = s.Chain.PassProposal(s.GetContext(), proposalId) s.Require().NoError(err) +} - countJSON, err = s.Chain.QueryJSON(s.GetContext(), "data.count", "wasm", "contract-state", "smart", contractAddr, query) +func (s *CosmWasmSuite) getContractCount(contractAddr string) int64 { + countJSON, err := s.Chain.QueryJSON(s.GetContext(), "data.count", "wasm", "contract-state", "smart", contractAddr, query) s.Require().NoError(err) - count = countJSON.Int() - s.Require().Equal(int64(102), count) + count := countJSON.Int() + return count +} + +func (s *CosmWasmSuite) storeInstantiateProposal(initState string) (string, string) { + govAddr, err := s.Chain.GetGovernanceAddress(s.GetContext()) + s.Require().NoError(err) + + txhash, err := s.Chain.GetNode().ExecTx(s.GetContext(), interchaintest.FaucetAccountKeyName, + "wasm", "submit-proposal", "store-instantiate", + s.ContractPath, + initState, "--label", "my-contract", + "--no-admin", "--instantiate-nobody", "true", + "--title", "Store and instantiate template", + "--summary", "Store and instantiate template", + "--deposit", fmt.Sprintf("10000000%s", s.Config.ChainSpec.Denom), + ) + s.Require().NoError(err) + + proposalId, err := s.Chain.GetProposalID(s.GetContext(), txhash) + s.Require().NoError(err) + + err = s.Chain.PassProposal(s.GetContext(), proposalId) + s.Require().NoError(err) + + codeJSON, err := s.Chain.QueryJSON(s.GetContext(), fmt.Sprintf("code_infos.#(creator=\"%s\").code_id", govAddr), "wasm", "list-code") + s.Require().NoError(err) + code := codeJSON.String() + + contractAddrJSON, err := s.Chain.QueryJSON(s.GetContext(), "contracts.0", "wasm", "list-contract-by-code", code) + s.Require().NoError(err) + contractAddr := contractAddrJSON.String() + return code, contractAddr } func TestCosmWasm(t *testing.T) { s := &CosmWasmSuite{ - Suite: chainsuite.NewSuite(chainsuite.SuiteConfig{UpgradeOnSetup: true}), + Suite: chainsuite.NewSuite(chainsuite.SuiteConfig{UpgradeOnSetup: false}), } suite.Run(t, s) }