Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: generate_test_report.py

Issue 3814009: Print out debug of test when it fails. (Closed) Base URL: http://git.chromium.org/git/crosutils.git
Patch Set: Nits Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 6
7 """Parses and displays the contents of one or more autoserv result directories. 7 """Parses and displays the contents of one or more autoserv result directories.
8 8
9 This script parses the contents of one or more autoserv results folders and 9 This script parses the contents of one or more autoserv results folders and
10 generates test reports. 10 generates test reports.
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 """Prints a result report to stdout. 160 """Prints a result report to stdout.
161 161
162 Prints a result table to stdout. Each row of the table contains the test 162 Prints a result table to stdout. Each row of the table contains the test
163 result directory and the test result (PASS, FAIL). If the perf option is 163 result directory and the test result (PASS, FAIL). If the perf option is
164 enabled, each test entry is followed by perf keyval entries from the test 164 enabled, each test entry is followed by perf keyval entries from the test
165 results. 165 results.
166 """ 166 """
167 tests = self._results.keys() 167 tests = self._results.keys()
168 tests.sort() 168 tests.sort()
169 169
170 tests_with_errors = []
171
170 width = self.GetTestColumnWidth() 172 width = self.GetTestColumnWidth()
171 line = ''.ljust(width + 5, '-') 173 line = ''.ljust(width + 5, '-')
172 174
173 tests_pass = 0 175 tests_pass = 0
174 print line 176 print line
175 for test in tests: 177 for test in tests:
176 # Emit the test/status entry first 178 # Emit the test/status entry first
177 test_entry = test.ljust(width) 179 test_entry = test.ljust(width)
178 result = self._results[test] 180 result = self._results[test]
179 status_entry = result['status'] 181 status_entry = result['status']
180 if status_entry == 'PASS': 182 if status_entry == 'PASS':
181 color = Color.GREEN 183 color = Color.GREEN
182 tests_pass += 1 184 tests_pass += 1
183 else: 185 else:
184 color = Color.RED 186 color = Color.RED
187 tests_with_errors.append(test)
188
185 status_entry = self._color.Color(color, status_entry) 189 status_entry = self._color.Color(color, status_entry)
186 print test_entry + status_entry 190 print test_entry + status_entry
187 191
188 # Emit the perf keyvals entries. There will be no entries if the 192 # Emit the perf keyvals entries. There will be no entries if the
189 # --no-perf option is specified. 193 # --no-perf option is specified.
190 perf = result['perf'] 194 perf = result['perf']
191 perf_keys = perf.keys() 195 perf_keys = perf.keys()
192 perf_keys.sort() 196 perf_keys.sort()
193 197
194 for perf_key in perf_keys: 198 for perf_key in perf_keys:
195 perf_key_entry = perf_key.ljust(width - self._KEYVAL_INDENT) 199 perf_key_entry = perf_key.ljust(width - self._KEYVAL_INDENT)
196 perf_key_entry = perf_key_entry.rjust(width) 200 perf_key_entry = perf_key_entry.rjust(width)
197 perf_value_entry = self._color.Color(Color.BOLD, perf[perf_key]) 201 perf_value_entry = self._color.Color(Color.BOLD, perf[perf_key])
198 print perf_key_entry + perf_value_entry 202 print perf_key_entry + perf_value_entry
199 203
200 print line 204 print line
201 205
202 total_tests = len(tests) 206 total_tests = len(tests)
203 percent_pass = 100 * tests_pass / total_tests 207 percent_pass = 100 * tests_pass / total_tests
204 pass_str = '%d/%d (%d%%)' % (tests_pass, total_tests, percent_pass) 208 pass_str = '%d/%d (%d%%)' % (tests_pass, total_tests, percent_pass)
205 print 'Total PASS: ' + self._color.Color(Color.BOLD, pass_str) 209 print 'Total PASS: ' + self._color.Color(Color.BOLD, pass_str)
206 210
211 # Print out the client debug information for failed tests.
212 if self._options.print_debug:
213 for test in tests_with_errors:
214 debug_file_regex = os.path.join(self._options.strip, test, 'debug',
215 'client.*.DEBUG')
216 for path in glob.glob(debug_file_regex):
217 try:
218 fh = open(path)
219 print ('\n========== DEBUG FILE %s FOR TEST %s ==============\n' % (
220 path, test))
221 print fh.read()
222 print('\n=========== END DEBUG %s FOR TEST %s ===============\n' % (
223 path, test))
224 fh.close()
225 except:
226 print 'Could not open %s' % path
227
207 def Run(self): 228 def Run(self):
208 """Runs report generation.""" 229 """Runs report generation."""
209 self._CollectResults() 230 self._CollectResults()
210 self._GenerateReportText() 231 self._GenerateReportText()
211 for v in self._results.itervalues(): 232 for v in self._results.itervalues():
212 if v['status'] != 'PASS': 233 if v['status'] != 'PASS':
213 sys.exit(1) 234 sys.exit(1)
214 235
215 236
216 def main(): 237 def main():
217 usage = 'Usage: %prog [options] result-directories...' 238 usage = 'Usage: %prog [options] result-directories...'
218 parser = optparse.OptionParser(usage=usage) 239 parser = optparse.OptionParser(usage=usage)
219 parser.add_option('--color', dest='color', action='store_true', 240 parser.add_option('--color', dest='color', action='store_true',
220 default=_STDOUT_IS_TTY, 241 default=_STDOUT_IS_TTY,
221 help='Use color for text reports [default if TTY stdout]') 242 help='Use color for text reports [default if TTY stdout]')
222 parser.add_option('--no-color', dest='color', action='store_false', 243 parser.add_option('--no-color', dest='color', action='store_false',
223 help='Don\'t use color for text reports') 244 help='Don\'t use color for text reports')
224 parser.add_option('--perf', dest='perf', action='store_true', 245 parser.add_option('--perf', dest='perf', action='store_true',
225 default=True, 246 default=True,
226 help='Include perf keyvals in the report [default]') 247 help='Include perf keyvals in the report [default]')
227 parser.add_option('--no-perf', dest='perf', action='store_false', 248 parser.add_option('--no-perf', dest='perf', action='store_false',
228 help='Don\'t include perf keyvals in the report') 249 help='Don\'t include perf keyvals in the report')
229 parser.add_option('--strip', dest='strip', type='string', action='store', 250 parser.add_option('--strip', dest='strip', type='string', action='store',
230 default='results.', 251 default='results.',
231 help='Strip a prefix from test directory names' 252 help='Strip a prefix from test directory names'
232 ' [default: \'%default\']') 253 ' [default: \'%default\']')
233 parser.add_option('--no-strip', dest='strip', const='', action='store_const', 254 parser.add_option('--no-strip', dest='strip', const='', action='store_const',
234 help='Don\'t strip a prefix from test directory names') 255 help='Don\'t strip a prefix from test directory names')
256 parser.add_option('--no-debug', dest='print_debug', action='store_false',
257 default=True,
258 help='Do not print out the debug log when a test fails.')
235 (options, args) = parser.parse_args() 259 (options, args) = parser.parse_args()
236 260
237 if not args: 261 if not args:
238 parser.print_help() 262 parser.print_help()
239 Die('no result directories provided') 263 Die('no result directories provided')
240 264
241 generator = ReportGenerator(options, args) 265 generator = ReportGenerator(options, args)
242 generator.Run() 266 generator.Run()
243 267
244 268
245 if __name__ == '__main__': 269 if __name__ == '__main__':
246 main() 270 main()
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698