mtest: remove collected_logs

Just reuse the collected_failures collection now that it contains
TestRun objects.  Move the code to generate the short form of the log
to TestRun.

Note that the first line of the error log is not included in
get_log()'s return value, so the magic "first four lines are passed
unscathed" is changed to three lines only.  The resulting output is
like this:

    --- command ---
    <command line>
    --- Listing only the last 100 lines from a long log. ---
    --- stdout ---
    ...

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
pull/8001/head
Paolo Bonzini 4 years ago
parent 414aee6328
commit 109cde4ddc
  1. 58
      mesonbuild/mtest.py

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

Loading…
Cancel
Save