blob: 8c763fc7125aa0e68a059d548be446503c807072 [file] [log] [blame]
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import sys
import traceback
import unittest
class PageTestResults(unittest.TestResult):
def __init__(self):
super(PageTestResults, self).__init__()
self.pages_that_had_errors = set()
self.pages_that_had_failures = set()
self.successes = []
self.skipped = []
@property
def pages_that_had_errors_or_failures(self):
return self.pages_that_had_errors.union(
self.pages_that_had_failures)
def _exc_info_to_string(self, err, test):
if isinstance(test, unittest.TestCase):
return super(PageTestResults, self)._exc_info_to_string(err, test)
else:
return ''.join(traceback.format_exception(*err))
def addSuccess(self, test):
self.successes.append(test)
def addSkip(self, test, reason): # Python 2.7 has this in unittest.TestResult
self.skipped.append((test, reason))
def StartTest(self, page):
self.startTest(page.display_name)
def StopTest(self, page):
self.stopTest(page.display_name)
def AddError(self, page, err):
self.pages_that_had_errors.add(page)
self.addError(page.display_name, err)
def AddFailure(self, page, err):
self.pages_that_had_failures.add(page)
self.addFailure(page.display_name, err)
def AddSuccess(self, page):
self.addSuccess(page.display_name)
def AddSkip(self, page, reason):
self.addSkip(page.display_name, reason)
def AddFailureMessage(self, page, message):
try:
raise Exception(message)
except Exception:
self.AddFailure(page, sys.exc_info())
def AddErrorMessage(self, page, message):
try:
raise Exception(message)
except Exception:
self.AddError(page, sys.exc_info())
def PrintSummary(self):
if self.failures:
logging.error('Failed pages:\n%s', '\n'.join(zip(*self.failures)[0]))
if self.errors:
logging.error('Errored pages:\n%s', '\n'.join(zip(*self.errors)[0]))
if self.skipped:
logging.warning('Skipped pages:\n%s', '\n'.join(zip(*self.skipped)[0]))