2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
11 THIS_DIR = os.path.dirname(os.path.abspath(__file__))
14 sys.path.insert(0, os.path.join(THIS_DIR, '..', 'resources'))
18 GOOD_JSON_TEST_RESULT_0 = {
39 'seconds_since_epoch': 1406662289.76,
40 'num_failures_by_type': {
44 'layout_tests_dir': 'abc'
47 GOOD_JSON_TEST_RESULT_1 = {
64 'seconds_since_epoch': 1406662283.11,
65 'num_failures_by_type': {
69 'layout_tests_dir': '123'
72 GOOD_JSON_TEST_RESULT_2 = {
89 'seconds_since_epoch': 1406662200.01,
90 'num_failures_by_type': {
96 GOOD_JSON_TEST_RESULT_MERGED = {
135 'seconds_since_epoch': 1406662200.01,
136 'num_failures_by_type': {
140 'layout_tests_dir': '123'
144 def extend(initial, add):
145 out = copy.deepcopy(initial)
150 def remove(initial, keys):
151 out = copy.deepcopy(initial)
158 # These unittests are run in PRESUBMIT, but not by recipe_simulation_test, hence
159 # to avoid false alert on missing coverage by recipe_simulation_test, we mark
160 # these code as no cover.
161 class MergingTest(unittest.TestCase): # pragma: no cover
162 maxDiff = None # Show full diff if assertion fail
164 def test_merge_tries(self):
166 {'a': 'A', 'b': {'c': 'C'}},
167 results_merger.merge_tries(
168 {'a': 'A', 'b': {}}, {'b': {'c': 'C'}}))
170 def test_merge_tries_unmergable(self):
171 with self.assertRaisesRegexp(results_merger.MergeException, "a:b"):
172 results_merger.merge_tries(
173 {'a': {'b': 'A'}}, {'a': {'b': 'C'}})
175 def test_merge_metadata(self):
176 metadata1 = {'metadata': {'tags': ['foo', 'bar']}}
177 metadata2 = {'metadata': {'tags': ['foo', 'bat']}}
178 merged_results = results_merger.merge_test_results(
179 [extend(GOOD_JSON_TEST_RESULT_0, metadata1),
180 extend(GOOD_JSON_TEST_RESULT_1, metadata2)])
182 merged_results['metadata']['tags'], ['foo', 'bat'])
184 def test_merge_json_test_results_nop(self):
185 good_json_results = (
186 GOOD_JSON_TEST_RESULT_0,
187 GOOD_JSON_TEST_RESULT_1,
188 GOOD_JSON_TEST_RESULT_2,
189 GOOD_JSON_TEST_RESULT_MERGED)
190 for j in good_json_results:
191 # Clone so we can check the input dictionaries are not modified
193 self.assertEquals(results_merger.merge_test_results([a]), j)
194 self.assertEquals(a, j)
196 def test_merge_json_test_results_invalid_version(self):
197 with self.assertRaises(results_merger.MergeException):
198 results_merger.merge_test_results([
199 extend(GOOD_JSON_TEST_RESULT_0, {'version': 5}),
202 with self.assertRaises(results_merger.MergeException):
203 results_merger.merge_test_results([
204 GOOD_JSON_TEST_RESULT_0,
205 extend(GOOD_JSON_TEST_RESULT_1, {'version': 5}),
208 def test_merge_json_test_results_missing_version(self):
209 with self.assertRaises(results_merger.MergeException):
210 results_merger.merge_test_results([
211 remove(GOOD_JSON_TEST_RESULT_0, ['version']),
214 with self.assertRaises(results_merger.MergeException):
215 results_merger.merge_test_results([
216 GOOD_JSON_TEST_RESULT_0,
217 remove(GOOD_JSON_TEST_RESULT_1, ['version']),
220 def test_merge_json_test_results_invalid_extra(self):
221 with self.assertRaises(results_merger.MergeException):
222 results_merger.merge_test_results([
223 extend(GOOD_JSON_TEST_RESULT_0, {'extra': True}),
226 with self.assertRaises(results_merger.MergeException):
227 results_merger.merge_test_results([
228 GOOD_JSON_TEST_RESULT_0,
229 extend(GOOD_JSON_TEST_RESULT_1, {'extra': True}),
232 def test_merge_json_test_results_missing_required(self):
233 with self.assertRaises(results_merger.MergeException):
234 results_merger.merge_test_results([
235 remove(GOOD_JSON_TEST_RESULT_0, ['interrupted']),
238 with self.assertRaises(results_merger.MergeException):
239 results_merger.merge_test_results([
240 GOOD_JSON_TEST_RESULT_0,
241 remove(GOOD_JSON_TEST_RESULT_1, ['interrupted']),
244 def test_merge_json_test_results_multiple(self):
246 results_merger.merge_test_results([
247 GOOD_JSON_TEST_RESULT_0,
248 GOOD_JSON_TEST_RESULT_1,
249 GOOD_JSON_TEST_RESULT_2,
251 GOOD_JSON_TEST_RESULT_MERGED)
253 def test_merge_json_test_results_optional_matches(self):
255 results_merger.merge_test_results([
256 extend(GOOD_JSON_TEST_RESULT_0, {'path_delimiter': '.'}),
257 extend(GOOD_JSON_TEST_RESULT_1, {'path_delimiter': '.'}),
258 extend(GOOD_JSON_TEST_RESULT_2, {'path_delimiter': '.'}),
260 extend(GOOD_JSON_TEST_RESULT_MERGED, {'path_delimiter': '.'}))
262 def test_merge_json_test_results_optional_differs(self):
263 with self.assertRaises(results_merger.MergeException):
264 results_merger.merge_test_results([
265 extend(GOOD_JSON_TEST_RESULT_0, {'path_delimiter': '.'}),
266 extend(GOOD_JSON_TEST_RESULT_1, {'path_delimiter': '.'}),
267 extend(GOOD_JSON_TEST_RESULT_2, {'path_delimiter': '/'}),
270 def test_merge_json_test_results_optional_count(self):
272 results_merger.merge_test_results([
273 extend(GOOD_JSON_TEST_RESULT_0, {'fixable': 1}),
274 extend(GOOD_JSON_TEST_RESULT_1, {'fixable': 2}),
275 extend(GOOD_JSON_TEST_RESULT_2, {'fixable': 3}),
277 extend(GOOD_JSON_TEST_RESULT_MERGED, {'fixable': 6}))
279 def test_merge_nothing(self):
281 results_merger.merge_test_results([]),
284 # TODO(tansell): Make this test fail properly, currently fails with an
286 # def test_merge_test_name_conflict(self):
287 # self.maxDiff = None # Show full diff if assertion fail
288 # with self.assertRaises(results_merger.MergeException):
289 # results_merger.merge_test_results(
290 # [GOOD_JSON_TEST_RESULT_0, GOOD_JSON_TEST_RESULT_0])
294 if __name__ == '__main__':
295 unittest.main() # pragma: no cover