@@ -860,13 +860,19 @@ def compare_json(config, response, json_file, daemon_file, exp_rsp_file, diff_fi
860860 diff_file_size = 0
861861 return_code = 1 # ok
862862 error_msg = ""
863+ diff_content = ""
863864 if diff_result == 1 :
864865 diff_file_size = os .stat (diff_file ).st_size
865866 if diff_file_size != 0 or diff_result == 0 :
866867 if diff_result == 0 :
867868 error_msg = "Failed Timeout"
868869 else :
869870 error_msg = "Failed"
871+ try :
872+ with open (diff_file , 'r' , encoding = 'utf8' ) as f :
873+ diff_content = f .read ()
874+ except OSError :
875+ pass
870876 return_code = 0 # failed
871877
872878 if os .path .exists (temp_file1 ):
@@ -878,7 +884,7 @@ def compare_json(config, response, json_file, daemon_file, exp_rsp_file, diff_fi
878884 shutil .rmtree (base_name )
879885 except OSError :
880886 pass
881- return return_code , error_msg
887+ return return_code , error_msg , diff_content
882888
883889
884890def process_response (target , target1 , result , result1 : str , response_in_file , config ,
@@ -887,44 +893,46 @@ def process_response(target, target1, result, result1: str, response_in_file, co
887893
888894 response , error_msg = get_json_from_response (target , config .daemon_under_test , config .verbose_level , result )
889895 if response is None :
890- return 0 , error_msg
896+ return 0 , error_msg , { "message" : error_msg , "target" : target }
891897
892898 if result1 != "" :
893899 expected_response , error_msg = get_json_from_response (target1 , config .daemon_as_reference , config .verbose_level , result1 )
894900 if expected_response is None :
895- return 0 , error_msg
901+ return 0 , error_msg , { "message" : error_msg , "target" : target1 }
896902 else :
897903 expected_response = response_in_file
898904
899905 if config .without_compare_results is True :
900906 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
901- return 1 , ""
907+ return 1 , "" , {}
902908
903909 if response is None :
904- return 0 , "Failed [" + config .daemon_under_test + "] (server doesn't response)"
910+ error_msg = "Failed [" + config .daemon_under_test + "] (server doesn't response)"
911+ return 0 , error_msg , {"message" : error_msg , "target" : target }
905912
906913 if expected_response is None :
907- return 0 , "Failed [" + config .daemon_as_reference + "] (server doesn't response)"
914+ error_msg = "Failed [" + config .daemon_as_reference + "] (server doesn't response)"
915+ return 0 , error_msg , {"message" : error_msg , "target" : target1 }
908916
909917 if response != expected_response :
910918 if "result" in response and "result" in expected_response and expected_response ["result" ] is None and result1 == "" :
911919 # response and expected_response are different but don't care
912920 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
913- return 1 , ""
921+ return 1 , "" , {}
914922 if "error" in response and "error" in expected_response and expected_response ["error" ] is None :
915923 # response and expected_response are different but don't care
916924 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
917- return 1 , ""
925+ return 1 , "" , {}
918926 if "error" not in expected_response and "result" not in expected_response and not isinstance (expected_response , list ) and len (expected_response ) == 2 :
919927 # response and expected_response are different but don't care
920928 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
921- return 1 , ""
929+ return 1 , "" , {}
922930 if "error" in response and "error" in expected_response and config .do_not_compare_error :
923931 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
924- return 1 , ""
932+ return 1 , "" , {}
925933 dump_jsons (True , daemon_file , exp_rsp_file , output_dir , response , expected_response )
926934
927- same , error_msg = compare_json (config , response , json_file , daemon_file , exp_rsp_file , diff_file , test_number )
935+ same , error_msg , diff_content = compare_json (config , response , json_file , daemon_file , exp_rsp_file , diff_file , test_number )
928936 # cleanup
929937 if same :
930938 os .remove (daemon_file )
@@ -937,10 +945,17 @@ def process_response(target, target1, result, result1: str, response_in_file, co
937945 pass
938946
939947 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
940- return same , error_msg
948+ error_details = {
949+ "message" : error_msg ,
950+ "target" : target ,
951+ "actual_response" : response ,
952+ "expected_response" : expected_response ,
953+ "diff" : diff_content ,
954+ }
955+ return same , error_msg , error_details
941956
942957 dump_jsons (config .force_dump_jsons , daemon_file , exp_rsp_file , output_dir , response , expected_response )
943- return 1 , ""
958+ return 1 , "" , {}
944959
945960
946961def run_test (json_file : str , test_number , transport_type , config ):
@@ -1008,7 +1023,7 @@ def run_test(json_file: str, test_number, transport_type, config):
10081023 daemon_file = output_api_filename + get_json_filename_ext (DAEMON_ON_DEFAULT_PORT , target )
10091024 exp_rsp_file = output_api_filename + get_json_filename_ext (config .daemon_as_reference , target1 )
10101025
1011- return process_response (
1026+ result_code , error_msg , error_details = process_response (
10121027 target ,
10131028 target1 ,
10141029 result ,
@@ -1021,6 +1036,10 @@ def run_test(json_file: str, test_number, transport_type, config):
10211036 diff_file ,
10221037 json_file ,
10231038 test_number )
1039+ if not result_code and error_details is not None :
1040+ error_details ["request" ] = json .loads (request_dumps )
1041+ error_details .setdefault ("target" , target )
1042+ return result_code , error_msg , error_details
10241043
10251044
10261045def extract_number (filename ):
@@ -1193,7 +1212,7 @@ def main(argv) -> int:
11931212 curr_future .cancel ()
11941213 continue
11951214 print (f"{ curr_test_number_in_any_loop :04d} . { curr_tt } ::{ file } " , end = '' , flush = True )
1196- result , error_msg = curr_future .result ()
1215+ result , error_msg , error_details = curr_future .result ()
11971216 if result == 1 :
11981217 success_tests = success_tests + 1
11991218 if config .verbose_level :
@@ -1219,7 +1238,7 @@ def main(argv) -> int:
12191238 "transport_type" : curr_transport_type ,
12201239 "test_name" : curr_json_test_full_name ,
12211240 "result" : "FAILED" ,
1222- "error_message" : error_msg
1241+ "error_message" : error_details if error_details else error_msg
12231242 })
12241243 if config .exit_on_fail :
12251244 cancel = True
0 commit comments