• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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