1# Copyright 2014 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import collections 6import copy 7import logging 8import sys 9import traceback 10 11 12class PageTestResults(object): 13 def __init__(self, output_stream=None): 14 super(PageTestResults, self).__init__() 15 self._output_stream = output_stream 16 self.pages_that_had_errors = set() 17 self.pages_that_had_failures = set() 18 self.successes = [] 19 self.errors = [] 20 self.failures = [] 21 self.skipped = [] 22 23 def __copy__(self): 24 cls = self.__class__ 25 result = cls.__new__(cls) 26 for k, v in self.__dict__.items(): 27 if isinstance(v, collections.Container): 28 v = copy.copy(v) 29 setattr(result, k, v) 30 return result 31 32 @property 33 def pages_that_had_errors_or_failures(self): 34 return self.pages_that_had_errors.union( 35 self.pages_that_had_failures) 36 37 def _GetStringFromExcInfo(self, err): 38 return ''.join(traceback.format_exception(*err)) 39 40 def StartTest(self, page): 41 pass 42 43 def StopTest(self, page): 44 pass 45 46 def AddError(self, page, err): 47 self.pages_that_had_errors.add(page) 48 self.errors.append((page, self._GetStringFromExcInfo(err))) 49 50 def AddFailure(self, page, err): 51 self.pages_that_had_failures.add(page) 52 self.failures.append((page, self._GetStringFromExcInfo(err))) 53 54 def AddSkip(self, page, reason): 55 self.skipped.append((page, reason)) 56 57 def AddSuccess(self, page): 58 self.successes.append(page) 59 60 def AddFailureMessage(self, page, message): 61 try: 62 raise Exception(message) 63 except Exception: 64 self.AddFailure(page, sys.exc_info()) 65 66 def AddErrorMessage(self, page, message): 67 try: 68 raise Exception(message) 69 except Exception: 70 self.AddError(page, sys.exc_info()) 71 72 def PrintSummary(self): 73 if self.failures: 74 logging.error('Failed pages:\n%s', '\n'.join( 75 p.display_name for p in zip(*self.failures)[0])) 76 77 if self.errors: 78 logging.error('Errored pages:\n%s', '\n'.join( 79 p.display_name for p in zip(*self.errors)[0])) 80 81 if self.skipped: 82 logging.warning('Skipped pages:\n%s', '\n'.join( 83 p.display_name for p in zip(*self.skipped)[0])) 84