OLD | NEW |
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import os | 5 import os |
6 import string | 6 import string |
7 import sys | 7 import sys |
8 import tempfile | 8 import tempfile |
9 import unittest | 9 import unittest |
10 import json | 10 import json |
11 | 11 |
12 import mock | |
13 | |
14 from telemetry import decorators | |
15 from telemetry import project_config | 12 from telemetry import project_config |
16 from telemetry.core import util | 13 from telemetry.core import util |
| 14 from telemetry.testing import browser_test_context |
17 from telemetry.testing import browser_test_runner | 15 from telemetry.testing import browser_test_runner |
| 16 from telemetry.testing import options_for_unittests |
| 17 from telemetry.testing import run_browser_tests |
18 from telemetry.testing import serially_executed_browser_test_case | 18 from telemetry.testing import serially_executed_browser_test_case |
19 | 19 |
20 | 20 |
21 class BrowserTestRunnerTest(unittest.TestCase): | 21 class BrowserTestRunnerTest(unittest.TestCase): |
22 | 22 |
23 def baseTest(self, mockInitDependencyManager, test_filter, | 23 def _ExtractTestResults(self, test_result): |
| 24 delimiter = test_result['path_delimiter'] |
| 25 failures = [] |
| 26 successes = [] |
| 27 def _IsLeafNode(node): |
| 28 test_dict = node[1] |
| 29 return ('expected' in test_dict and |
| 30 isinstance(test_dict['expected'], basestring)) |
| 31 node_queues = [] |
| 32 for t in test_result['tests']: |
| 33 node_queues.append((t, test_result['tests'][t])) |
| 34 while node_queues: |
| 35 node = node_queues.pop() |
| 36 full_test_name, test_dict = node |
| 37 if _IsLeafNode(node): |
| 38 if all(res not in test_dict['expected'].split() for res in |
| 39 test_dict['actual'].split()): |
| 40 failures.append(full_test_name) |
| 41 else: |
| 42 successes.append(full_test_name) |
| 43 else: |
| 44 for k in test_dict: |
| 45 node_queues.append( |
| 46 ('%s%s%s' % (full_test_name, delimiter, k), |
| 47 test_dict[k])) |
| 48 return successes, failures |
| 49 |
| 50 def baseTest(self, test_filter, |
24 failures, successes, test_name='SimpleTest'): | 51 failures, successes, test_name='SimpleTest'): |
25 options = browser_test_runner.TestRunOptions() | |
26 options.verbosity = 0 | |
27 config = project_config.ProjectConfig( | 52 config = project_config.ProjectConfig( |
28 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), | 53 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), |
29 client_configs=['a', 'b', 'c'], | 54 client_configs=[], |
30 benchmark_dirs=[ | 55 benchmark_dirs=[ |
31 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] | 56 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] |
32 ) | 57 ) |
33 temp_file = tempfile.NamedTemporaryFile(delete=False) | 58 temp_file = tempfile.NamedTemporaryFile(delete=False) |
34 temp_file.close() | 59 temp_file.close() |
35 temp_file_name = temp_file.name | 60 temp_file_name = temp_file.name |
36 try: | 61 try: |
37 browser_test_runner.Run( | 62 browser_test_runner.Run( |
38 config, options, | 63 config, |
39 [test_name, | 64 [test_name, |
40 '--write-abbreviated-json-results-to=%s' % temp_file_name, | 65 '--write-full-results-to=%s' % temp_file_name, |
41 '--test-filter=%s' % test_filter]) | 66 '--test-filter=%s' % test_filter]) |
42 mockInitDependencyManager.assert_called_with(['a', 'b', 'c']) | |
43 with open(temp_file_name) as f: | 67 with open(temp_file_name) as f: |
44 test_result = json.load(f) | 68 test_result = json.load(f) |
45 self.assertEquals(test_result['failures'], failures) | 69 |
46 self.assertEquals(test_result['successes'], successes) | 70 actual_successes, actual_failures = self._ExtractTestResults(test_result) |
47 self.assertEquals(test_result['valid'], True) | 71 self.assertEquals(set(actual_failures), set(failures)) |
| 72 self.assertEquals(set(actual_successes), set(successes)) |
48 finally: | 73 finally: |
49 os.remove(temp_file_name) | 74 os.remove(temp_file_name) |
50 | 75 |
51 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 76 def testJsonOutputFormatNegativeFilter(self): |
52 def testJsonOutputFormatNegativeFilter(self, mockInitDependencyManager): | |
53 self.baseTest( | 77 self.baseTest( |
54 mockInitDependencyManager, '^(add|multiplier).*', | 78 '^(add|multiplier).*', |
55 ['add_1_and_2', | 79 ['browser_tests.simple_numeric_test.SimpleTest.add_1_and_2', |
56 'add_7_and_3', | 80 'browser_tests.simple_numeric_test.SimpleTest.add_7_and_3', |
57 'multiplier_simple_2'], | 81 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple_2'], |
58 ['add_2_and_3', | 82 ['browser_tests.simple_numeric_test.SimpleTest.add_2_and_3', |
59 'multiplier_simple', | 83 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple', |
60 'multiplier_simple_3']) | 84 'browser_tests.simple_numeric_test.SimpleTest.multiplier_simple_3']) |
61 | 85 |
62 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 86 def testJsonOutputWhenSetupClassFailed(self): |
63 def testJsonOutputWhenSetupClassFailed(self, mockInitDependencyManager): | |
64 self.baseTest( | 87 self.baseTest( |
65 mockInitDependencyManager, '.*', | 88 '.*', |
66 ['setUpClass (browser_tests.failed_tests.SetUpClassFailedTest)'], | 89 ['browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_0', |
| 90 'browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_1', |
| 91 'browser_tests.failed_tests.SetUpClassFailedTest.dummy_test_2'], |
67 [], test_name='SetUpClassFailedTest') | 92 [], test_name='SetUpClassFailedTest') |
68 | 93 |
69 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 94 def testJsonOutputWhenTearDownClassFailed(self): |
70 def testJsonOutputWhenTearDownClassFailed(self, mockInitDependencyManager): | |
71 self.baseTest( | 95 self.baseTest( |
72 mockInitDependencyManager, '.*', | 96 '.*', |
73 ['tearDownClass (browser_tests.failed_tests.TearDownClassFailedTest)'], | 97 ['browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_0', |
74 sorted(['dummy_test_%i' %i for i in xrange(0, 100)]), | 98 'browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_1', |
75 test_name='TearDownClassFailedTest') | 99 'browser_tests.failed_tests.TearDownClassFailedTest.dummy_test_2'], |
| 100 [], test_name='TearDownClassFailedTest') |
76 | 101 |
77 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 102 def testSetUpProcessCalledOnce(self): |
78 def testJsonOutputFormatPositiveFilter(self, mockInitDependencyManager): | |
79 self.baseTest( | 103 self.baseTest( |
80 mockInitDependencyManager, '(TestSimple|TestException).*', | 104 '.*', |
81 ['TestException', 'TestSimple'], []) | 105 [], |
| 106 ['browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_0', |
| 107 'browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_1', |
| 108 'browser_tests.process_tests.FailIfSetUpProcessCalledTwice.Dummy_2'], |
| 109 test_name='FailIfSetUpProcessCalledTwice') |
82 | 110 |
83 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 111 def testTearDownProcessCalledOnce(self): |
84 def testExecutingTestsInSortedOrder(self, mockInitDependencyManager): | 112 self.baseTest( |
| 113 '.*', |
| 114 [], |
| 115 ['browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_0', |
| 116 'browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_1', |
| 117 'browser_tests.process_tests.FailIfTearDownProcessCalledTwice.Dummy_2'], |
| 118 test_name='FailIfTearDownProcessCalledTwice') |
| 119 |
| 120 def testJsonOutputFormatPositiveFilter(self): |
| 121 self.baseTest( |
| 122 '(TestSimple|TestException).*', |
| 123 ['browser_tests.simple_numeric_test.SimpleTest.TestException', |
| 124 'browser_tests.simple_numeric_test.SimpleTest.TestSimple'], []) |
| 125 |
| 126 def testExecutingTestsInSortedOrder(self): |
85 alphabetical_tests = [] | 127 alphabetical_tests = [] |
86 prefix = 'Alphabetical_' | 128 prefix = 'browser_tests.simple_numeric_test.SimpleTest.Alphabetical_' |
87 for i in xrange(20): | 129 for i in xrange(20): |
88 alphabetical_tests.append(prefix + str(i)) | 130 alphabetical_tests.append(prefix + str(i)) |
89 for c in string.uppercase[:26]: | 131 for c in string.uppercase[:26]: |
90 alphabetical_tests.append(prefix + c) | 132 alphabetical_tests.append(prefix + c) |
91 for c in string.lowercase[:26]: | 133 for c in string.lowercase[:26]: |
92 alphabetical_tests.append(prefix + c) | 134 alphabetical_tests.append(prefix + c) |
93 alphabetical_tests.sort() | 135 alphabetical_tests.sort() |
94 self.baseTest( | 136 self.baseTest( |
95 mockInitDependencyManager, 'Alphabetical', [], alphabetical_tests) | 137 'Alphabetical', [], alphabetical_tests) |
96 | 138 |
97 def shardingRangeTestHelper(self, total_shards, num_tests): | 139 def shardingRangeTestHelper(self, total_shards, num_tests): |
98 shard_ranges = [] | 140 shard_ranges = [] |
99 for shard_index in xrange(0, total_shards): | 141 for shard_index in xrange(0, total_shards): |
100 shard_ranges.append(browser_test_runner._TestRangeForShard( | 142 shard_ranges.append(run_browser_tests._TestRangeForShard( |
101 total_shards, shard_index, num_tests)) | 143 total_shards, shard_index, num_tests)) |
102 # Make assertions about ranges | 144 # Make assertions about ranges |
103 num_tests_run = 0 | 145 num_tests_run = 0 |
104 for i in xrange(0, len(shard_ranges)): | 146 for i in xrange(0, len(shard_ranges)): |
105 cur_range = shard_ranges[i] | 147 cur_range = shard_ranges[i] |
106 if i < num_tests: | 148 if i < num_tests: |
107 self.assertGreater(cur_range[1], cur_range[0]) | 149 self.assertGreater(cur_range[1], cur_range[0]) |
108 num_tests_run += (cur_range[1] - cur_range[0]) | 150 num_tests_run += (cur_range[1] - cur_range[0]) |
109 else: | 151 else: |
110 # Not enough tests to go around all of the shards. | 152 # Not enough tests to go around all of the shards. |
111 self.assertEquals(cur_range[0], cur_range[1]) | 153 self.assertEquals(cur_range[0], cur_range[1]) |
112 # Make assertions about non-overlapping ranges | 154 # Make assertions about non-overlapping ranges |
113 for i in xrange(1, len(shard_ranges)): | 155 for i in xrange(1, len(shard_ranges)): |
114 prev_range = shard_ranges[i - 1] | 156 prev_range = shard_ranges[i - 1] |
115 cur_range = shard_ranges[i] | 157 cur_range = shard_ranges[i] |
116 self.assertEquals(prev_range[1], cur_range[0]) | 158 self.assertEquals(prev_range[1], cur_range[0]) |
117 # Assert that we run all of the tests (very important) | 159 # Assert that we run all of the tests (very important) |
118 self.assertEquals(num_tests_run, num_tests) | 160 self.assertEquals(num_tests_run, num_tests) |
119 | 161 |
120 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 162 def testShardsWithPrimeNumTests(self): |
121 def testShardsWithPrimeNumTests(self, _): | |
122 for total_shards in xrange(1, 20): | 163 for total_shards in xrange(1, 20): |
123 # Nice non-prime number | 164 # Nice non-prime number |
124 self.shardingRangeTestHelper(total_shards, 101) | 165 self.shardingRangeTestHelper(total_shards, 101) |
125 | 166 |
126 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 167 def testShardsWithDivisibleNumTests(self): |
127 def testShardsWithDivisibleNumTests(self, _): | |
128 for total_shards in xrange(1, 6): | 168 for total_shards in xrange(1, 6): |
129 self.shardingRangeTestHelper(total_shards, 8) | 169 self.shardingRangeTestHelper(total_shards, 8) |
130 | 170 |
131 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 171 def testShardBoundaryConditions(self): |
132 def testShardBoundaryConditions(self, _): | |
133 self.shardingRangeTestHelper(1, 0) | 172 self.shardingRangeTestHelper(1, 0) |
134 self.shardingRangeTestHelper(1, 1) | 173 self.shardingRangeTestHelper(1, 1) |
135 self.shardingRangeTestHelper(2, 1) | 174 self.shardingRangeTestHelper(2, 1) |
136 | 175 |
137 def baseShardingTest(self, total_shards, shard_index, failures, successes, | 176 def baseShardingTest(self, total_shards, shard_index, failures, successes, |
138 opt_abbr_input_json_file=None, | 177 opt_abbr_input_json_file=None, |
139 opt_test_filter='', | 178 opt_test_filter='', |
140 opt_filter_tests_after_sharding=False): | 179 opt_filter_tests_after_sharding=False): |
141 options = browser_test_runner.TestRunOptions() | |
142 options.verbosity = 0 | |
143 config = project_config.ProjectConfig( | 180 config = project_config.ProjectConfig( |
144 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), | 181 top_level_dir=os.path.join(util.GetTelemetryDir(), 'examples'), |
145 client_configs=['a', 'b', 'c'], | 182 client_configs=[], |
146 benchmark_dirs=[ | 183 benchmark_dirs=[ |
147 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] | 184 os.path.join(util.GetTelemetryDir(), 'examples', 'browser_tests')] |
148 ) | 185 ) |
149 temp_file = tempfile.NamedTemporaryFile(delete=False) | 186 temp_file = tempfile.NamedTemporaryFile(delete=False) |
150 temp_file.close() | 187 temp_file.close() |
151 temp_file_name = temp_file.name | 188 temp_file_name = temp_file.name |
152 opt_args = [] | 189 opt_args = [] |
153 if opt_abbr_input_json_file: | 190 if opt_abbr_input_json_file: |
154 opt_args += [ | 191 opt_args += [ |
155 '--read-abbreviated-json-results-from=%s' % opt_abbr_input_json_file] | 192 '--read-abbreviated-json-results-from=%s' % opt_abbr_input_json_file] |
156 if opt_test_filter: | 193 if opt_test_filter: |
157 opt_args += [ | 194 opt_args += [ |
158 '--test-filter=%s' % opt_test_filter] | 195 '--test-filter=%s' % opt_test_filter] |
159 if opt_filter_tests_after_sharding: | 196 if opt_filter_tests_after_sharding: |
160 opt_args += ['--filter-tests-after-sharding'] | 197 opt_args += ['--filter-tests-after-sharding'] |
161 try: | 198 try: |
162 browser_test_runner.Run( | 199 browser_test_runner.Run( |
163 config, options, | 200 config, |
164 ['SimpleShardingTest', | 201 ['SimpleShardingTest', |
165 '--write-abbreviated-json-results-to=%s' % temp_file_name, | 202 '--write-full-results-to=%s' % temp_file_name, |
166 '--total-shards=%d' % total_shards, | 203 '--total-shards=%d' % total_shards, |
167 '--shard-index=%d' % shard_index] + opt_args) | 204 '--shard-index=%d' % shard_index] + opt_args) |
168 with open(temp_file_name) as f: | 205 with open(temp_file_name) as f: |
169 test_result = json.load(f) | 206 test_result = json.load(f) |
170 self.assertEquals(test_result['failures'], failures) | 207 actual_successes, actual_failures = self._ExtractTestResults(test_result) |
171 self.assertEquals(test_result['successes'], successes) | 208 self.assertEquals(set(actual_failures), set(failures)) |
172 self.assertEquals(test_result['valid'], True) | 209 self.assertEquals(set(actual_successes), set(successes)) |
173 finally: | 210 finally: |
174 os.remove(temp_file_name) | 211 os.remove(temp_file_name) |
175 | 212 |
176 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 213 def testShardedTestRun(self): |
177 def testShardedTestRun(self, _): | |
178 self.baseShardingTest(3, 0, [], [ | 214 self.baseShardingTest(3, 0, [], [ |
179 'Test1', | 215 'browser_tests.simple_sharding_test.SimpleShardingTest.Test1', |
180 'Test2', | 216 'browser_tests.simple_sharding_test.SimpleShardingTest.Test2', |
181 'Test3', | 217 'browser_tests.simple_sharding_test.SimpleShardingTest.Test3', |
182 'passing_test_0', | 218 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0', |
183 'passing_test_1', | 219 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1', |
184 ]) | 220 ]) |
185 self.baseShardingTest(3, 1, [], [ | 221 self.baseShardingTest(3, 1, [], [ |
186 'passing_test_2', | 222 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2', |
187 'passing_test_3', | 223 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3', |
188 'passing_test_4', | 224 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4', |
189 'passing_test_5', | 225 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5', |
190 ]) | 226 ]) |
191 self.baseShardingTest(3, 2, [], [ | 227 self.baseShardingTest(3, 2, [], [ |
192 'passing_test_6', | 228 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6', |
193 'passing_test_7', | 229 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7', |
194 'passing_test_8', | 230 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8', |
195 'passing_test_9', | 231 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9', |
196 ]) | 232 ]) |
197 | 233 |
198 def writeMockTestResultsFile(self): | 234 def writeMockTestResultsFile(self): |
199 mock_test_results = { | 235 mock_test_results = { |
200 'passes': [ | 236 'passes': [ |
201 'Test1', | 237 'Test1', |
202 'Test2', | 238 'Test2', |
203 'Test3', | 239 'Test3', |
204 'passing_test_0', | 240 'passing_test_0', |
205 'passing_test_1', | 241 'passing_test_1', |
(...skipping 24 matching lines...) Expand all Loading... |
230 'passing_test_9': 0.5, | 266 'passing_test_9': 0.5, |
231 } | 267 } |
232 } | 268 } |
233 temp_file = tempfile.NamedTemporaryFile(delete=False) | 269 temp_file = tempfile.NamedTemporaryFile(delete=False) |
234 temp_file.close() | 270 temp_file.close() |
235 temp_file_name = temp_file.name | 271 temp_file_name = temp_file.name |
236 with open(temp_file_name, 'w') as f: | 272 with open(temp_file_name, 'w') as f: |
237 json.dump(mock_test_results, f) | 273 json.dump(mock_test_results, f) |
238 return temp_file_name | 274 return temp_file_name |
239 | 275 |
240 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 276 def testSplittingShardsByTimes(self): |
241 def testSplittingShardsByTimes(self, _): | |
242 temp_file_name = self.writeMockTestResultsFile() | 277 temp_file_name = self.writeMockTestResultsFile() |
243 # It seems that the sorting order of the first four tests above is: | 278 # It seems that the sorting order of the first four tests above is: |
244 # passing_test_0, Test1, Test2, Test3 | 279 # passing_test_0, Test1, Test2, Test3 |
245 # This is probably because the relative order of the "fixed" tests | 280 # This is probably because the relative order of the "fixed" tests |
246 # (starting with "Test") and the generated ones ("passing_") is | 281 # (starting with "Test") and the generated ones ("passing_") is |
247 # not well defined, and the sorting is stable afterward. The | 282 # not well defined, and the sorting is stable afterward. The |
248 # expectations have been adjusted for this fact. | 283 # expectations have been adjusted for this fact. |
249 try: | 284 try: |
250 self.baseShardingTest( | 285 self.baseShardingTest( |
251 4, 0, [], | 286 4, 0, [], |
252 ['passing_test_0', 'passing_test_1', | 287 ['browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_0', |
253 'passing_test_5', 'passing_test_9'], | 288 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_1', |
254 temp_file_name) | 289 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_5', |
| 290 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_9' |
| 291 ], temp_file_name) |
255 self.baseShardingTest( | 292 self.baseShardingTest( |
256 4, 1, [], | 293 4, 1, [], |
257 ['Test1', 'passing_test_2', 'passing_test_6'], | 294 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test1', |
258 temp_file_name) | 295 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2', |
| 296 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6' |
| 297 ], temp_file_name) |
259 self.baseShardingTest( | 298 self.baseShardingTest( |
260 4, 2, [], | 299 4, 2, [], |
261 ['Test2', 'passing_test_3', 'passing_test_7'], | 300 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test2', |
262 temp_file_name) | 301 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_3', |
| 302 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_7' |
| 303 ], temp_file_name) |
263 self.baseShardingTest( | 304 self.baseShardingTest( |
264 4, 3, [], | 305 4, 3, [], |
265 ['Test3', 'passing_test_4', 'passing_test_8'], | 306 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test3', |
266 temp_file_name) | 307 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_4', |
| 308 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_8' |
| 309 ], temp_file_name) |
267 finally: | 310 finally: |
268 os.remove(temp_file_name) | 311 os.remove(temp_file_name) |
269 | 312 |
270 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 313 def testFilteringAfterSharding(self): |
271 def testFilteringAfterSharding(self, _): | |
272 temp_file_name = self.writeMockTestResultsFile() | 314 temp_file_name = self.writeMockTestResultsFile() |
273 try: | 315 try: |
274 self.baseShardingTest( | 316 self.baseShardingTest( |
275 4, 1, [], | 317 4, 1, [], |
276 ['Test1', 'passing_test_2', 'passing_test_6'], | 318 ['browser_tests.simple_sharding_test.SimpleShardingTest.Test1', |
277 temp_file_name, | 319 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_2', |
| 320 'browser_tests.simple_sharding_test.SimpleShardingTest.passing_test_6' |
| 321 ], temp_file_name, |
278 opt_test_filter='(Test1|passing_test_2|passing_test_6)', | 322 opt_test_filter='(Test1|passing_test_2|passing_test_6)', |
279 opt_filter_tests_after_sharding=True) | 323 opt_filter_tests_after_sharding=True) |
280 finally: | 324 finally: |
281 os.remove(temp_file_name) | 325 os.remove(temp_file_name) |
282 | 326 |
283 @mock.patch('telemetry.internal.util.binary_manager.InitDependencyManager') | 327 def testMedianComputation(self): |
284 def testMedianComputation(self, _): | 328 self.assertEquals(2.0, run_browser_tests._MedianTestTime( |
285 self.assertEquals(2.0, browser_test_runner._MedianTestTime( | |
286 {'test1': 2.0, 'test2': 7.0, 'test3': 1.0})) | 329 {'test1': 2.0, 'test2': 7.0, 'test3': 1.0})) |
287 self.assertEquals(2.0, browser_test_runner._MedianTestTime( | 330 self.assertEquals(2.0, run_browser_tests._MedianTestTime( |
288 {'test1': 2.0})) | 331 {'test1': 2.0})) |
289 self.assertEquals(0.0, browser_test_runner._MedianTestTime({})) | 332 self.assertEquals(0.0, run_browser_tests._MedianTestTime({})) |
290 self.assertEqual(4.0, browser_test_runner._MedianTestTime( | 333 self.assertEqual(4.0, run_browser_tests._MedianTestTime( |
291 {'test1': 2.0, 'test2': 6.0, 'test3': 1.0, 'test4': 8.0})) | 334 {'test1': 2.0, 'test2': 6.0, 'test3': 1.0, 'test4': 8.0})) |
292 | 335 |
293 | 336 |
294 class Algebra( | 337 class Algebra( |
295 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): | 338 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): |
296 | 339 |
297 @classmethod | 340 @classmethod |
298 def GenerateTestCases_Simple(cls, options): | 341 def GenerateTestCases_Simple(cls, options): |
299 del options # Unused. | 342 del options # Unused. |
300 yield 'testOne', (1, 2) | 343 yield 'testOne', (1, 2) |
301 yield 'testTwo', (3, 3) | 344 yield 'testTwo', (3, 3) |
302 | 345 |
303 def Simple(self, x, y): | 346 def Simple(self, x, y): |
304 self.assertEquals(x, y) | 347 self.assertEquals(x, y) |
305 | 348 |
306 def TestNumber(self): | 349 def TestNumber(self): |
307 self.assertEquals(0, 1) | 350 self.assertEquals(0, 1) |
308 | 351 |
309 | 352 |
310 class Geometric( | 353 class ErrorneousGeometric( |
311 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): | 354 serially_executed_browser_test_case.SeriallyExecutedBrowserTestCase): |
312 | 355 |
313 @classmethod | 356 @classmethod |
314 def GenerateTestCases_Compare(cls, options): | 357 def GenerateTestCases_Compare(cls, options): |
315 del options # Unused. | 358 del options # Unused. |
| 359 assert False, 'I am a problematic generator' |
316 yield 'testBasic', ('square', 'circle') | 360 yield 'testBasic', ('square', 'circle') |
317 | 361 |
318 def Compare(self, x, y): | 362 def Compare(self, x, y): |
319 self.assertEquals(x, y) | 363 self.assertEquals(x, y) |
320 | 364 |
321 def TestAngle(self): | 365 def TestAngle(self): |
322 self.assertEquals(90, 450) | 366 self.assertEquals(90, 450) |
323 | 367 |
324 class TestLoadAllTestModules(unittest.TestCase): | 368 class TestLoadAllTestModules(unittest.TestCase): |
325 # TODO(nedn): this need to be updated after | |
326 # https://codereview.chromium.org/2590623002/ is landed so that | |
327 # LoadAllTestsInModule actually return tests. | |
328 @decorators.Disabled('all') | |
329 def testLoadAllTestsInModule(self): | 369 def testLoadAllTestsInModule(self): |
330 tests = serially_executed_browser_test_case.LoadAllTestsInModule( | 370 context = browser_test_context.TypTestContext() |
331 sys.modules[__name__]) | 371 context.finder_options = options_for_unittests.GetCopy() |
332 self.assertEquals(sorted([t.id() for t in tests]), | 372 context.test_class = Algebra |
333 ['telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber', | 373 context.test_case_ids_to_run.add( |
334 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne', | 374 'telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber') |
335 'telemetry.testing.browser_test_runner_unittest.Algebra.testTwo', | 375 context.test_case_ids_to_run.add( |
336 'telemetry.testing.browser_test_runner_unittest.Geometric.TestAngle', | 376 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne') |
337 'telemetry.testing.browser_test_runner_unittest.Geometric.testBasic']) | 377 context.Freeze() |
| 378 browser_test_context._global_test_context = context |
| 379 try: |
| 380 # This should not invoke GenerateTestCases of ErrorneousGeometric class, |
| 381 # otherwise that would throw Exception. |
| 382 tests = serially_executed_browser_test_case.LoadAllTestsInModule( |
| 383 sys.modules[__name__]) |
| 384 self.assertEquals(sorted([t.id() for t in tests]), |
| 385 ['telemetry.testing.browser_test_runner_unittest.Algebra.TestNumber', |
| 386 'telemetry.testing.browser_test_runner_unittest.Algebra.testOne']) |
| 387 finally: |
| 388 browser_test_context._global_test_context = None |
OLD | NEW |