fd646c8cf7a58416dd205e8ef3c565355a35c4a4
[WebKit-https.git] / WebKitTools / TestResultServer / model / jsonresults_unittest.py
1 # Copyright (C) 2010 Google Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 #     * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 #     * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer
11 # in the documentation and/or other materials provided with the
12 # distribution.
13 #     * Neither the name of Google Inc. nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 import unittest
30
31 from jsonresults import JsonResults
32
33 JSON_RESULTS_TEMPLATE = (
34     '{"Webkit":{'
35     '"allFixableCount":[[TESTDATA_COUNT]],'
36     '"buildNumbers":[[TESTDATA_BUILDNUMBERS]],'
37     '"chromeRevision":[[TESTDATA_CHROMEREVISION]],'
38     '"deferredCounts":[[TESTDATA_COUNTS]],'
39     '"fixableCount":[[TESTDATA_COUNT]],'
40     '"fixableCounts":[[TESTDATA_COUNTS]],'
41     '"secondsSinceEpoch":[[TESTDATA_TIMES]],'
42     '"tests":{[TESTDATA_TESTS]},'
43     '"webkitRevision":[[TESTDATA_WEBKITREVISION]],'
44     '"wontfixCounts":[[TESTDATA_COUNTS]]'
45     '},'
46     '"version":3'
47     '}')
48
49 JSON_RESULTS_COUNTS_TEMPLATE = (
50     '{'
51     '"C":[TESTDATA],'
52     '"F":[TESTDATA],'
53     '"I":[TESTDATA],'
54     '"O":[TESTDATA],'
55     '"P":[TESTDATA],'
56     '"T":[TESTDATA],'
57     '"X":[TESTDATA],'
58     '"Z":[TESTDATA]}')
59
60 JSON_RESULTS_TESTS_TEMPLATE = (
61     '"[TESTDATA_TEST_NAME]":{'
62     '"results":[[TESTDATA_TEST_RESULTS]],'
63     '"times":[[TESTDATA_TEST_TIMES]]}')
64
65 JSON_RESULTS_PREFIX = "ADD_RESULTS("
66 JSON_RESULTS_SUFFIX = ");"
67
68
69 class JsonResultsTest(unittest.TestCase):
70     def setUp(self):
71         self._builder = "Webkit"
72
73     def _make_test_json(self, test_data):
74         if not test_data:
75             return JSON_RESULTS_PREFIX + JSON_RESULTS_SUFFIX
76
77         (builds, tests) = test_data
78         if not builds or not tests:
79             return JSON_RESULTS_PREFIX + JSON_RESULTS_SUFFIX
80
81         json = JSON_RESULTS_TEMPLATE
82
83         counts = []
84         build_numbers = []
85         webkit_revision = []
86         chrome_revision = []
87         times = []
88         for build in builds:
89             counts.append(JSON_RESULTS_COUNTS_TEMPLATE.replace("[TESTDATA]", build))
90             build_numbers.append("1000%s" % build)
91             webkit_revision.append("2000%s" % build)
92             chrome_revision.append("3000%s" % build)
93             times.append("100000%s000" % build)
94
95         json = json.replace("[TESTDATA_COUNTS]", ",".join(counts))
96         json = json.replace("[TESTDATA_COUNT]", ",".join(builds))
97         json = json.replace("[TESTDATA_BUILDNUMBERS]", ",".join(build_numbers))
98         json = json.replace("[TESTDATA_WEBKITREVISION]", ",".join(webkit_revision))
99         json = json.replace("[TESTDATA_CHROMEREVISION]", ",".join(chrome_revision))
100         json = json.replace("[TESTDATA_TIMES]", ",".join(times))
101
102         json_tests = []
103         for test in tests:
104             t = JSON_RESULTS_TESTS_TEMPLATE.replace("[TESTDATA_TEST_NAME]", test[0])
105             t = t.replace("[TESTDATA_TEST_RESULTS]", test[1])
106             t = t.replace("[TESTDATA_TEST_TIMES]", test[2])
107             json_tests.append(t)
108
109         json = json.replace("[TESTDATA_TESTS]", ",".join(json_tests))
110
111         return JSON_RESULTS_PREFIX + json + JSON_RESULTS_SUFFIX
112
113     def _test_merge(self, aggregated_data, incremental_data, expected_data):
114         aggregated_results = self._make_test_json(aggregated_data)
115         incremental_results = self._make_test_json(incremental_data)
116         merged_results = JsonResults.merge(self._builder,
117             aggregated_results, incremental_results, sort_keys=True)
118
119         if expected_data:
120             expected_results = self._make_test_json(expected_data)
121             self.assertEquals(merged_results, expected_results)
122         else:
123             self.assertFalse(merged_results)
124
125     def test(self):
126         # Empty incremental results json.
127         # Nothing to merge.
128         self._test_merge(
129             # Aggregated results
130             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
131             # Incremental results
132             None,
133             # Expect no merge happens.
134             None)
135
136         # No actual incremental test results (only prefix and suffix) to merge.
137         # Nothing to merge.
138         self._test_merge(
139             # Aggregated results
140             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
141             # Incremental results
142             ([], []),
143             # Expected no merge happens.
144             None)
145
146         # No existing aggregated results.
147         # Merged results == new incremental results.
148         self._test_merge(
149             # Aggregated results
150             None,
151             # Incremental results
152             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
153             # Expected results
154             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]))
155
156         # Single test for single run.
157         # Incremental results has the latest build and same test results for
158         # that run.
159         # Insert the incremental results at the first place and sum number
160         # of runs for "P" (200 + 1) to get merged results.
161         self._test_merge(
162             # Aggregated results
163             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
164             # Incremental results
165             (["3"], [["001.html", "[1,\"P\"]", "[1,\"0\"]"]]),
166             # Expected results
167             (["3", "2", "1"], [["001.html", "[201,\"P\"]", "[201,\"0\"]"]]))
168
169         # Single test for single run.
170         # Incremental results has the latest build but different test results
171         # for that run.
172         # Insert the incremental results at the first place.
173         self._test_merge(
174             # Aggregated results
175             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
176             # Incremental results
177             (["3"], [["001.html", "[1, \"I\"]", "[1,\"1\"]"]]),
178             # Expected results
179             (["3", "2", "1"], [["001.html", "[1,\"I\"],[200,\"P\"]", "[1,\"1\"],[200,\"0\"]"]]))
180
181         # Single test for single run.
182         # Incremental results has the latest build but different test results
183         # for that run.
184         # The test "results" and "times" need to be continuous, so the old
185         # [10,"I"] result should be dropped because a new result of same type [1,"I"]
186         # is inserted in front of [200,"P"].
187         self._test_merge(
188             # Aggregated results
189             (["2", "1"], [["001.html", "[200,\"P\"],[10,\"I\"]", "[200,\"0\"],[10,\"1\"]"]]),
190             # Incremental results
191             (["3"], [["001.html", "[1,\"I\"]", "[1,\"1\"]"]]),
192             # Expected results
193             (["3", "2", "1"], [["001.html", "[1,\"I\"],[200,\"P\"]", "[1,\"1\"],[200,\"0\"]"]]))
194
195         # Multiple tests for single run.
196         # All tests have incremental updates.
197         self._test_merge(
198             # Aggregated results
199             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"], ["002.html", "[100,\"I\"]", "[100,\"1\"]"]]),
200             # Incremental results
201             (["3"], [["001.html", "[1,\"P\"]", "[1,\"0\"]"], ["002.html", "[1,\"I\"]", "[1,\"1\"]"]]),
202             # Expected results
203             (["3", "2", "1"], [["001.html", "[201,\"P\"]", "[201,\"0\"]"], ["002.html", "[101,\"I\"]", "[101,\"1\"]"]]))
204
205         # Multiple tests for single run.
206         # Not all tests have update.
207         self._test_merge(
208             # Aggregated results
209             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"], ["002.html", "[100,\"I\"]", "[100,\"1\"]"]]),
210             # Incremental results
211             (["3"], [["002.html", "[1,\"I\"]", "[1,\"1\"]"]]),
212             # Expected results
213             (["3", "2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"], ["002.html", "[101,\"I\"]", "[101,\"1\"]"]]))
214
215         # Single test for multiple runs.
216         self._test_merge(
217             # Aggregated results
218             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
219             # Incremental results
220             (["4", "3"], [["001.html", "[2, \"I\"]", "[2,\"2\"]"]]),
221             # Expected results
222             (["4", "3", "2", "1"], [["001.html", "[2,\"I\"],[200,\"P\"]", "[2,\"2\"],[200,\"0\"]"]]))
223
224         # Multiple tests for multiple runs.
225         self._test_merge(
226             # Aggregated results
227             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"], ["002.html", "[10,\"Z\"]", "[10,\"0\"]"]]),
228             # Incremental results
229             (["4", "3"], [["001.html", "[2, \"I\"]", "[2,\"2\"]"], ["002.html", "[1,\"C\"]", "[1,\"1\"]"]]),
230             # Expected results
231             (["4", "3", "2", "1"], [["001.html", "[2,\"I\"],[200,\"P\"]", "[2,\"2\"],[200,\"0\"]"], ["002.html", "[1,\"C\"],[10,\"Z\"]", "[1,\"1\"],[10,\"0\"]"]]))
232
233         # Test the build in incremental results is older than the most recent
234         # build in aggregated results.
235         # The incremental results should be dropped and no merge happens.
236         self._test_merge(
237             # Aggregated results
238             (["3", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
239             # Incremental results
240             (["2"], [["001.html", "[1, \"P\"]", "[1,\"0\"]"]]),
241             # Expected no merge happens.
242             None)
243
244         # Test the build in incremental results is same as the build in
245         # aggregated results.
246         # The incremental results should be dropped and no merge happens.
247         self._test_merge(
248             # Aggregated results
249             (["2", "1"], [["001.html", "[200,\"P\"]", "[200,\"0\"]"]]),
250             # Incremental results
251             (["3", "2"], [["001.html", "[2, \"P\"]", "[2,\"0\"]"]]),
252             # Expected no merge happens.
253             None)
254
255 if __name__ == '__main__':
256     unittest.main()