From 35b3f6057fcbd31c8d5a6b2243decc5b1dad3ae2 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Fri, 23 Dec 2022 20:58:26 +0800 Subject: [PATCH] tests: make integration test more stable (#1488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wait new blk right before send tx * larger timeout_commit for priority test * larger timeout_commit for mempool related test * mv chain id test to cluster used test * keep cluster in module scope * sync gomod2nix * adjust timeout_commit * rm prune all in indexer config * add missing min_gas_multiplier * wait 1 more blk in upgrade * only keep 2 validators * add retry for grpc_eth_call * wait 1 block before stop * fix lint * disable recheck * bump up upgrade * sync gomod2nix * Apply suggestions from code review * Apply suggestions from code review * append node log * fix lint * expect less gas after ecd76396eb55dc44535842018c5f13f234af7da3 * allow retry continue on empty rsp * update gomod2nix * fix flake * mod tidy * keep grpc only test * tests(integration): enable recheck tx mode * update gomod2nix Co-authored-by: Federico Kunze Küllmer <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Freddy Caceres Co-authored-by: Tom --- .../configs/cosmovisor.jsonnet | 5 +- .../integration_tests/configs/default.jsonnet | 4 - .../configs/enable-indexer.jsonnet | 13 ++- .../configs/long_timeout_commit.jsonnet | 11 +++ .../configs/pruned_node.jsonnet | 9 ++ .../configs/rollback-test.jsonnet | 2 +- .../configs/upgrade-test-package.nix | 4 +- tests/integration_tests/conftest.py | 34 +------- tests/integration_tests/cosmoscli.py | 10 ++- tests/integration_tests/expected_constants.py | 59 ++++++++++--- tests/integration_tests/network.py | 8 +- tests/integration_tests/test_basic.py | 3 - tests/integration_tests/test_filters.py | 85 +++++++++++++++++++ tests/integration_tests/test_priority.py | 14 ++- tests/integration_tests/test_rollback.py | 38 ++++----- tests/integration_tests/test_upgrade.py | 7 +- tests/integration_tests/utils.py | 15 ++-- 17 files changed, 221 insertions(+), 100 deletions(-) create mode 100644 tests/integration_tests/configs/long_timeout_commit.jsonnet delete mode 100644 tests/integration_tests/test_basic.py diff --git a/tests/integration_tests/configs/cosmovisor.jsonnet b/tests/integration_tests/configs/cosmovisor.jsonnet index 1fbf075f05..dc3cb1a4a2 100644 --- a/tests/integration_tests/configs/cosmovisor.jsonnet +++ b/tests/integration_tests/configs/cosmovisor.jsonnet @@ -2,13 +2,14 @@ local config = import 'default.jsonnet'; config { 'ethermint_9000-1'+: { + 'app-config'+: { + 'minimum-gas-prices': '100000000000aphoton', + }, genesis+: { app_state+: { feemarket+: { params+: { - no_base_fee: false, base_fee:: super.base_fee, - initial_base_fee: super.base_fee, }, }, }, diff --git a/tests/integration_tests/configs/default.jsonnet b/tests/integration_tests/configs/default.jsonnet index deffe43c88..b181297d5b 100644 --- a/tests/integration_tests/configs/default.jsonnet +++ b/tests/integration_tests/configs/default.jsonnet @@ -4,10 +4,6 @@ cmd: 'ethermintd', 'start-flags': '--trace', config: { - consensus: { - // larger timeout for more stable mempool tests - timeout_commit: '10s', - }, mempool: { // use v1 mempool to enable tx prioritization version: 'v1', diff --git a/tests/integration_tests/configs/enable-indexer.jsonnet b/tests/integration_tests/configs/enable-indexer.jsonnet index c21c6a98c0..1a5b0d14dc 100644 --- a/tests/integration_tests/configs/enable-indexer.jsonnet +++ b/tests/integration_tests/configs/enable-indexer.jsonnet @@ -8,13 +8,18 @@ config { }, }, 'app-config'+: { - pruning: 'everything', - 'state-sync'+: { - 'snapshot-interval': 0, - }, 'json-rpc'+: { 'enable-indexer': true, }, }, + genesis+: { + app_state+: { + feemarket+: { + params+: { + min_gas_multiplier: '0', + }, + }, + }, + }, }, } diff --git a/tests/integration_tests/configs/long_timeout_commit.jsonnet b/tests/integration_tests/configs/long_timeout_commit.jsonnet new file mode 100644 index 0000000000..b54ad60e0e --- /dev/null +++ b/tests/integration_tests/configs/long_timeout_commit.jsonnet @@ -0,0 +1,11 @@ +local default = import 'default.jsonnet'; + +default { + 'ethermint_9000-1'+: { + config+: { + consensus+: { + timeout_commit: '5s', + }, + }, + }, +} diff --git a/tests/integration_tests/configs/pruned_node.jsonnet b/tests/integration_tests/configs/pruned_node.jsonnet index ffb6a83044..cd00fc0a7d 100644 --- a/tests/integration_tests/configs/pruned_node.jsonnet +++ b/tests/integration_tests/configs/pruned_node.jsonnet @@ -8,5 +8,14 @@ config { 'snapshot-interval': 0, }, }, + genesis+: { + app_state+: { + feemarket+: { + params+: { + min_gas_multiplier: '0', + }, + }, + }, + }, }, } diff --git a/tests/integration_tests/configs/rollback-test.jsonnet b/tests/integration_tests/configs/rollback-test.jsonnet index e39437ec58..0e6c3ffca3 100644 --- a/tests/integration_tests/configs/rollback-test.jsonnet +++ b/tests/integration_tests/configs/rollback-test.jsonnet @@ -2,7 +2,7 @@ local config = import 'default.jsonnet'; config { 'ethermint_9000-1'+: { - validators: super.validators + [{ + validators: super.validators[0:1] + [{ name: 'fullnode', }], }, diff --git a/tests/integration_tests/configs/upgrade-test-package.nix b/tests/integration_tests/configs/upgrade-test-package.nix index a703086f90..6b8345cef8 100644 --- a/tests/integration_tests/configs/upgrade-test-package.nix +++ b/tests/integration_tests/configs/upgrade-test-package.nix @@ -4,9 +4,9 @@ let released = pkgs.buildGo118Module rec { name = "ethermintd"; # the commit before https://github.com/evmos/ethermint/pull/943 - src = fetchEthermint "f21592ebfe74da7590eb42ed926dae970b2a9a3f"; + src = fetchEthermint "8866ae0ffd67a104e9d1cf4e50fba8391dda6c45"; subPackages = [ "cmd/ethermintd" ]; - vendorSha256 = "sha256-ABm5t6R/u2S6pThGrgdsqe8n3fH5tIWw7a57kxJPbYw="; + vendorSha256 = "sha256-oDtMamNlwe/393fZd+RNtRy6ipWpusbco8Xg1ZuKWYw="; doCheck = false; }; current = pkgs.callPackage ../../../. { }; diff --git a/tests/integration_tests/conftest.py b/tests/integration_tests/conftest.py index ea50d89071..bd3f66fddf 100644 --- a/tests/integration_tests/conftest.py +++ b/tests/integration_tests/conftest.py @@ -1,8 +1,6 @@ -from pathlib import Path - import pytest -from .network import setup_custom_ethermint, setup_ethermint, setup_geth +from .network import setup_ethermint, setup_geth @pytest.fixture(scope="session") @@ -11,42 +9,12 @@ def ethermint(tmp_path_factory): yield from setup_ethermint(path, 26650) -@pytest.fixture(scope="session") -def ethermint_indexer(tmp_path_factory): - path = tmp_path_factory.mktemp("indexer") - yield from setup_custom_ethermint( - path, 26660, Path(__file__).parent / "configs/enable-indexer.jsonnet" - ) - - @pytest.fixture(scope="session") def geth(tmp_path_factory): path = tmp_path_factory.mktemp("geth") yield from setup_geth(path, 8545) -@pytest.fixture( - scope="session", params=["ethermint", "geth", "ethermint-ws", "enable-indexer"] -) -def cluster(request, ethermint, ethermint_indexer, geth): - """ - run on both ethermint and geth - """ - provider = request.param - if provider == "ethermint": - yield ethermint - elif provider == "geth": - yield geth - elif provider == "ethermint-ws": - ethermint_ws = ethermint.copy() - ethermint_ws.use_websocket() - yield ethermint_ws - elif provider == "enable-indexer": - yield ethermint_indexer - else: - raise NotImplementedError - - @pytest.fixture( scope="session", params=["ethermint", "ethermint-ws"] ) diff --git a/tests/integration_tests/cosmoscli.py b/tests/integration_tests/cosmoscli.py index 374bca8507..4cda17b6dc 100644 --- a/tests/integration_tests/cosmoscli.py +++ b/tests/integration_tests/cosmoscli.py @@ -6,6 +6,7 @@ from pystarport.utils import build_cli_args_safe, interact DEFAULT_GAS_PRICE = "5000000000000aphoton" +DEFAULT_GAS = "250000" class ChainCommand: @@ -631,16 +632,19 @@ def edit_validator( ) def gov_propose(self, proposer, kind, proposal, **kwargs): + method = "submit-legacy-proposal" kwargs.setdefault("gas_prices", DEFAULT_GAS_PRICE) + kwargs.setdefault("gas", DEFAULT_GAS) if kind == "software-upgrade": return json.loads( self.raw( "tx", "gov", - "submit-proposal", + method, kind, proposal["name"], "-y", + "--no-validate", from_=proposer, # content title=proposal.get("title"), @@ -659,7 +663,7 @@ def gov_propose(self, proposer, kind, proposal, **kwargs): self.raw( "tx", "gov", - "submit-proposal", + method, kind, "-y", from_=proposer, @@ -680,7 +684,7 @@ def gov_propose(self, proposer, kind, proposal, **kwargs): self.raw( "tx", "gov", - "submit-proposal", + method, kind, fp.name, "-y", diff --git a/tests/integration_tests/expected_constants.py b/tests/integration_tests/expected_constants.py index 85bee9b6e0..e1b911ebc3 100644 --- a/tests/integration_tests/expected_constants.py +++ b/tests/integration_tests/expected_constants.py @@ -71,16 +71,51 @@ EXPECTED_GET_TRANSACTION_RECEIPT = { - "blockHash": "0x4e3a3754410177e6937ef1f84bba68ea139e8d1a2258c5f85db9f1cd715a1bdd", - "blockNumber": 46147, - "contractAddress": None, - "cumulativeGasUsed": 21000, - "from": "0xA1E4380A3B1f749673E270229993eE55F35663b4", - "gasUsed": 21000, - "logs": [], - "logsBloom": "0x000000000000000000000000000000000000000000000000...0000", - "status": 1, # 0 or 1 - "to": "0x5DF9B87991262F6BA471F09758CDE1c0FC1De734", - "transactionHash": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060", # noqa: E501 - "transactionIndex": 0, + "jsonrpc": "2.0", + "result": { + "blockHash": "0x42aa557e22141e0eba2d42258c010820ef080f2c7ecd0ad18cb53047b7e0421f", # noqa: E501 + "blockNumber": "0xa50131", + "contractAddress": None, + "cumulativeGasUsed": "0xb72e24", + # "effectiveGasPrice": "0x147d357000", + "from": "0x56ac35db407fe1fb4977edd41f712aa5d8e7eb08", + "gasUsed": "0x5208", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", # noqa: E501 + "status": "0x1", + "to": "0x56ac35db407fe1fb4977edd41f712aa5d8e7eb08", + "transactionHash": "0xe25a4c707d3f981afa8ec103b1bc0bee9c6b7bea75e76ffa0a221d5239a7066a", # noqa: E501 + "transactionIndex": "0x9a", + "type": "0x0", + }, + "id": 1, +} + +EXPECTED_CALLTRACERS = { + "from": "0x57f96e6b86cdefdb3d412547816a82e3e0ebf9d2", + "gas": "0x0", + "gasUsed": "0x0", + "input": "0x", + "output": "0x", + "to": "0x378c50d9264c63f3f92b806d4ee56e9d86ffb3ec", + "type": "CALL", + "value": "0x64", +} + +EXPECTED_STRUCT_TRACER = { + "failed": False, + "gas": 21000, + "returnValue": "", + "structLogs": [], +} + +EXPECTED_CONTRACT_CREATE_TRACER = { + "from": "0x57f96e6b86cdefdb3d412547816a82e3e0ebf9d2", + "gas": "0x7ef9d", + "gasUsed": "0x7ef9d", + "input": "0x608060405234801561001057600080fd5b50604080518082018252600981526805465737445524332360bc1b60208083019182528351808501909452600484526315195cdd60e21b90840152815191929161005c91600391610156565b508051610070906004906020840190610156565b50505061008e336a52b7d2dcc80cd2e400000061009360201b60201c565b610250565b6001600160a01b0382166100ed5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546100ff91906101ef565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805461016290610215565b90600052602060002090601f01602090048101928261018457600085556101ca565b82601f1061019d57805160ff19168380011785556101ca565b828001600101855582156101ca579182015b828111156101ca5782518255916020019190600101906101af565b506101d69291506101da565b5090565b5b808211156101d657600081556001016101db565b6000821982111561021057634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168061022957607f821691505b6020821081141561024a57634e487b7160e01b600052602260045260246000fd5b50919050565b61085d8061025f6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610801565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b602082108114156107fb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082257634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220fee840cc9e1cfac46e073588ade030be1401c580c5849dd4e63f659a75eb220c64736f6c634300080a0033", # noqa: E501 + "output": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461012357806370a082311461013657806395d89b411461015f578063a457c2d714610167578063a9059cbb1461017a578063dd62ed3e1461018d57600080fd5b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100ef57806323b872dd14610101578063313ce56714610114575b600080fd5b6100b66101a0565b6040516100c3919061069a565b60405180910390f35b6100df6100da36600461070b565b610232565b60405190151581526020016100c3565b6002545b6040519081526020016100c3565b6100df61010f366004610735565b61024a565b604051601281526020016100c3565b6100df61013136600461070b565b61026e565b6100f3610144366004610771565b6001600160a01b031660009081526020819052604090205490565b6100b6610290565b6100df61017536600461070b565b61029f565b6100df61018836600461070b565b61031f565b6100f361019b366004610793565b61032d565b6060600380546101af906107c6565b80601f01602080910402602001604051908101604052809291908181526020018280546101db906107c6565b80156102285780601f106101fd57610100808354040283529160200191610228565b820191906000526020600020905b81548152906001019060200180831161020b57829003601f168201915b5050505050905090565b600033610240818585610358565b5060019392505050565b60003361025885828561047c565b6102638585856104f6565b506001949350505050565b600033610240818585610281838361032d565b61028b9190610801565b610358565b6060600480546101af906107c6565b600033816102ad828661032d565b9050838110156103125760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102638286868403610358565b6000336102408185856104f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103ba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610309565b6001600160a01b03821661041b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610309565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610488848461032d565b905060001981146104f057818110156104e35760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610309565b6104f08484848403610358565b50505050565b6001600160a01b03831661055a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610309565b6001600160a01b0382166105bc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610309565b6001600160a01b038316600090815260208190526040902054818110156106345760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610309565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36104f0565b600060208083528351808285015260005b818110156106c7578581018301518582016040015282016106ab565b818111156106d9576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b038116811461070657600080fd5b919050565b6000806040838503121561071e57600080fd5b610727836106ef565b946020939093013593505050565b60008060006060848603121561074a57600080fd5b610753846106ef565b9250610761602085016106ef565b9150604084013590509250925092565b60006020828403121561078357600080fd5b61078c826106ef565b9392505050565b600080604083850312156107a657600080fd5b6107af836106ef565b91506107bd602084016106ef565b90509250929050565b600181811c908216806107da57607f821691505b602082108114156107fb57634e487b7160e01b600052602260045260246000fd5b50919050565b6000821982111561082257634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220fee840cc9e1cfac46e073588ade030be1401c580c5849dd4e63f659a75eb220c64736f6c634300080a0033", # noqa: E501 + "to": "0x8c76cfc1934d5120cc673b6e5ddf7b88feb1c18c", + "type": "CREATE", + "value": "0x0", } diff --git a/tests/integration_tests/network.py b/tests/integration_tests/network.py index 3134151524..c638e2a563 100644 --- a/tests/integration_tests/network.py +++ b/tests/integration_tests/network.py @@ -68,8 +68,12 @@ def __init__(self, w3): self.w3 = w3 -def setup_ethermint(path, base_port): - cfg = Path(__file__).parent / "configs/default.jsonnet" +def setup_ethermint(path, base_port, long_timeout_commit=False): + cfg = Path(__file__).parent / ( + "configs/default.jsonnet" + if long_timeout_commit + else "configs/long_timeout_commit.jsonnet" + ) yield from setup_custom_ethermint(path, base_port, cfg) diff --git a/tests/integration_tests/test_basic.py b/tests/integration_tests/test_basic.py deleted file mode 100644 index ed2b19fec1..0000000000 --- a/tests/integration_tests/test_basic.py +++ /dev/null @@ -1,3 +0,0 @@ -def test_basic(cluster): - w3 = cluster.w3 - assert w3.eth.chain_id == 9000 diff --git a/tests/integration_tests/test_filters.py b/tests/integration_tests/test_filters.py index 8a10e5b9e1..bf114eb82c 100644 --- a/tests/integration_tests/test_filters.py +++ b/tests/integration_tests/test_filters.py @@ -1,13 +1,97 @@ +from pathlib import Path + import pytest from web3 import Web3 +from .network import setup_custom_ethermint, setup_ethermint from .utils import ( ADDRS, CONTRACTS, deploy_contract, send_successful_transaction, send_transaction, + w3_wait_for_new_blocks, +) + + +@pytest.fixture(scope="module") +def custom_ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("filters") + yield from setup_ethermint(path, 26200, long_timeout_commit=True) + + +@pytest.fixture(scope="module") +def ethermint_indexer(tmp_path_factory): + path = tmp_path_factory.mktemp("indexer") + yield from setup_custom_ethermint( + path, 26660, Path(__file__).parent / "configs/enable-indexer.jsonnet" + ) + + +@pytest.fixture( + scope="module", params=["ethermint", "geth", "ethermint-ws", "enable-indexer"] ) +def cluster(request, custom_ethermint, ethermint_indexer, geth): + """ + run on both ethermint and geth + """ + provider = request.param + if provider == "ethermint": + yield custom_ethermint + elif provider == "geth": + yield geth + elif provider == "ethermint-ws": + ethermint_ws = custom_ethermint.copy() + ethermint_ws.use_websocket() + yield ethermint_ws + elif provider == "enable-indexer": + yield ethermint_indexer + else: + raise NotImplementedError + + +def test_basic(cluster): + w3 = cluster.w3 + assert w3.eth.chain_id == 9000 + + +# Smart contract names +GREETER_CONTRACT = "Greeter" +ERC20_CONTRACT = "TestERC20A" + +# ChangeGreeting topic from Greeter contract calculated from event signature +CHANGE_GREETING_TOPIC = Web3.keccak(text="ChangeGreeting(address,string)") +# ERC-20 Transfer event topic +TRANSFER_TOPIC = Web3.keccak(text="Transfer(address,address,uint256)") + + +def test_get_logs_by_topic(cluster): + w3: Web3 = cluster.w3 + + contract = deploy_contract(w3, CONTRACTS["Greeter"]) + + topic = Web3.keccak(text="ChangeGreeting(address,string)") + + # with tx + tx = contract.functions.setGreeting("world").build_transaction() + receipt = send_transaction(w3, tx) + assert receipt.status == 1 + + # The getLogs method under the hood works as a filter + # with the specified topics and a block range. + # If the block range is not specified, it defaults + # to fromBlock: "latest", toBlock: "latest". + # Then, if we make a getLogs call within the same block that the tx + # happened, we will get a log in the result. However, if we make the call + # one or more blocks later, the result will be an empty array. + logs = w3.eth.get_logs({"topics": [topic.hex()]}) + + assert len(logs) == 1 + assert logs[0]["address"] == contract.address + + w3_wait_for_new_blocks(w3, 2) + logs = w3.eth.get_logs({"topics": [topic.hex()]}) + assert len(logs) == 0 def test_pending_transaction_filter(cluster): @@ -17,6 +101,7 @@ def test_pending_transaction_filter(cluster): # without tx assert flt.get_new_entries() == [] # GetFilterChanges + w3_wait_for_new_blocks(w3, 1, sleep=0.1) # with tx txhash = send_successful_transaction(w3) assert txhash in flt.get_new_entries() diff --git a/tests/integration_tests/test_priority.py b/tests/integration_tests/test_priority.py index c3de9cec0f..c505f7a589 100644 --- a/tests/integration_tests/test_priority.py +++ b/tests/integration_tests/test_priority.py @@ -1,11 +1,19 @@ import sys -from .network import Ethermint +import pytest + +from .network import setup_ethermint from .utils import ADDRS, KEYS, eth_to_bech32, sign_transaction, wait_for_new_blocks PRIORITY_REDUCTION = 1000000 +@pytest.fixture(scope="module") +def custom_ethermint(tmp_path_factory): + path = tmp_path_factory.mktemp("priority") + yield from setup_ethermint(path, 26800, long_timeout_commit=True) + + def effective_gas_price(tx, base_fee): if "maxFeePerGas" in tx: # dynamic fee tx @@ -27,7 +35,7 @@ def tx_priority(tx, base_fee): return (tx["gasPrice"] - base_fee) // PRIORITY_REDUCTION -def test_priority(ethermint: Ethermint): +def test_priority(ethermint): """ test priorities of different tx types @@ -112,7 +120,7 @@ def test_priority(ethermint: Ethermint): assert all(i1 > i2 for i1, i2 in zip(tx_indexes, tx_indexes[1:])) -def test_native_tx_priority(ethermint: Ethermint): +def test_native_tx_priority(ethermint): cli = ethermint.cosmos_cli() base_fee = cli.query_base_fee() print("base_fee", base_fee) diff --git a/tests/integration_tests/test_rollback.py b/tests/integration_tests/test_rollback.py index 1fbe316356..f6dd656a71 100644 --- a/tests/integration_tests/test_rollback.py +++ b/tests/integration_tests/test_rollback.py @@ -10,7 +10,7 @@ from .utils import supervisorctl, wait_for_block, wait_for_port -def update_node2_cmd(path, cmd, i): +def update_node_cmd(path, cmd, i): ini_path = path / SUPERVISOR_CONFIG_FILE ini = configparser.RawConfigParser() ini.read(ini_path) @@ -29,7 +29,7 @@ def update_node2_cmd(path, cmd, i): def post_init(broken_binary): def inner(path, base_port, config): chain_id = "ethermint_9000-1" - update_node2_cmd(path / chain_id, broken_binary, 2) + update_node_cmd(path / chain_id, broken_binary, 1) return inner @@ -66,33 +66,33 @@ def test_rollback(custom_ethermint): - use rollback command to rollback the db. - switch to correct binary should make the node syncing again. """ - wait_for_port(ports.rpc_port(custom_ethermint.base_port(2))) + target_port = ports.rpc_port(custom_ethermint.base_port(1)) + wait_for_port(target_port) - print("wait for node2 to sync the first 10 blocks") - cli2 = custom_ethermint.cosmos_cli(2) - wait_for_block(cli2, 10) + print("wait for node1 to sync the first 10 blocks") + cli1 = custom_ethermint.cosmos_cli(1) + wait_for_block(cli1, 10) print("wait for a few more blocks on the healthy nodes") - cli = custom_ethermint.cosmos_cli(0) - wait_for_block(cli, 13) + cli0 = custom_ethermint.cosmos_cli(0) + wait_for_block(cli0, 13) # (app hash mismatch happens after the 10th block, detected in the 11th block) - print("check node2 get stuck at block 10") - assert cli2.block_height() == 10 + print("check node1 get stuck at block 10") + assert cli1.block_height() == 10 - print("stop node2") + print("stop node1") supervisorctl( - custom_ethermint.base_dir / "../tasks.ini", "stop", "ethermint_9000-1-node2" + custom_ethermint.base_dir / "../tasks.ini", "stop", "ethermint_9000-1-node1" ) - print("do rollback on node2") - cli2.rollback() + print("do rollback on node1") + cli1.rollback() print("switch to normal binary") - update_node2_cmd(custom_ethermint.base_dir, "ethermintd", 2) + update_node_cmd(custom_ethermint.base_dir, "ethermintd", 1) supervisorctl(custom_ethermint.base_dir / "../tasks.ini", "update") - wait_for_port(ports.rpc_port(custom_ethermint.base_port(2))) + wait_for_port(target_port) - print("check node2 sync again") - cli2 = custom_ethermint.cosmos_cli(2) - wait_for_block(cli2, 15) + print("check node1 sync again") + wait_for_block(cli1, 15) diff --git a/tests/integration_tests/test_upgrade.py b/tests/integration_tests/test_upgrade.py index ce830e4130..3490f87888 100644 --- a/tests/integration_tests/test_upgrade.py +++ b/tests/integration_tests/test_upgrade.py @@ -92,9 +92,6 @@ def test_cosmovisor_upgrade(custom_ethermint: Ethermint): - check that queries on legacy blocks still works after upgrade. """ cli = custom_ethermint.cosmos_cli() - height = cli.block_height() - target_height = height + 5 - print("upgrade height", target_height) w3 = custom_ethermint.w3 contract = deploy_contract(w3, CONTRACTS["TestERC20A"]) @@ -104,6 +101,9 @@ def test_cosmovisor_upgrade(custom_ethermint: Ethermint): old_erc20_balance = contract.caller.balanceOf(ADDRS["validator"]) print("old values", old_height, old_balance, old_base_fee) + target_height = w3.eth.block_number + 10 + print("upgrade height", target_height) + plan_name = "integration-test-upgrade" rsp = cli.gov_propose( "community", @@ -120,7 +120,6 @@ def test_cosmovisor_upgrade(custom_ethermint: Ethermint): # get proposal_id ev = parse_events(rsp["logs"])["submit_proposal"] - assert ev["proposal_type"] == "SoftwareUpgrade", rsp proposal_id = ev["proposal_id"] rsp = cli.gov_vote("validator", proposal_id, "yes") diff --git a/tests/integration_tests/utils.py b/tests/integration_tests/utils.py index eda82706e4..d3863ce4d2 100644 --- a/tests/integration_tests/utils.py +++ b/tests/integration_tests/utils.py @@ -63,22 +63,21 @@ def wait_for_port(port, host="127.0.0.1", timeout=40.0): ) from ex -def w3_wait_for_new_blocks(w3, n): +def w3_wait_for_new_blocks(w3, n, sleep=0.5): begin_height = w3.eth.block_number while True: - time.sleep(0.5) + time.sleep(sleep) cur_height = w3.eth.block_number if cur_height - begin_height >= n: break -def wait_for_new_blocks(cli, n): - begin_height = int((cli.status())["SyncInfo"]["latest_block_height"]) - while True: - time.sleep(0.5) +def wait_for_new_blocks(cli, n, sleep=0.5): + cur_height = begin_height = int((cli.status())["SyncInfo"]["latest_block_height"]) + while cur_height - begin_height < n: + time.sleep(sleep) cur_height = int((cli.status())["SyncInfo"]["latest_block_height"]) - if cur_height - begin_height >= n: - break + return cur_height def wait_for_block(cli, height, timeout=240):