diff options
Diffstat (limited to 'mesonbuild/mtest.py')
-rw-r--r-- | mesonbuild/mtest.py | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py index acd3612..d284326 100644 --- a/mesonbuild/mtest.py +++ b/mesonbuild/mtest.py @@ -130,6 +130,13 @@ def add_arguments(parser: argparse.ArgumentParser) -> None: '"subprojname:" to run all tests defined by "subprojname".') +def print_safe(s: str) -> None: + try: + print(s) + except UnicodeEncodeError: + s = s.encode('ascii', errors='backslashreplace').decode('ascii') + print(s) + def returncode_to_status(retcode: int) -> str: # Note: We can't use `os.WIFSIGNALED(result.returncode)` and the related # functions here because the status returned by subprocess is munged. It @@ -591,9 +598,21 @@ class TestRun: res += self.stde if res[-1:] != '\n': res += '\n' - res += '-------\n\n' + res += '-------\n' return res + def get_log_short(self) -> str: + log = self.get_log() + lines = log.splitlines() + if len(lines) < 103: + return log + else: + log = '\n'.join(lines[:2]) + log += '\n--- Listing only the last 100 lines from a long log. ---\n' + log += lines[2] + '\n' + log += '\n'.join(lines[-100:]) + return log + def decode(stream: T.Union[None, bytes]) -> str: if stream is None: return '' @@ -879,7 +898,6 @@ class SingleTestRunner: class TestHarness: def __init__(self, options: argparse.Namespace): self.options = options - self.collected_logs = [] # type: T.List[str] self.collected_failures = [] # type: T.List[TestRun] self.fail_count = 0 self.expectedfail_count = 0 @@ -994,13 +1012,9 @@ class TestHarness: self.collected_failures.append(result) if not self.options.quiet or not result.res.is_ok(): print(self.format(result, mlog.colorize_console())) - result_str = self.format(result, False) - result_str += "\n\n" + result.get_log() - if result.res.is_bad(): - if self.options.print_errorlogs: - self.collected_logs.append(result_str) if self.logfile: - self.logfile.write(result_str) + self.logfile.write(self.format(result, False)) + self.logfile.write("\n\n" + result.get_log() + "\n") if self.jsonlogfile: write_json_log(self.jsonlogfile, result) if self.junit: @@ -1035,23 +1049,16 @@ class TestHarness: self.junit.write() def print_collected_logs(self) -> None: - if self.collected_logs: - if len(self.collected_logs) > 10: - print('\nThe output from 10 first failed tests:\n') + if self.collected_failures: + if len(self.collected_failures) > 10: + print('\n\nThe output from 10 first failed tests:\n') else: - print('\nThe output from the failed tests:\n') - for log in self.collected_logs[:10]: - lines = log.splitlines() - if len(lines) > 104: - print('\n'.join(lines[0:4])) - print('--- Listing only the last 100 lines from a long log. ---') - lines = lines[-100:] - for line in lines: - try: - print(line) - except UnicodeEncodeError: - line = line.encode('ascii', errors='backslashreplace').decode('ascii') - print(line) + print('\n\nThe output from the failed tests:\n') + for i, result in enumerate(self.collected_failures, 1): + print(self.format(result, mlog.colorize_console())) + print_safe(result.get_log_short()) + if i == 10: + break def total_failure_count(self) -> int: return self.fail_count + self.unexpectedpass_count + self.timeout_count @@ -1299,7 +1306,8 @@ class TestHarness: break await complete_all(futures) - self.print_collected_logs() + if self.options.print_errorlogs: + self.print_collected_logs() self.print_summary() if self.logfilename: |