Skip to content

Commit a0c7b21

Browse files
committed
tests: add DefaultDevFramework to speedup integration tests
1 parent c5050bd commit a0c7b21

File tree

7 files changed

+58
-14
lines changed

7 files changed

+58
-14
lines changed

integration_tests/readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ def network(framework_class: Type[ConfluxTestFramework], port_min: int, request:
158158

159159
In the tests, you can start by directly using the `network` fixture for the test framework setup.
160160

161+
You can check available pre-defined framework classes in [test_framework/framework_templates.py](./test_framework/framework_templates.py). It is recommended to directly use `DefaultDevFramework` or inherit your `framework_class` fixture from `DefaultDevFramework` if you don't care about block generation or p2p network setup. This template will setup a dev node, resulting in txs being packed and executed immediately.
162+
161163
You can overwrite the `framework_class` fixture in the test file to customize the test framework setup. Check [cip137_test.py](./tests/cip137_test.py) for an example.
162164

163165
#### Common Fixtures

integration_tests/test_framework/framework_templates.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,25 @@ def setup_network(self):
1414
self.setup_nodes()
1515
self.rpc = RpcClient(self.nodes[0])
1616

17+
18+
# dev framework runs a single node in dev mode
19+
# when recieveing a tx, it will pack and execute it(generate 5 blocks) immediately
20+
class DefaultDevFramework(ConfluxTestFramework):
21+
def set_test_params(self):
22+
self.num_nodes = 1
23+
self.conf_parameters["mode"] = "'dev'"
24+
self.conf_parameters["min_native_base_price"] = 10000
25+
self.conf_parameters["base_fee_burn_transition_height"] = 1
26+
self.conf_parameters["base_fee_burn_transition_number"] = 1
27+
28+
def setup_network(self):
29+
self.setup_nodes()
30+
self.rpc = RpcClient(self.nodes[0])
31+
32+
# do nothing because in dev mode
33+
def _setup_w3_block_control_middleware(self):
34+
pass
35+
1736
class DefaultPoSFramework(ConfluxTestFramework):
1837
def set_test_params(self):
1938
self.num_nodes = 4

integration_tests/test_framework/test_framework.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,8 @@ def setup_w3(self):
375375

376376
self.ew3.middleware_onion.add(SignAndSendRawMiddlewareBuilder.build(self.evm_secrets)) # type: ignore
377377
self.eth.default_account = self.evm_accounts[0].address
378-
379-
class TestNodeMiddleware(ConfluxWeb3Middleware):
378+
379+
class MaxFeePerGasMiddleware(ConfluxWeb3Middleware):
380380
def request_processor(self, method: RPCEndpoint, params: Any) -> Any:
381381
if method == RPC.cfx_sendRawTransaction or method == RPC.cfx_sendTransaction or method == "eth_sendRawTransaction" or method == "eth_sendTransaction":
382382
client.node.wait_for_phase(["NormalSyncPhase"])
@@ -388,21 +388,31 @@ def request_processor(self, method: RPCEndpoint, params: Any) -> Any:
388388
client.generate_blocks_to_state(num_txs=1)
389389
return super().request_processor(method, params)
390390

391+
self.cw3.middleware_onion.add(MaxFeePerGasMiddleware)
392+
self.ew3.middleware_onion.add(MaxFeePerGasMiddleware)
393+
394+
if self.options.trace_tx:
395+
self.cw3.middleware_onion.add(AutoTraceMiddleware)
396+
self.ew3.middleware_onion.add(AutoTraceMiddleware)
397+
398+
self._setup_w3_block_control_middleware()
399+
400+
# setup middleware to control the block generation to wait for tx receipt
401+
def _setup_w3_block_control_middleware(self):
402+
client = RpcClient(self.nodes[0])
403+
log = self.log
404+
405+
class BlockControlMiddleware(ConfluxWeb3Middleware):
406+
391407
def response_processor(self, method: RPCEndpoint, response: Any):
392408
if method == RPC.cfx_getTransactionReceipt or method == "eth_getTransactionReceipt":
393409
if "result" in response and response["result"] is None:
394410
log.debug("Auto generate 5 blocks because did not get tx receipt")
395411
client.generate_blocks_to_state(num_txs=1) # why num_txs=1?
396412
return response
397-
398-
399-
self.cw3.middleware_onion.add(TestNodeMiddleware)
400-
self.ew3.middleware_onion.add(TestNodeMiddleware)
401-
402-
if self.options.trace_tx:
403-
self.cw3.middleware_onion.add(AutoTraceMiddleware)
404-
self.ew3.middleware_onion.add(AutoTraceMiddleware)
405413

414+
self.cw3.middleware_onion.add(BlockControlMiddleware)
415+
self.ew3.middleware_onion.add(BlockControlMiddleware)
406416

407417
def add_nodes(self, num_nodes, genesis_nodes=None, rpchost=None, binary=None, auto_recovery=False,
408418
recovery_timeout=30, is_consortium=True):

integration_tests/tests/cross_space/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import pytest
44

55
from integration_tests.test_framework.test_framework import ConfluxTestFramework
6+
from integration_tests.test_framework.framework_templates import DefaultDevFramework
67

78

89
@pytest.fixture(scope="module")
910
def framework_class() -> Type[ConfluxTestFramework]:
10-
class DefaultFramework(ConfluxTestFramework):
11+
class DefaultFramework(DefaultDevFramework):
1112
def set_test_params(self):
12-
self.num_nodes = 1
13+
super().set_test_params()
1314
# self.conf_parameters["min_native_base_price"] = 10000
1415
self.conf_parameters["next_hardfork_transition_height"] = 1
1516
self.conf_parameters["next_hardfork_transition_number"] = 1

integration_tests/tests/execution_spec_tests/conftest.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ethereum_test_tools.code import Yul
1414

1515
from integration_tests.test_framework.test_framework import ConfluxTestFramework, AutoTraceMiddleware
16+
from integration_tests.test_framework.framework_templates import DefaultDevFramework
1617
from integration_tests.test_framework.util.adapter import AllocMock, conflux_state_test
1718

1819
def pytest_configure(config):
@@ -112,9 +113,9 @@ def _parameterize_opcodes(metafunc, marker_name: str, opcodes: list, fixture_nam
112113

113114
@pytest.fixture(scope="module")
114115
def framework_class():
115-
class EIP7702TestEnv(ConfluxTestFramework):
116+
class EIP7702TestEnv(DefaultDevFramework):
116117
def set_test_params(self):
117-
self.num_nodes = 1
118+
super().set_test_params()
118119
self.conf_parameters["evm_chain_id"] = str(EVM_CHAIN_ID)
119120
self.conf_parameters["eoa_code_transition_height"] = 1
120121
self.conf_parameters["evm_transaction_block_ratio"] = str(1)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import pytest
22
from integration_tests.test_framework.test_framework import ConfluxTestFramework
33
from integration_tests.conflux.rpc import RpcClient
4+
from integration_tests.test_framework.framework_templates import DefaultDevFramework
45

56
@pytest.fixture(scope="module")
67
def client(network: ConfluxTestFramework) -> RpcClient:
78
return network.client
9+
10+
@pytest.fixture(scope="module")
11+
def framework_class():
12+
return DefaultDevFramework
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import pytest
22
from integration_tests.test_framework.test_framework import ConfluxTestFramework
33
from integration_tests.conflux.rpc import RpcClient
4+
from integration_tests.test_framework.framework_templates import DefaultDevFramework
5+
from typing import Type
46

57
@pytest.fixture(scope="module")
68
def client(network: ConfluxTestFramework) -> RpcClient:
79
return network.client
10+
11+
@pytest.fixture(scope="module")
12+
def framework_class():
13+
return DefaultDevFramework

0 commit comments

Comments
 (0)