From 7e12fff014d5f81908dd22b2ddc2a7217ac3ad16 Mon Sep 17 00:00:00 2001 From: bolyor <464861137@qq.com> Date: Wed, 2 Sep 2020 16:20:16 +0800 Subject: [PATCH] fix issue I1THUJ, I1TFJH, I1JKIB --- test/maple_test/compare.py | 9 +++++--- test/maple_test/run.py | 45 ++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/test/maple_test/compare.py b/test/maple_test/compare.py index 18de5da586..c3f6a843d2 100644 --- a/test/maple_test/compare.py +++ b/test/maple_test/compare.py @@ -49,8 +49,11 @@ def main(): expected_flags = opts.expected_flag if not expected_flags: expected_flags.append(EXPECTED_FLAG) - - content = compare_object.read() + try: + content = compare_object.read() + except UnicodeDecodeError as e: + print("Wrong stdin encoding:{}\n{}".format(e.object, e)) + sys.exit(1) content_line_map = gen_line_map(content) print("compare.py input:") @@ -96,7 +99,7 @@ def main(): info += "flag: {}, pattern: {} , result: {}, matached at output line: {}".format( pattern_flag, pattern, result, output_line_num ) - print(info) + print(info.encode(encoding='utf-8', errors='ignore')) if result is False: print("Match End!, Compare Failed") diff --git a/test/maple_test/run.py b/test/maple_test/run.py index 321727364e..14f16992fd 100644 --- a/test/maple_test/run.py +++ b/test/maple_test/run.py @@ -22,6 +22,7 @@ import time import timeit import logging import platform +import ctypes from textwrap import indent, shorten from maple_test.configs import construct_logger, get_val @@ -33,10 +34,29 @@ class TestError(Exception): pass +def handle_result_encoding(com_out, com_err, logger): + try: + com_out = com_out.decode(ENCODING, errors="strict") + com_err = com_err.decode(ENCODING, errors="strict") + except UnicodeDecodeError: + com_out = com_out.decode('utf-8', errors="strict") + com_err = com_err.decode('utf_8', errors="strict") + logger.debug("Can not decode stdout/stderr with {}, using utf-8!".format(ENCODING)) + return com_out, com_err + + def run_command_win(cmd, work_dir, timeout, logger, env=None): - """Run commands using subprocess on Windows""" + """Run commands using subprocess on Windows + + We set PYTHONIOENCODING to utf-8 on Windows to keep up with + test case file`s read encoding in compare.py to avoid some + character set issues. + + """ new_env = add_run_path(str(work_dir)) new_env.update(env) + encoding_env = {'PYTHONIOENCODING': 'utf-8'} + new_env.update(encoding_env) process_command = subprocess.Popen( cmd, shell=True, @@ -58,18 +78,20 @@ def run_command_win(cmd, work_dir, timeout, logger, env=None): return return_code, com_out, com_err else: return_code = process_command.returncode - com_out = com_out.decode(ENCODING, errors="replace") - com_err = com_err.decode(ENCODING, errors="replace") + com_out, com_err = handle_result_encoding(com_out, com_err, logger) return return_code, com_out, com_err finally: - process_command.kill() + handle = ctypes.windll.kernel32.OpenProcess(1, False, process_command.pid) + ctypes.windll.kernel32.TerminateProcess(handle, -1) + ctypes.windll.kernel32.CloseHandle(handle) logger.debug("return code: %d", return_code) - logger.debug("stdout : \n%s", indent(com_out, "+\t", lambda line: True)) - logger.debug("stderr : \n%s", indent(com_err, "@\t", lambda line: True)) + logger.debug("stdout : \n%s", + indent(com_out, "+\t", lambda line: True).encode().decode(ENCODING, errors='ignore')) + logger.debug("stderr : \n%s", + indent(com_err, "@\t", lambda line: True).encode().decode(ENCODING, errors='ignore')) def run_command_linux(cmd, work_dir, timeout, logger, env=None): - """Run commands using subprocess on Linux""" new_env = add_run_path(str(work_dir)) new_env.update(env) process_command = subprocess.Popen( @@ -95,8 +117,7 @@ def run_command_linux(cmd, work_dir, timeout, logger, env=None): return return_code, com_out, com_err else: return_code = process_command.returncode - com_out = com_out.decode(ENCODING, errors="replace") - com_err = com_err.decode(ENCODING, errors="replace") + com_out, com_err = handle_result_encoding(com_out, com_err, logger) return return_code, com_out, com_err finally: process_command.kill() @@ -105,8 +126,10 @@ def run_command_linux(cmd, work_dir, timeout, logger, env=None): except ProcessLookupError: pass logger.debug("return code: %d", return_code) - logger.debug("stdout : \n%s", indent(com_out, "+\t", lambda line: True)) - logger.debug("stderr : \n%s", indent(com_err, "@\t", lambda line: True)) + logger.debug("stdout : \n%s", + indent(com_out, "+\t", lambda line: True).encode().decode(ENCODING, errors='ignore')) + logger.debug("stderr : \n%s", + indent(com_err, "@\t", lambda line: True).encode().decode(ENCODING, errors='ignore')) def run_commands( -- Gitee