Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / page_test_results.py
1 # Copyright (c) 2013 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
5 import collections
6 import copy
7 import logging
8 import sys
9 import traceback
10 import unittest
11
12 class PageTestResults(unittest.TestResult):
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.skipped = []
20
21   def __copy__(self):
22     cls = self.__class__
23     result = cls.__new__(cls)
24     for k, v in self.__dict__.items():
25       if isinstance(v, collections.Container):
26         v = copy.copy(v)
27       setattr(result, k, v)
28     return result
29
30   @property
31   def pages_that_had_errors_or_failures(self):
32     return self.pages_that_had_errors.union(
33       self.pages_that_had_failures)
34
35   def _exc_info_to_string(self, err, test):
36     if isinstance(test, unittest.TestCase):
37       return super(PageTestResults, self)._exc_info_to_string(err, test)
38     else:
39       return ''.join(traceback.format_exception(*err))
40
41   def addSuccess(self, test):
42     self.successes.append(test)
43
44   def addSkip(self, test, reason):  # Python 2.7 has this in unittest.TestResult
45     logging.warning('%s\n%s\nSkipping page.', test, reason)
46     self.skipped.append((test, reason))
47
48   def StartTest(self, page):
49     self.startTest(page.display_name)
50
51   def StopTest(self, page):
52     self.stopTest(page.display_name)
53
54   def AddError(self, page, err):
55     self.pages_that_had_errors.add(page)
56     self.addError(page.display_name, err)
57
58   def AddFailure(self, page, err):
59     self.pages_that_had_failures.add(page)
60     self.addFailure(page.display_name, err)
61
62   def AddSuccess(self, page):
63     self.addSuccess(page.display_name)
64
65   def AddSkip(self, page, reason):
66     self.addSkip(page.display_name, reason)
67
68   def AddFailureMessage(self, page, message):
69     try:
70       raise Exception(message)
71     except Exception:
72       self.AddFailure(page, sys.exc_info())
73
74   def AddErrorMessage(self, page, message):
75     try:
76       raise Exception(message)
77     except Exception:
78       self.AddError(page, sys.exc_info())
79
80   def PrintSummary(self):
81     if self.failures:
82       logging.error('Failed pages:\n%s', '\n'.join(zip(*self.failures)[0]))
83
84     if self.errors:
85       logging.error('Errored pages:\n%s', '\n'.join(zip(*self.errors)[0]))
86
87     if self.skipped:
88       logging.warning('Skipped pages:\n%s', '\n'.join(zip(*self.skipped)[0]))