OLD | NEW |
| (Empty) |
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 """Module containing base test results classes.""" | |
6 | |
7 class ResultType(object): | |
8 """Class enumerating test types.""" | |
9 PASS = 'PASS' | |
10 SKIP = 'SKIP' | |
11 FAIL = 'FAIL' | |
12 CRASH = 'CRASH' | |
13 TIMEOUT = 'TIMEOUT' | |
14 UNKNOWN = 'UNKNOWN' | |
15 | |
16 @staticmethod | |
17 def GetTypes(): | |
18 """Get a list of all test types.""" | |
19 return [ResultType.PASS, ResultType.SKIP, ResultType.FAIL, | |
20 ResultType.CRASH, ResultType.TIMEOUT, ResultType.UNKNOWN] | |
21 | |
22 | |
23 class BaseTestResult(object): | |
24 """Base class for a single test result.""" | |
25 | |
26 def __init__(self, name, test_type, duration=0, log=''): | |
27 """Construct a BaseTestResult. | |
28 | |
29 Args: | |
30 name: Name of the test which defines uniqueness. | |
31 test_type: Type of the test result as defined in ResultType. | |
32 duration: Time it took for the test to run in milliseconds. | |
33 log: An optional string listing any errors. | |
34 """ | |
35 assert name | |
36 assert test_type in ResultType.GetTypes() | |
37 self._name = name | |
38 self._test_type = test_type | |
39 self._duration = duration | |
40 self._log = log | |
41 | |
42 def __str__(self): | |
43 return self._name | |
44 | |
45 def __repr__(self): | |
46 return self._name | |
47 | |
48 def __cmp__(self, other): | |
49 # pylint: disable=W0212 | |
50 return cmp(self._name, other._name) | |
51 | |
52 def __hash__(self): | |
53 return hash(self._name) | |
54 | |
55 def SetName(self, name): | |
56 """Set the test name. | |
57 | |
58 Because we're putting this into a set, this should only be used if moving | |
59 this test result into another set. | |
60 """ | |
61 self._name = name | |
62 | |
63 def GetName(self): | |
64 """Get the test name.""" | |
65 return self._name | |
66 | |
67 def SetType(self, test_type): | |
68 """Set the test result type.""" | |
69 assert test_type in ResultType.GetTypes() | |
70 self._test_type = test_type | |
71 | |
72 def GetType(self): | |
73 """Get the test result type.""" | |
74 return self._test_type | |
75 | |
76 def GetDuration(self): | |
77 """Get the test duration.""" | |
78 return self._duration | |
79 | |
80 def SetLog(self, log): | |
81 """Set the test log.""" | |
82 self._log = log | |
83 | |
84 def GetLog(self): | |
85 """Get the test log.""" | |
86 return self._log | |
87 | |
88 | |
89 class TestRunResults(object): | |
90 """Set of results for a test run.""" | |
91 | |
92 def __init__(self): | |
93 self._results = set() | |
94 | |
95 def GetLogs(self): | |
96 """Get the string representation of all test logs.""" | |
97 s = [] | |
98 for test_type in ResultType.GetTypes(): | |
99 if test_type != ResultType.PASS: | |
100 for t in sorted(self._GetType(test_type)): | |
101 log = t.GetLog() | |
102 if log: | |
103 s.append('[%s] %s:' % (test_type, t)) | |
104 s.append(log) | |
105 return '\n'.join(s) | |
106 | |
107 def GetGtestForm(self): | |
108 """Get the gtest string representation of this object.""" | |
109 s = [] | |
110 plural = lambda n, s, p: '%d %s' % (n, p if n != 1 else s) | |
111 tests = lambda n: plural(n, 'test', 'tests') | |
112 | |
113 s.append('[==========] %s ran.' % (tests(len(self.GetAll())))) | |
114 s.append('[ PASSED ] %s.' % (tests(len(self.GetPass())))) | |
115 | |
116 skipped = self.GetSkip() | |
117 if skipped: | |
118 s.append('[ SKIPPED ] Skipped %s, listed below:' % tests(len(skipped))) | |
119 for t in sorted(skipped): | |
120 s.append('[ SKIPPED ] %s' % str(t)) | |
121 | |
122 all_failures = self.GetFail().union(self.GetCrash(), self.GetTimeout(), | |
123 self.GetUnknown()) | |
124 if all_failures: | |
125 s.append('[ FAILED ] %s, listed below:' % tests(len(all_failures))) | |
126 for t in sorted(self.GetFail()): | |
127 s.append('[ FAILED ] %s' % str(t)) | |
128 for t in sorted(self.GetCrash()): | |
129 s.append('[ FAILED ] %s (CRASHED)' % str(t)) | |
130 for t in sorted(self.GetTimeout()): | |
131 s.append('[ FAILED ] %s (TIMEOUT)' % str(t)) | |
132 for t in sorted(self.GetUnknown()): | |
133 s.append('[ FAILED ] %s (UNKNOWN)' % str(t)) | |
134 s.append('') | |
135 s.append(plural(len(all_failures), 'FAILED TEST', 'FAILED TESTS')) | |
136 return '\n'.join(s) | |
137 | |
138 def GetShortForm(self): | |
139 """Get the short string representation of this object.""" | |
140 s = [] | |
141 s.append('ALL: %d' % len(self._results)) | |
142 for test_type in ResultType.GetTypes(): | |
143 s.append('%s: %d' % (test_type, len(self._GetType(test_type)))) | |
144 return ''.join([x.ljust(15) for x in s]) | |
145 | |
146 def __str__(self): | |
147 return self.GetLongForm() | |
148 | |
149 def AddResult(self, result): | |
150 """Add |result| to the set. | |
151 | |
152 Args: | |
153 result: An instance of BaseTestResult. | |
154 """ | |
155 assert isinstance(result, BaseTestResult) | |
156 self._results.add(result) | |
157 | |
158 def AddResults(self, results): | |
159 """Add |results| to the set. | |
160 | |
161 Args: | |
162 results: An iterable of BaseTestResult objects. | |
163 """ | |
164 for t in results: | |
165 self.AddResult(t) | |
166 | |
167 def AddTestRunResults(self, results): | |
168 """Add the set of test results from |results|. | |
169 | |
170 Args: | |
171 results: An instance of TestRunResults. | |
172 """ | |
173 assert isinstance(results, TestRunResults) | |
174 # pylint: disable=W0212 | |
175 self._results.update(results._results) | |
176 | |
177 def GetAll(self): | |
178 """Get the set of all test results.""" | |
179 return self._results.copy() | |
180 | |
181 def _GetType(self, test_type): | |
182 """Get the set of test results with the given test type.""" | |
183 return set(t for t in self._results if t.GetType() == test_type) | |
184 | |
185 def GetPass(self): | |
186 """Get the set of all passed test results.""" | |
187 return self._GetType(ResultType.PASS) | |
188 | |
189 def GetSkip(self): | |
190 """Get the set of all skipped test results.""" | |
191 return self._GetType(ResultType.SKIP) | |
192 | |
193 def GetFail(self): | |
194 """Get the set of all failed test results.""" | |
195 return self._GetType(ResultType.FAIL) | |
196 | |
197 def GetCrash(self): | |
198 """Get the set of all crashed test results.""" | |
199 return self._GetType(ResultType.CRASH) | |
200 | |
201 def GetTimeout(self): | |
202 """Get the set of all timed out test results.""" | |
203 return self._GetType(ResultType.TIMEOUT) | |
204 | |
205 def GetUnknown(self): | |
206 """Get the set of all unknown test results.""" | |
207 return self._GetType(ResultType.UNKNOWN) | |
208 | |
209 def GetNotPass(self): | |
210 """Get the set of all non-passed test results.""" | |
211 return self.GetAll() - self.GetPass() | |
212 | |
213 def DidRunPass(self): | |
214 """Return whether the test run was successful.""" | |
215 return not self.GetNotPass() - self.GetSkip() | |
216 | |
OLD | NEW |