summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2021-10-21 11:42:50 -0700
committerYabin Cui <yabinc@google.com>2021-10-21 22:14:21 +0000
commit04e7868b1ffa447f01b051180fb44f2a408529e9 (patch)
tree9e32f7a792bcfb776b1c2a075d02071e8f06ebbe
parente99cc04becd6f56a9ee93dc0cdedce20fdfa24cd (diff)
downloadextras-04e7868b1ffa447f01b051180fb44f2a408529e9.tar.gz
simpleperf: fix missing python test results.
When some tests exceed MAX_TRY_TIME, their results are not written to TestSummary. So fix it in wait_for_test_results(). Also keep all tests names in TestSummary. So we can show test results in TestSummary even if they are not received. Also improve progress bar for restarted TestProcess. Bug: 203246914 Test: run scripts/test/test.py Change-Id: I6d903f10c14321e40e3b4ddd700b8953a7eb4721
-rwxr-xr-xsimpleperf/scripts/test/do_test.py98
1 files changed, 63 insertions, 35 deletions
diff --git a/simpleperf/scripts/test/do_test.py b/simpleperf/scripts/test/do_test.py
index 201d2519..47d3cbba 100755
--- a/simpleperf/scripts/test/do_test.py
+++ b/simpleperf/scripts/test/do_test.py
@@ -207,6 +207,14 @@ class TestResult:
ok: bool
duration: str
+ def __str__(self) -> str:
+ if self.ok:
+ s = 'OK'
+ else:
+ s = f'FAILED (at try_time {self.try_time})'
+ s += f' {self.duration}'
+ return s
+
class TestProcess:
""" Create a test process to run selected tests on a device. """
@@ -312,8 +320,6 @@ class ProgressBar:
def update(self, test_proc: TestProcess):
if test_proc.name not in self.test_process_bars:
- if not test_proc.alive:
- return
bar = tqdm(total=len(test_proc.tests),
desc=test_proc.name, ascii=' ##',
bar_format="{l_bar}{bar} | {n_fmt}/{total_fmt} [{elapsed}]")
@@ -325,8 +331,10 @@ class ProgressBar:
if add:
bar.update(add)
self.total_bar.update(add)
- if not test_proc.alive:
- bar.close()
+
+ def end_test_proc(self, test_proc: TestProcess):
+ if test_proc.name in self.test_process_bars:
+ self.test_process_bars[test_proc.name].close()
del self.test_process_bars[test_proc.name]
def end_tests(self):
@@ -336,40 +344,55 @@ class ProgressBar:
class TestSummary:
- def __init__(self, test_count: int):
- self.summary_fh = open('test_summary.txt', 'w')
- self.failed_summary_fh = open('failed_test_summary.txt', 'w')
- self.results: Dict[Tuple[str, str], TestResult] = {}
- self.test_count = test_count
+ def __init__(
+ self, devices: List[Device],
+ device_tests: List[str],
+ repeat_count: int, host_tests: List[str]):
+ self.results: Dict[Tuple[str, str], Optional[TestResult]] = {}
+ for test in device_tests:
+ for device in devices:
+ for repeat_index in range(1, repeat_count + 1):
+ self.results[(test, '%s_repeat_%d' % (device.name, repeat_index))] = None
+ for test in host_tests:
+ self.results[(test, 'host')] = None
+ self.write_summary()
+
+ @property
+ def test_count(self) -> int:
+ return len(self.results)
@property
def failed_test_count(self) -> int:
- return self.test_count - sum(1 for result in self.results.values() if result.ok)
+ count = 0
+ for result in self.results.values():
+ if result is None or not result.ok:
+ count += 1
+ return count
def update(self, test_proc: TestProcess):
+ if test_proc.device:
+ test_env = '%s_repeat_%d' % (test_proc.device.name, test_proc.repeat_index)
+ else:
+ test_env = 'host'
+ has_update = False
for test, result in test_proc.test_results.items():
- key = (test, '%s_try_%s' % (test_proc.name, result.try_time))
- if key not in self.results:
+ key = (test, test_env)
+ if self.results[key] != result:
self.results[key] = result
- self._write_result(key[0], key[1], result)
-
- def _write_result(self, test_name: str, test_env: str, test_result: TestResult):
- print(
- '%s %s %s %s' %
- (test_name, test_env, 'OK' if test_result.ok else 'FAILED', test_result.duration),
- file=self.summary_fh, flush=True)
- if not test_result.ok:
- print('%s %s FAILED %s' % (test_name, test_env, test_result.duration),
- file=self.failed_summary_fh, flush=True)
-
- def end_tests(self):
- # Show sorted results after testing.
- self.summary_fh.seek(0, 0)
- self.failed_summary_fh.seek(0, 0)
- for key in sorted(self.results.keys()):
- self._write_result(key[0], key[1], self.results[key])
- self.summary_fh.close()
- self.failed_summary_fh.close()
+ has_update = True
+ if has_update:
+ self.write_summary()
+
+ def write_summary(self):
+ with open('test_summary.txt', 'w') as fh, \
+ open('failed_test_summary.txt', 'w') as failed_fh:
+ for key in sorted(self.results.keys()):
+ test_name, test_env = key
+ result = self.results[key]
+ message = f'{test_name} {test_env} {result}'
+ print(message, file=fh)
+ if not result or not result.ok:
+ print(message, file=failed_fh)
class TestManager:
@@ -418,7 +441,8 @@ class TestManager:
total_test_count = (len(device_tests) + len(device_serialized_tests)
) * len(self.devices) * self.repeat_count + len(host_tests)
self.progress_bar = ProgressBar(total_test_count)
- self.test_summary = TestSummary(total_test_count)
+ self.test_summary = TestSummary(self.devices, device_tests + device_serialized_tests,
+ self.repeat_count, host_tests)
if device_tests:
self.run_device_tests(device_tests)
if device_serialized_tests:
@@ -427,7 +451,6 @@ class TestManager:
self.run_host_tests(host_tests)
self.progress_bar.end_tests()
self.progress_bar = None
- self.test_summary.end_tests()
def run_device_tests(self, tests: List[str]):
""" Tests can run in parallel on different devices. """
@@ -462,8 +485,13 @@ class TestManager:
# Process dead procs.
for test_proc in dead_procs:
test_proc.join()
- if not test_proc.finished and test_proc.restart():
- continue
+ if not test_proc.finished:
+ if test_proc.restart():
+ continue
+ else:
+ self.progress_bar.update(test_proc)
+ self.test_summary.update(test_proc)
+ self.progress_bar.end_test_proc(test_proc)
test_procs.remove(test_proc)
if test_proc.repeat_index < repeat_count:
test_procs.append(