Chromium Code Reviews| Index: utils_py/generate_test_report.py |
| diff --git a/utils_py/generate_test_report.py b/utils_py/generate_test_report.py |
| index 47ca71ea492296bbafeb810c8e2f1e5a2587bf10..bd2ada782d92d29b60fd65ffa78dbf7673dd0a39 100755 |
| --- a/utils_py/generate_test_report.py |
| +++ b/utils_py/generate_test_report.py |
| @@ -28,19 +28,19 @@ _STDOUT_IS_TTY = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() |
| # filed for the crash. |
| _CRASH_WHITELIST = {} |
| -class ReportGenerator(object): |
| - """Collects and displays data from autoserv results directories. |
| - This class collects status and performance data from one or more autoserv |
| - result directories and generates test reports. |
| - """ |
| +class ResultCollector(object): |
| + """Collects status and performance data from an autoserv results directory.""" |
| - _KEYVAL_INDENT = 2 |
| + def __init__(self, collect_perf=True, strip_text=''): |
| + """Initialize ResultsCollector class. |
| - def __init__(self, options, args): |
| - self._options = options |
| - self._args = args |
| - self._color = Color(options.color) |
| + Args: |
| + collect_perf: Should perf keyvals be collected? |
| + strip_text: Prefix to strip from test directory names. |
| + """ |
| + self._collect_perf = collect_perf |
| + self._strip_text = strip_text |
| def _CollectPerf(self, testdir): |
| """Parses keyval file under testdir. |
| @@ -58,7 +58,7 @@ class ReportGenerator(object): |
| """ |
| perf = {} |
| - if not self._options.perf: |
| + if not self._collect_perf: |
| return perf |
| keyval_file = os.path.join(testdir, 'results', 'keyval') |
| @@ -86,7 +86,7 @@ class ReportGenerator(object): |
| return perf |
| - def _CollectResult(self, testdir): |
| + def _CollectResult(self, testdir, results): |
| """Adds results stored under testdir to the self._results dictionary. |
| If testdir contains 'status.log' or 'status' files, assume it's a test |
| @@ -95,6 +95,7 @@ class ReportGenerator(object): |
| Args: |
| testdir: The autoserv test result directory. |
| + results: Results dictionary to store results in. |
| """ |
| status_file = os.path.join(testdir, 'status.log') |
| @@ -103,10 +104,6 @@ class ReportGenerator(object): |
| if not os.path.isfile(status_file): |
| return |
| - # Remove false positives that are missing a debug dir. |
| - if not os.path.exists(os.path.join(testdir, 'debug')): |
| - return |
|
sosa
2011/03/31 20:03:34
Why move this into the caller but not the above?
DaleCurtis
2011/03/31 20:17:43
Just checking for the debug directory prunes every
|
| - |
| status_raw = open(status_file, 'r').read() |
| status = 'FAIL' |
| if (re.search(r'GOOD.+completed successfully', status_raw) and |
| @@ -115,8 +112,8 @@ class ReportGenerator(object): |
| perf = self._CollectPerf(testdir) |
| - if testdir.startswith(self._options.strip): |
| - testdir = testdir.replace(self._options.strip, '', 1) |
| + if testdir.startswith(self._strip_text): |
| + testdir = testdir.replace(self._strip_text, '', 1) |
| crashes = [] |
| regex = re.compile('Received crash notification for ([-\w]+).+ (sig \d+)') |
| @@ -126,20 +123,41 @@ class ReportGenerator(object): |
| continue |
| crashes.append('%s %s' % match.groups()) |
| - self._results[testdir] = {'crashes': crashes, |
| - 'status': status, |
| - 'perf': perf} |
| + results[testdir] = {'crashes': crashes, 'status': status, 'perf': perf} |
| - def _CollectResultsRec(self, resdir): |
| - """Recursively collect results into the self._results dictionary. |
| + def CollectResults(self, resdir): |
| + """Recursively collect results into a dictionary. |
| Args: |
| resdir: results/test directory to parse results from and recurse into. |
| - """ |
| - self._CollectResult(resdir) |
| + Returns: |
| + Dictionary of results. |
| + """ |
| + results = {} |
| + self._CollectResult(resdir, results) |
| for testdir in glob.glob(os.path.join(resdir, '*')): |
| - self._CollectResultsRec(testdir) |
| + # Remove false positives that are missing a debug dir. |
| + if not os.path.exists(os.path.join(testdir, 'debug')): |
| + continue |
| + |
| + results.update(self.CollectResults(testdir)) |
| + return results |
| + |
| + |
| +class ReportGenerator(object): |
| + """Collects and displays data from autoserv results directories. |
| + |
| + This class collects status and performance data from one or more autoserv |
| + result directories and generates test reports. |
| + """ |
| + |
| + _KEYVAL_INDENT = 2 |
| + |
| + def __init__(self, options, args): |
| + self._options = options |
| + self._args = args |
| + self._color = Color(options.color) |
| def _CollectResults(self): |
| """Parses results into the self._results dictionary. |
| @@ -148,15 +166,16 @@ class ReportGenerator(object): |
| result data (status, perf keyvals) as values. |
| """ |
| self._results = {} |
| + collector = ResultCollector(self._options.perf, self._options.strip) |
| for resdir in self._args: |
| if not os.path.isdir(resdir): |
| Die('\'%s\' does not exist' % resdir) |
| - self._CollectResultsRec(resdir) |
| + self._results.update(collector.CollectResults(resdir)) |
| if not self._results: |
| Die('no test directories found') |
| - def GetTestColumnWidth(self): |
| + def _GetTestColumnWidth(self): |
| """Returns the test column width based on the test data. |
| Aligns the test results by formatting the test directory entry based on |
| @@ -187,7 +206,7 @@ class ReportGenerator(object): |
| tests_with_errors = [] |
| - width = self.GetTestColumnWidth() |
| + width = self._GetTestColumnWidth() |
| line = ''.ljust(width + 5, '-') |
| crashes = {} |
| @@ -257,7 +276,7 @@ class ReportGenerator(object): |
| if self._options.print_debug: |
| for test in tests_with_errors: |
| debug_file_regex = os.path.join(self._options.strip, test, 'debug', |
| - '%s*.ERROR' % os.path.basename(test)) |
| + '%s*.ERROR' % os.path.basename(test)) |
| for path in glob.glob(debug_file_regex): |
| try: |
| fh = open(path) |