Upload upstream chromium 85.0.4183.84
[platform/framework/web/chromium-efl.git] / testing / merge_scripts / results_merger_test.py
1 #!/usr/bin/env vpython
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.
5
6 import copy
7 import os
8 import sys
9 import unittest
10
11 THIS_DIR = os.path.dirname(os.path.abspath(__file__))
12
13 # For results_merger.
14 sys.path.insert(0, os.path.join(THIS_DIR, '..', 'resources'))
15 import results_merger
16
17
18 GOOD_JSON_TEST_RESULT_0 = {
19   'tests': {
20     'car': {
21       'honda': {
22         'expected': 'PASS',
23         'actual': 'PASS'
24       },
25       'toyota': {
26         'expected': 'FAIL',
27         'actual': 'FAIL'
28       }
29     },
30     'computer': {
31       'dell': {
32         'expected': 'PASS',
33         'actual': 'PASS'
34       }
35     },
36   },
37   'interrupted': False,
38   'version': 3,
39   'seconds_since_epoch': 1406662289.76,
40   'num_failures_by_type': {
41      'FAIL': 0,
42      'PASS': 2
43   },
44   'layout_tests_dir': 'abc'
45 }
46
47 GOOD_JSON_TEST_RESULT_1 = {
48   'tests': {
49     'car': {
50       'tesla': {
51         'expected': 'PASS',
52         'actual': 'PASS'
53       },
54     },
55     'burger': {
56       'mcdonald': {
57         'expected': 'PASS',
58         'actual': 'PASS'
59       }
60     },
61   },
62   'interrupted': False,
63   'version': 3,
64   'seconds_since_epoch': 1406662283.11,
65   'num_failures_by_type': {
66      'FAIL': 0,
67      'PASS': 2
68   },
69   'layout_tests_dir': '123'
70 }
71
72 GOOD_JSON_TEST_RESULT_2 = {
73   'tests': {
74     'car': {
75       'mercedes': {
76         'expected': 'PASS',
77         'actual': 'FAIL'
78       },
79     },
80     'burger': {
81       'in n out': {
82         'expected': 'PASS',
83         'actual': 'PASS'
84       }
85     },
86   },
87   'interrupted': True,
88   'version': 3,
89   'seconds_since_epoch': 1406662200.01,
90   'num_failures_by_type': {
91      'FAIL': 1,
92      'PASS': 1
93   }
94 }
95
96 GOOD_JSON_TEST_RESULT_MERGED = {
97   'tests': {
98     'car': {
99       'tesla': {
100         'expected': 'PASS',
101         'actual': 'PASS'
102       },
103       'mercedes': {
104         'expected': 'PASS',
105         'actual': 'FAIL'
106       },
107       'honda': {
108         'expected': 'PASS',
109         'actual': 'PASS'
110       },
111       'toyota': {
112         'expected': 'FAIL',
113         'actual': 'FAIL'
114       }
115     },
116     'computer': {
117       'dell': {
118         'expected': 'PASS',
119         'actual': 'PASS'
120       }
121     },
122     'burger': {
123       'mcdonald': {
124         'expected': 'PASS',
125         'actual': 'PASS'
126       },
127       'in n out': {
128         'expected': 'PASS',
129         'actual': 'PASS'
130       }
131     }
132   },
133   'interrupted': True,
134   'version': 3,
135   'seconds_since_epoch': 1406662200.01,
136   'num_failures_by_type': {
137     'FAIL': 1,
138     'PASS': 5
139   },
140   'layout_tests_dir': '123'
141 }
142
143
144 def extend(initial, add):
145   out = copy.deepcopy(initial)
146   out.update(add)
147   return out
148
149
150 def remove(initial, keys):
151   out = copy.deepcopy(initial)
152   for k in keys:
153     del out[k]
154   return out
155
156
157
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
163
164   def test_merge_tries(self):
165     self.assertEquals(
166         {'a': 'A', 'b': {'c': 'C'}},
167         results_merger.merge_tries(
168             {'a': 'A', 'b': {}}, {'b': {'c': 'C'}}))
169
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'}})
174
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)])
181     self.assertEquals(
182         merged_results['metadata']['tags'], ['foo', 'bat'])
183
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
192       a = copy.deepcopy(j)
193       self.assertEquals(results_merger.merge_test_results([a]), j)
194       self.assertEquals(a, j)
195
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}),
200           ])
201
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}),
206           ])
207
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']),
212           ])
213
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']),
218           ])
219
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}),
224           ])
225
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}),
230           ])
231
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']),
236           ])
237
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']),
242           ])
243
244   def test_merge_json_test_results_multiple(self):
245     self.assertEquals(
246         results_merger.merge_test_results([
247             GOOD_JSON_TEST_RESULT_0,
248             GOOD_JSON_TEST_RESULT_1,
249             GOOD_JSON_TEST_RESULT_2,
250             ]),
251         GOOD_JSON_TEST_RESULT_MERGED)
252
253   def test_merge_json_test_results_optional_matches(self):
254     self.assertEquals(
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': '.'}),
259             ]),
260         extend(GOOD_JSON_TEST_RESULT_MERGED, {'path_delimiter': '.'}))
261
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': '/'}),
268           ])
269
270   def test_merge_json_test_results_optional_count(self):
271     self.assertEquals(
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}),
276             ]),
277         extend(GOOD_JSON_TEST_RESULT_MERGED, {'fixable': 6}))
278
279   def test_merge_nothing(self):
280     self.assertEquals(
281         results_merger.merge_test_results([]),
282         {})
283
284 # TODO(tansell): Make this test fail properly, currently fails with an
285 # AttributeError.
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])
291
292
293
294 if __name__ == '__main__':
295   unittest.main()  # pragma: no cover