From c1c3fc85d3f0d55b269b08cc570ba0b1145f4f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Jakub=20Nani=C5=A1ta?= Date: Tue, 18 Feb 2025 15:34:39 -0800 Subject: [PATCH] chore(test): Add simple launcher test for op-besu (#173) *Description* - Extend the `el_cl_launcher_test.star` with a simple test for `op-besu` - Extract some test input defaults on top of the file --- test/el_cl_launcher_test.star | 147 +++++++++++++++++++++++++++++----- 1 file changed, 126 insertions(+), 21 deletions(-) diff --git a/test/el_cl_launcher_test.star b/test/el_cl_launcher_test.star index e0b7ca2f..71aec5c8 100644 --- a/test/el_cl_launcher_test.star +++ b/test/el_cl_launcher_test.star @@ -6,6 +6,25 @@ ethereum_package_constants = import_module( ) util = import_module("/src/util.star") +# +# Default test inputs +# + +jwt_file = "/path/to/jwt_file" + +deployment_output = "/path/to/deployment_output" + +l1_config_env_vars = { + "L1_RPC_URL": "L1_RPC_URL", + "L1_RPC_KIND": "standard", + "CL_RPC_URL": "CL_RPC_URL", +} + +da_server_context = struct( + enabled=False, + http_url="da_server_http_url", +) + def test_launch_with_defaults(plan): parsed_input_args = input_parser.input_parser( @@ -27,26 +46,14 @@ def test_launch_with_defaults(plan): ) observability_helper = observability.make_helper(parsed_input_args.observability) - - deployment_output = "/path/to/deployment_output" - l1_config_env_vars = { - "L1_RPC_URL": "L1_RPC_URL", - "L1_RPC_KIND": "standard", - "CL_RPC_URL": "CL_RPC_URL", - } - jwt_file = "/path/to/jwt_file" chains = parsed_input_args.chains chain = chains[0] - da_server_context = struct( - enabled=False, - http_url="da_server_http_url", - ) # We'll mock read_network_config_value since it returns a runtime value that we would not be able to retrieve sequencer_private_key_mock = "sequencer_private_key" - read_network_config_value_mock = kurtosistest.mock( - util, "read_network_config_value" - ).mock_return_value(sequencer_private_key_mock) + kurtosistest.mock(util, "read_network_config_value").mock_return_value( + sequencer_private_key_mock + ) all_el_contexts, all_cl_contexts = el_cl_launcher.launch( plan=plan, @@ -70,10 +77,9 @@ def test_launch_with_defaults(plan): el_service_name = "op-el-1-op-reth-op-node-" el_service = plan.get_service(el_service_name) + el_service_config = kurtosistest.get_service_config(el_service_name) - cl_service_config = kurtosistest.get_service_config( - service_name="op-cl-1-op-node-op-reth-" - ) + cl_service_config = kurtosistest.get_service_config("op-cl-1-op-node-op-reth-") expect.ne(cl_service_config, None) expect.eq(cl_service_config.image, "op-node:latest") expect.eq(cl_service_config.env_vars, {}) @@ -116,9 +122,6 @@ def test_launch_with_defaults(plan): ], ) - el_service_config = kurtosistest.get_service_config( - service_name="op-el-1-op-reth-op-node-" - ) expect.ne(el_service_config, None) expect.eq(el_service_config.image, "op-reth:latest") expect.eq(el_service_config.env_vars, {}) @@ -152,3 +155,105 @@ def test_launch_with_defaults(plan): "--metrics=0.0.0.0:9001", ], ) + + +def test_launch_with_el_op_besu(plan): + parsed_input_args = input_parser.input_parser( + plan, + { + "chains": [ + { + "participants": [ + { + "el_type": "op-besu", + "el_image": "op-besu:latest", + } + ] + } + ] + }, + ) + + observability_helper = observability.make_helper(parsed_input_args.observability) + chains = parsed_input_args.chains + chain = chains[0] + + # We'll mock read_network_config_value since it returns a runtime value that we would not be able to retrieve + sequencer_private_key_mock = "sequencer_private_key" + kurtosistest.mock(util, "read_network_config_value").mock_return_value( + sequencer_private_key_mock + ) + + all_el_contexts, all_cl_contexts = el_cl_launcher.launch( + plan=plan, + jwt_file=jwt_file, + network_params=chain.network_params, + mev_params=chain.mev_params, + deployment_output=deployment_output, + participants=chain.participants, + num_participants=len(chains), + l1_config_env_vars=l1_config_env_vars, + l2_services_suffix="", + global_log_level="info", + global_node_selectors=[], + global_tolerations=[], + persistent=False, + additional_services=[], + observability_helper=observability_helper, + interop_params=parsed_input_args.interop, + da_server_context=da_server_context, + ) + + el_service_name = "op-el-1-op-besu-op-node-" + el_service = plan.get_service(el_service_name) + el_service_config = kurtosistest.get_service_config(el_service_name) + expect.ne(el_service_config, None) + expect.eq(el_service_config.image, "op-besu:latest") + expect.eq(el_service_config.env_vars, {}) + expect.eq( + el_service_config.cmd, + [ + " ".join( + [ + "besu", + "--genesis-file=/network-configs/genesis-{0}.json".format( + chain.network_params.network_id + ), + "--network-id={0}".format(chain.network_params.network_id), + "--data-path=/data/besu/execution-data", + "--host-allowlist=*", + "--rpc-http-enabled=true", + "--rpc-http-host=0.0.0.0", + "--rpc-http-port=8545", + "--rpc-http-api=ADMIN,CLIQUE,ETH,NET,DEBUG,TXPOOL,ENGINE,TRACE,WEB3,MINER", + "--rpc-http-cors-origins=*", + "--rpc-http-max-active-connections=300", + "--rpc-ws-enabled=true", + "--rpc-ws-host=0.0.0.0", + "--rpc-ws-port=8546", + "--rpc-ws-api=ADMIN,CLIQUE,ETH,NET,DEBUG,TXPOOL,ENGINE,TRACE,WEB3,MINER", + "--p2p-enabled=true", + "--p2p-host={0}".format( + ethereum_package_constants.PRIVATE_IP_ADDRESS_PLACEHOLDER + ), + "--p2p-port=30303", + "--engine-rpc-enabled=true", + "--engine-jwt-secret={0}".format( + ethereum_package_constants.JWT_MOUNT_PATH_ON_CONTAINER + ), + "--engine-host-allowlist=*", + "--engine-rpc-port={0}".format( + el_service.ports["engine-rpc"].number + ), + "--sync-mode=FULL", + "--bonsai-limit-trie-logs-enabled=false", + "--version-compatibility-protection=false", + "--metrics-enabled=true", + "--metrics-host=0.0.0.0", + "--metrics-port=9001", + ] + ) + ], + ) + + # TODO Once files are available on kurtosistest.get_service_config, make sure the JWT file is being mounted