1 #!/usr/bin/env vpython3
2 # Copyright 2016 The Chromium Authors
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
12 THIS_DIR = os.path.dirname(os.path.abspath(__file__))
15 sys.path.insert(0, os.path.join(THIS_DIR, '..', 'resources'))
19 GOOD_JSON_TEST_RESULT_0 = {
40 'seconds_since_epoch': 1406662289.76,
41 'num_failures_by_type': {
45 'layout_tests_dir': 'abc'
48 GOOD_JSON_TEST_RESULT_1 = {
65 'seconds_since_epoch': 1406662283.11,
66 'num_failures_by_type': {
70 'layout_tests_dir': '123'
73 GOOD_JSON_TEST_RESULT_2 = {
90 'seconds_since_epoch': 1406662200.01,
91 'num_failures_by_type': {
97 GOOD_JSON_TEST_RESULT_MERGED = {
136 'seconds_since_epoch': 1406662200.01,
137 'num_failures_by_type': {
141 'layout_tests_dir': '123'
145 def extend(initial, add):
146 out = copy.deepcopy(initial)
151 def remove(initial, keys):
152 out = copy.deepcopy(initial)
159 # These unittests are run in PRESUBMIT, but not by recipe_simulation_test, hence
160 # to avoid false alert on missing coverage by recipe_simulation_test, we mark
161 # these code as no cover.
162 class MergingTest(unittest.TestCase): # pragma: no cover
163 maxDiff = None # Show full diff if assertion fail
165 def test_merge_tries(self):
167 {'a': 'A', 'b': {'c': 'C'}},
168 results_merger.merge_tries(
169 {'a': 'A', 'b': {}}, {'b': {'c': 'C'}}))
171 def test_merge_tries_unmergable(self):
172 with six.assertRaisesRegex(self, results_merger.MergeException, "a:b"):
173 results_merger.merge_tries(
174 {'a': {'b': 'A'}}, {'a': {'b': 'C'}})
176 def test_merge_metadata(self):
177 metadata1 = {'metadata': {'tags': ['foo', 'bar']}}
178 metadata2 = {'metadata': {'tags': ['foo', 'bat']}}
179 merged_results = results_merger.merge_test_results(
180 [extend(GOOD_JSON_TEST_RESULT_0, metadata1),
181 extend(GOOD_JSON_TEST_RESULT_1, metadata2)])
183 merged_results['metadata']['tags'], ['foo', 'bat'])
185 def test_merge_json_test_results_nop(self):
186 good_json_results = (
187 GOOD_JSON_TEST_RESULT_0,
188 GOOD_JSON_TEST_RESULT_1,
189 GOOD_JSON_TEST_RESULT_2,
190 GOOD_JSON_TEST_RESULT_MERGED)
191 for j in good_json_results:
192 # Clone so we can check the input dictionaries are not modified
194 self.assertEqual(results_merger.merge_test_results([a]), j)
195 self.assertEqual(a, j)
197 def test_merge_json_test_results_invalid_version(self):
198 with self.assertRaises(results_merger.MergeException):
199 results_merger.merge_test_results([
200 extend(GOOD_JSON_TEST_RESULT_0, {'version': 5}),
203 with self.assertRaises(results_merger.MergeException):
204 results_merger.merge_test_results([
205 GOOD_JSON_TEST_RESULT_0,
206 extend(GOOD_JSON_TEST_RESULT_1, {'version': 5}),
209 def test_merge_json_test_results_missing_version(self):
210 with self.assertRaises(results_merger.MergeException):
211 results_merger.merge_test_results([
212 remove(GOOD_JSON_TEST_RESULT_0, ['version']),
215 with self.assertRaises(results_merger.MergeException):
216 results_merger.merge_test_results([
217 GOOD_JSON_TEST_RESULT_0,
218 remove(GOOD_JSON_TEST_RESULT_1, ['version']),
221 def test_merge_json_test_results_invalid_extra(self):
222 with self.assertRaises(results_merger.MergeException):
223 results_merger.merge_test_results([
224 extend(GOOD_JSON_TEST_RESULT_0, {'extra': True}),
227 with self.assertRaises(results_merger.MergeException):
228 results_merger.merge_test_results([
229 GOOD_JSON_TEST_RESULT_0,
230 extend(GOOD_JSON_TEST_RESULT_1, {'extra': True}),
233 def test_merge_json_test_results_missing_required(self):
234 with self.assertRaises(results_merger.MergeException):
235 results_merger.merge_test_results([
236 remove(GOOD_JSON_TEST_RESULT_0, ['interrupted']),
239 with self.assertRaises(results_merger.MergeException):
240 results_merger.merge_test_results([
241 GOOD_JSON_TEST_RESULT_0,
242 remove(GOOD_JSON_TEST_RESULT_1, ['interrupted']),
245 def test_merge_json_test_results_multiple(self):
247 results_merger.merge_test_results([
248 GOOD_JSON_TEST_RESULT_0,
249 GOOD_JSON_TEST_RESULT_1,
250 GOOD_JSON_TEST_RESULT_2,
252 GOOD_JSON_TEST_RESULT_MERGED)
254 def test_merge_json_test_results_optional_matches(self):
256 results_merger.merge_test_results([
257 extend(GOOD_JSON_TEST_RESULT_0, {'path_delimiter': '.'}),
258 extend(GOOD_JSON_TEST_RESULT_1, {'path_delimiter': '.'}),
259 extend(GOOD_JSON_TEST_RESULT_2, {'path_delimiter': '.'}),
261 extend(GOOD_JSON_TEST_RESULT_MERGED, {'path_delimiter': '.'}))
263 def test_merge_json_test_results_optional_differs(self):
264 with self.assertRaises(results_merger.MergeException):
265 results_merger.merge_test_results([
266 extend(GOOD_JSON_TEST_RESULT_0, {'path_delimiter': '.'}),
267 extend(GOOD_JSON_TEST_RESULT_1, {'path_delimiter': '.'}),
268 extend(GOOD_JSON_TEST_RESULT_2, {'path_delimiter': '/'}),
271 def test_merge_json_test_results_optional_count(self):
273 results_merger.merge_test_results([
274 extend(GOOD_JSON_TEST_RESULT_0, {'fixable': 1}),
275 extend(GOOD_JSON_TEST_RESULT_1, {'fixable': 2}),
276 extend(GOOD_JSON_TEST_RESULT_2, {'fixable': 3}),
278 extend(GOOD_JSON_TEST_RESULT_MERGED, {'fixable': 6}))
280 def test_merge_nothing(self):
282 results_merger.merge_test_results([]),
285 # TODO(tansell): Make this test fail properly, currently fails with an
287 # def test_merge_test_name_conflict(self):
288 # self.maxDiff = None # Show full diff if assertion fail
289 # with self.assertRaises(results_merger.MergeException):
290 # results_merger.merge_test_results(
291 # [GOOD_JSON_TEST_RESULT_0, GOOD_JSON_TEST_RESULT_0])
295 if __name__ == '__main__':
296 unittest.main() # pragma: no cover