Skip to content

Commit 0dd5f6c

Browse files
authored
integration: remove r option add I option in test runner (#342)
1 parent ae2e2c0 commit 0dd5f6c

File tree

2 files changed

+77
-59
lines changed

2 files changed

+77
-59
lines changed

integration/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ Launch an automated test sequence on Silkworm RpcDaemon (aka Silkrpc) or Erigon
6060
-o,--dump-response: dump JSON RPC response
6161
-H,--host: host where the RpcDaemon is located (e.g.: 10.10.2.3)
6262
-p,--port: port where the RpcDaemon is located (e.g.: 8545)
63-
-r,--erigon-rpcdaemon: connect to Erigon RpcDaemon [default: connect to Silkrpc]
63+
-I,--silk-port: Use 51515/51516 ports to server
6464
-e,--verify-external-provider: <provider_url> send any request also to external API endpoint as reference
6565
-i,--without-compare-results: send request without compare results
6666
-w,--waiting_time: waiting after test execution (millisec)
67-
-S,--serial: runs tests in serial way
67+
-S,--serial: all tests are run in serial way
6868
6969
```
7070

integration/run_tests.py

+75-57
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
from websockets.sync.client import connect
1919
from websockets.extensions import permessage_deflate
2020

21-
SILK = "silk"
22-
RPCDAEMON = "rpcdaemon"
21+
DAEMON_ON_OTHER_PORT = "silk"
22+
DAEMON_ON_DEFAULT_PORT = "rpcdaemon"
23+
NONE = "none"
2324
EXTERNAL_PROVIDER = "external-provider"
2425
TIME=0.1
2526
MAX_TIME = 200 # times of TIME secs
@@ -111,45 +112,47 @@ def usage(argv):
111112
print("-o,--dump-response: dump JSON RPC response")
112113
print("-H,--host: host where the RpcDaemon is located (e.g.: 10.10.2.3)")
113114
print("-p,--port: port where the RpcDaemon is located (e.g.: 8545)")
114-
print("-r,--erigon-rpcdaemon: connect to Erigon RpcDaemon [default: connect to Silkrpc] ")
115+
print("-I,--silk-port: Use 51515/51516 ports to server")
115116
print("-e,--verify-external-provider: <provider_url> send any request also to external API endpoint as reference")
116117
print("-i,--without-compare-results: send request without compare results")
117118
print("-w,--waiting_time: waiting after test execution (millisec)")
118119
print("-S,--serial: all tests are runned in serial way")
119120

120121

121-
def get_target_name(target_type: str):
122-
""" Return name server """
123-
if target_type == SILK:
124-
return "Silk"
125-
if target_type == RPCDAEMON:
126-
return "RpcDaemon"
122+
def get_target(target_type: str, method: str, config):
123+
""" determine target
124+
"""
125+
127126
if target_type == EXTERNAL_PROVIDER:
128-
return "Infura"
129-
return "Undef"
127+
return config.external_provider_url
130128

129+
if config.verify_with_daemon and target_type == DAEMON_ON_OTHER_PORT and "engine_" in method:
130+
return config.daemon_on_host + ":" + str(51516)
131131

132-
def get_target(target_type: str, method: str, external_provider_url: str, host: str, port: int = 0):
133-
""" determine target
134-
"""
132+
if config.verify_with_daemon and target_type == DAEMON_ON_OTHER_PORT:
133+
return config.daemon_on_host + ":" + str(51515)
135134

136-
if "engine_" in method and target_type == RPCDAEMON:
137-
return host + ":" + str(port if port > 0 else 8551)
135+
if target_type == DAEMON_ON_OTHER_PORT and "engine_" in method:
136+
return config.daemon_on_host + ":" + str(51516)
138137

139-
if target_type == EXTERNAL_PROVIDER:
140-
return external_provider_url
138+
if target_type == DAEMON_ON_OTHER_PORT:
139+
return config.daemon_on_host + ":" + str(51515)
141140

142-
return host + ":" + str(port if port > 0 else 8545)
141+
if "engine_" in method:
142+
return config.daemon_on_host + ":" + str(config.engine_port if config.engine_port > 0 else 8551)
143143

144+
return config.daemon_on_host + ":" + str(config.server_port if config.server_port > 0 else 8545)
144145

145-
def get_json_filename_ext(target_type: str):
146+
147+
def get_json_filename_ext(target_type: str, target):
146148
""" determine json file name
147149
"""
148-
if target_type == SILK:
149-
return "-silk.json"
150+
port = target.split(":")
151+
if target_type == DAEMON_ON_OTHER_PORT:
152+
return "_" + port[1] + "-silk.json"
150153
if target_type == EXTERNAL_PROVIDER:
151154
return "-external_provider_url.json"
152-
return "-rpcdaemon.json"
155+
return "_" + port[1] + "-rpcdaemon.json"
153156

154157

155158
def get_jwt_secret(name):
@@ -284,15 +287,16 @@ class Config:
284287
def __init__(self):
285288
""" init the configuration params """
286289
self.exit_on_fail = True
287-
self.daemon_under_test = SILK
288-
self.daemon_as_reference = RPCDAEMON
290+
self.daemon_under_test = DAEMON_ON_DEFAULT_PORT
291+
self.daemon_as_reference = NONE
289292
self.loop_number = 1
290293
self.verbose_level = 0
291294
self.req_test_number = -1
292295
self.force_dump_jsons = False
293296
self.external_provider_url = ""
294297
self.daemon_on_host = "localhost"
295-
self.daemon_on_port = 0
298+
self.server_port = 0
299+
self.engine_port = 0
296300
self.testing_apis_with = ""
297301
self.testing_apis = ""
298302
self.verify_with_daemon = False
@@ -314,8 +318,8 @@ def __init__(self):
314318
def select_user_options(self, argv):
315319
""" process user command """
316320
try:
317-
opts, _ = getopt.getopt(argv[1:], "iw:hfrcv:t:l:a:de:b:ox:X:H:k:s:p:T:A:jS",
318-
['help', 'continue', 'erigon-rpcdaemon', 'verify-external-provider', 'host=',
321+
opts, _ = getopt.getopt(argv[1:], "iw:hfIcv:t:l:a:de:b:ox:X:H:k:s:p:P:T:A:jS",
322+
['help', 'continue', 'silk-port', 'verify-external-provider', 'host=', 'engine-port=',
319323
'port=', 'display-only-fail', 'verbose=', 'run-single-test=', 'start-from-test=',
320324
'api-list-with=', 'api-list=','loops=', 'compare-erigon-rpcdaemon', 'jwt=', 'blockchain=',
321325
'transport_type=', 'exclude-api-list=', 'exclude-test-list=', 'json-diff', 'waiting_time=',
@@ -333,13 +337,13 @@ def select_user_options(self, argv):
333337
self.waiting_time = int(optarg)
334338
elif option in ("-c", "--continue"):
335339
self.exit_on_fail = 0
336-
elif option in ("-r", "--erigon-rpcdaemon"):
337-
if self.verify_with_daemon == 1:
340+
elif option in ("-I", "--silk-port"):
341+
if self.verify_with_daemon is True:
338342
print("Error on options: "
339-
"-r/--erigon-rpcdaemon is not compatible with -d/--compare-erigon-rpcdaemon")
343+
"-I/--silk-port is not compatible with -d/--compare-erigon-rpcdaemon")
340344
usage(argv)
341345
sys.exit(1)
342-
self.daemon_under_test = RPCDAEMON
346+
self.daemon_under_test = DAEMON_ON_OTHER_PORT
343347
elif option in ("-e", "--verify-external-provider"):
344348
self.daemon_as_reference = EXTERNAL_PROVIDER
345349
self.external_provider_url = optarg
@@ -348,7 +352,9 @@ def select_user_options(self, argv):
348352
elif option in ("-H", "--host"):
349353
self.daemon_on_host = optarg
350354
elif option in ("-p", "--port"):
351-
self.daemon_on_port = int(optarg)
355+
self.server_port = int(optarg)
356+
elif option in ("-P", "--engine-port"):
357+
self.engine_port = int(optarg)
352358
elif option in ("-f", "--display-only-fail"):
353359
self.display_only_fail = 1
354360
elif option in ("-v", "--verbose"):
@@ -375,17 +381,18 @@ def select_user_options(self, argv):
375381
elif option in ("-l", "--loops"):
376382
self.loop_number = int(optarg)
377383
elif option in ("-d", "--compare-erigon-rpcdaemon"):
378-
if self.daemon_under_test != SILK:
384+
if self.daemon_under_test != DAEMON_ON_DEFAULT_PORT:
379385
print("Error in options: "
380-
"-d/--compare-erigon-rpcdaemon is not compatible with -r/--erigon-rpcdaemon")
386+
"-d/--compare-erigon-rpcdaemon is not compatible with -I/--silk-port")
381387
usage(argv)
382388
sys.exit(1)
383389
if self.without_compare_results is True:
384390
print("Error in options: "
385391
"-d/--compare-erigon-rpcdaemon is not compatible with -i/--without_compare_results")
386392
usage(argv)
387393
sys.exit(1)
388-
self.verify_with_daemon = 1
394+
self.verify_with_daemon = True
395+
self.daemon_as_reference = DAEMON_ON_DEFAULT_PORT
389396
self.use_jsondiff = True
390397
elif option in ("-o", "--dump-response"):
391398
self.force_dump_jsons = 1
@@ -424,7 +431,7 @@ def select_user_options(self, argv):
424431
elif option in ("-j", "--json-diff"):
425432
self.use_jsondiff = True
426433
elif option in ("-i", "--without-compare-results"):
427-
if self.verify_with_daemon == 1:
434+
if self.verify_with_daemon is True:
428435
print("Error on options: "
429436
"-i/--without-compare-results is not compatible with -d/--compare-erigon-rpcdaemon")
430437
usage(argv)
@@ -445,18 +452,18 @@ def select_user_options(self, argv):
445452
shutil.rmtree(self.output_dir)
446453

447454

448-
def get_json_from_response(msg, verbose_level: int, json_file, result: str):
455+
def get_json_from_response(target, msg, verbose_level: int, json_file, result: str):
449456
""" Retrieve JSON from response """
450457
if verbose_level > 2:
451458
print(msg + " :[" + result + "]")
452459

453460
if len(result) == 0:
454-
error_msg = "Failed (json response is zero length, maybe server is down)"
461+
error_msg = "Failed (json response is zero length, maybe server is down) on " + target
455462
return None, error_msg
456463
try:
457464
return result, ""
458465
except json.decoder.JSONDecodeError:
459-
error_msg = "Failed (bad json format)"
466+
error_msg = "Failed (bad json format) + target"
460467
if verbose_level:
461468
print(msg)
462469
print("Failed (bad json format)")
@@ -500,7 +507,7 @@ def execute_request(transport_type: str, jwt_auth, encoded, request_dumps, targe
500507
result = rsp.json()
501508
except:
502509
if verbose_level:
503-
print("\nhttp connection fail")
510+
print("\nhttp connection failç: ", target_url)
504511
return ""
505512
else:
506513
ws_target = "ws://" + target # use websocket
@@ -619,16 +626,16 @@ def compare_json(config, response, json_file, silk_file, exp_rsp_file, diff_file
619626
os.remove(temp_file2)
620627
return return_code, error_msg
621628

622-
def process_response(result, result1, response_in_file: str, config,
629+
def process_response(target, target1, result, result1, response_in_file: str, config,
623630
output_dir: str, silk_file: str, exp_rsp_file: str, diff_file: str, json_file: str, test_number: int):
624631
""" Process the response If exact result or error don't care, they are null but present in expected_response. """
625632

626-
response, error_msg = get_json_from_response(config.daemon_under_test, config.verbose_level, json_file, result)
633+
response, error_msg = get_json_from_response(target, config.daemon_under_test, config.verbose_level, json_file, result)
627634
if response is None:
628635
return 0, error_msg
629636

630637
if result1 != "":
631-
expected_response, error_msg = get_json_from_response(config.daemon_as_reference, config.verbose_level, json_file, result1)
638+
expected_response, error_msg = get_json_from_response(target1, config.daemon_as_reference, config.verbose_level, json_file, result1)
632639
if expected_response is None:
633640
return 0, error_msg
634641
else:
@@ -708,15 +715,16 @@ def run_test(json_file: str, test_number, transport_type, config):
708715
except KeyError:
709716
method = ""
710717
request_dumps = json.dumps(request)
711-
target = get_target(config.daemon_under_test, method, config.external_provider_url, config.daemon_on_host, config.daemon_on_port)
718+
target = get_target(config.daemon_under_test, method, config)
719+
target1 = ""
712720
if config.jwt_secret == "":
713721
jwt_auth = ""
714722
encoded = ""
715723
else:
716724
byte_array_secret = bytes.fromhex(config.jwt_secret)
717725
encoded = jwt.encode({"iat": datetime.now(pytz.utc)}, byte_array_secret, algorithm="HS256")
718726
jwt_auth = "Bearer " + str(encoded)
719-
if config.verify_with_daemon == 0: # compare daemon result with file
727+
if config.verify_with_daemon is False: # compare daemon result with file
720728
result = execute_request(transport_type, jwt_auth, encoded, request_dumps, target, config.verbose_level)
721729
result1 = ""
722730
response_in_file = json_rpc["response"]
@@ -727,21 +735,23 @@ def run_test(json_file: str, test_number, transport_type, config):
727735

728736
silk_file = output_api_filename + "response.json"
729737
exp_rsp_file = output_api_filename + "expResponse.json"
730-
else: # run tests with both servers
731-
target = get_target(SILK, method, config.external_provider_url, config.daemon_on_host, config.daemon_on_port)
738+
else: # run tests with two servers
739+
target = get_target(DAEMON_ON_OTHER_PORT, method, config)
732740
result = execute_request(transport_type, jwt_auth, encoded, request_dumps, target, config.verbose_level)
733-
target1 = get_target(config.daemon_as_reference, method, config.external_provider_url, config.daemon_on_host, config.daemon_on_port)
741+
target1 = get_target(config.daemon_as_reference, method, config)
734742
result1 = execute_request(transport_type, jwt_auth, encoded, request_dumps, target1, config.verbose_level)
735743
response_in_file = None
736744

737745
output_api_filename = config.output_dir + json_file[:-4]
738746
output_dir_name = output_api_filename[:output_api_filename.rfind("/")]
739747
diff_file = output_api_filename + "-diff.json"
740748

741-
silk_file = output_api_filename + get_json_filename_ext(SILK)
742-
exp_rsp_file = output_api_filename + get_json_filename_ext(config.daemon_as_reference)
749+
silk_file = output_api_filename + get_json_filename_ext(DAEMON_ON_OTHER_PORT, target)
750+
exp_rsp_file = output_api_filename + get_json_filename_ext(config.daemon_as_reference, target1)
743751

744752
return process_response(
753+
target,
754+
target1,
745755
result,
746756
result1,
747757
response_in_file,
@@ -772,13 +782,18 @@ def main(argv) -> int:
772782
failed_tests = 0
773783
success_tests = 0
774784
tests_not_executed = 0
775-
global_test_number = 1
776785

786+
if config.verify_with_daemon is True:
787+
server_endpoints = "both servers"
788+
else:
789+
target = get_target(config.daemon_under_test, "eth_call", config)
790+
target1 = get_target(config.daemon_under_test, "engine_", config)
791+
server_endpoints = target + "/" + target1
777792
if config.parallel is True:
778-
print ("Runs tests in parallel")
793+
print ("Runs tests in parallel on",server_endpoints)
779794
exe = ProcessPoolExecutor()
780795
else:
781-
print ("Runs tests in serial way")
796+
print ("Runs tests in serial way on",server_endpoints)
782797
exe = ProcessPoolExecutor(max_workers=1)
783798

784799

@@ -791,13 +806,16 @@ def main(argv) -> int:
791806
test_number_in_any_loop = 1
792807
tests_descr_list = []
793808
dirs = sorted(os.listdir(config.json_dir))
809+
global_test_number = 0
810+
available_tested_apis = 0
794811
for curr_api in dirs: # scans all api present in dir
795812
# jump results folder or any hidden OS-specific folder
796813
if curr_api == config.results_dir or curr_api.startswith("."):
797814
continue
798815
test_dir = config.json_dir + curr_api
799816
if not os.path.isdir(test_dir): # jump if not dir
800817
continue
818+
available_tested_apis = available_tested_apis + 1
801819
test_lists = sorted(os.listdir(test_dir), key=extract_number)
802820
test_number = 1
803821
for test_name in test_lists: # scan all json test present in the dir
@@ -831,8 +849,7 @@ def main(argv) -> int:
831849
time.sleep(config.waiting_time/1000)
832850
executed_tests = executed_tests + 1
833851

834-
if test_rep == 0:
835-
global_test_number = global_test_number + 1
852+
global_test_number = global_test_number + 1
836853
test_number_in_any_loop = test_number_in_any_loop + 1
837854
test_number = test_number + 1
838855

@@ -874,7 +891,8 @@ def main(argv) -> int:
874891
elapsed = datetime.now() - start_time
875892
print(" \r")
876893
print(f"Test time-elapsed: {str(elapsed)}")
877-
print(f"Avalable_tests: {global_test_number - 1}")
894+
print(f"Avalable tests: {global_test_number - 1}")
895+
print(f"Avalable tested api: {available_tested_apis}")
878896
print(f"Number of loop: {test_rep + 1}")
879897
print(f"Number of executed tests: {executed_tests}")
880898
print(f"Number of NOT executed tests: {tests_not_executed}")

0 commit comments

Comments
 (0)