Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Side by Side Diff: appengine/findit/waterfall/test/process_flake_swarming_task_result_pipeline_test.py

Issue 2477343003: [Findit] Refactoring monitor swarming task pipelines (Closed)
Patch Set: Addressing nit Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 datetime 5 import datetime
6 6
7 from model import analysis_status 7 from model import analysis_status
8 from model.flake.flake_swarming_task import FlakeSwarmingTask 8 from model.flake.flake_swarming_task import FlakeSwarmingTask
9 from model.flake.master_flake_analysis import MasterFlakeAnalysis 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis
10 from waterfall import swarming_util 10 from waterfall import swarming_util
11 from waterfall.process_flake_swarming_task_result_pipeline import ( 11 from waterfall.process_flake_swarming_task_result_pipeline import (
12 ProcessFlakeSwarmingTaskResultPipeline) 12 ProcessFlakeSwarmingTaskResultPipeline)
13 from waterfall.test import (
14 process_base_swarming_task_result_pipeline_test as base_test)
13 from waterfall.test import wf_testcase 15 from waterfall.test import wf_testcase
14 16
15 17
16 _ISOLATED_SERVER = 'https://isolateserver.appspot.com'
17 _ISOLATED_STORAGE_URL = 'isolateserver.storage.googleapis.com'
18 _SAMPLE_FAILURE_LOG = {
19 'per_iteration_data': [
20 {
21 'TestSuite1.test1': [
22 {
23 'status': 'SUCCESS',
24 'other_info': 'N/A'
25 }
26 ],
27 'TestSuite1.test2': [
28 {
29 'status': 'FAILURE',
30 'other_info': 'N/A'
31 },
32 {
33 'status': 'FAILURE',
34 'other_info': 'N/A'
35 },
36 {
37 'status': 'SUCCESS',
38 'other_info': 'N/A'
39 }
40 ],
41 'TestSuite1.test3': [
42 {
43 'status': 'FAILURE',
44 'other_info': 'N/A'
45 },
46 {
47 'status': 'FAILURE',
48 'other_info': 'N/A'
49 },
50 {
51 'status': 'FAILURE',
52 'other_info': 'N/A'
53 }
54 ]
55 },
56 {
57 'TestSuite1.test1': [
58 {
59 'status': 'SUCCESS',
60 'other_info': 'N/A'
61 }
62 ],
63 'TestSuite1.test2': [
64 {
65 'status': 'SUCCESS',
66 'other_info': 'N/A'
67 }
68 ],
69 'TestSuite1.test3': [
70 {
71 'status': 'FAILURE',
72 'other_info': 'N/A'
73 },
74 {
75 'status': 'FAILURE',
76 'other_info': 'N/A'
77 },
78 {
79 'status': 'FAILURE',
80 'other_info': 'N/A'
81 }
82 ]
83 }
84 ]
85 }
86 _EXPECTED_TEST_STATUS = {
87 'TestSuite1.test1': {
88 'total_run': 2,
89 'SUCCESS': 2
90 },
91 'TestSuite1.test2': {
92 'total_run': 4,
93 'SUCCESS': 2,
94 'FAILURE': 2
95 },
96 'TestSuite1.test3': {
97 'total_run': 6,
98 'FAILURE': 6
99 }
100 }
101
102
103 class ProcessFlakeSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase): 18 class ProcessFlakeSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase):
104 19
105 def _MockedGetSwarmingTaskResultById(self, task_id, _): 20 def _MockedGetSwarmingTaskResultById(self, task_id, _):
106 swarming_task_results = { 21 return base_test._SWARMING_TASK_RESULTS[task_id]
107 'task_id1': {
108 'state': 'COMPLETED',
109 'exit_code': '1',
110 'tags': [
111 'priority:25',
112 'ref_name:abc_tests'
113 ],
114 'outputs_ref': {
115 'isolatedserver': _ISOLATED_SERVER,
116 'namespace': 'default-gzip',
117 'isolated': 'shard1_isolated'
118 },
119 'created_ts': '2016-02-10T18:32:06.538220',
120 'started_ts': '2016-02-10T18:32:09.090550',
121 'completed_ts': '2016-02-10T18:33:09'
122 },
123 'task_id2': {
124 'state': 'TIMED_OUT',
125 'outputs_ref': None
126 }
127 }
128
129 mocked_result = swarming_task_results[task_id]
130 return mocked_result
131 22
132 def setUp(self): 23 def setUp(self):
133 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp() 24 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp()
134 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline() 25 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline()
135 self.master_name = 'm' 26 self.master_name = 'm'
136 self.builder_name = 'b' 27 self.builder_name = 'b'
137 self.build_number = 121 28 self.build_number = 121
138 self.step_name = 'abc_tests on platform' 29 self.step_name = 'abc_tests on platform'
139 self.test_name = 'TestSuite1.test1' 30 self.test_name = 'TestSuite1.test1'
140 self.version_number = 1 31 self.version_number = 1
141 self.mock(swarming_util, 'GetSwarmingTaskResultById', 32 self.mock(swarming_util, 'GetSwarmingTaskResultById',
142 self._MockedGetSwarmingTaskResultById) 33 self._MockedGetSwarmingTaskResultById)
143 34
144 def testCheckTestsRunStatusesNoOutPutJson(self):
145 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs(
146 self.pipeline, self.master_name, self.builder_name,
147 self.build_number, self.step_name, self.build_number,
148 self.test_name, self.version_number)
149 tests_statuses = (
150 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses(
151 self.pipeline, None, *call_params))
152 self.assertEqual({}, tests_statuses)
153
154 def testCheckTestsRunStatuses(self): 35 def testCheckTestsRunStatuses(self):
155 analysis = MasterFlakeAnalysis.Create( 36 analysis = MasterFlakeAnalysis.Create(
156 self.master_name, self.builder_name, 37 self.master_name, self.builder_name,
157 self.build_number, self.step_name, self.test_name) 38 self.build_number, self.step_name, self.test_name)
158 analysis.Save() 39 analysis.Save()
159 40
160 task = FlakeSwarmingTask.Create( 41 task = FlakeSwarmingTask.Create(
161 self.master_name, self.builder_name, 42 self.master_name, self.builder_name,
162 self.build_number, self.step_name, self.test_name) 43 self.build_number, self.step_name, self.test_name)
163 task.put() 44 task.put()
164 45
165 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( 46 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs(
166 self.pipeline, self.master_name, self.builder_name, 47 self.pipeline, self.master_name, self.builder_name,
167 self.build_number, self.step_name, self.build_number, 48 self.build_number, self.step_name, self.build_number,
168 self.test_name, self.version_number) 49 self.test_name, self.version_number)
169 50
170 tests_statuses = ( 51 tests_statuses = (
171 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( 52 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses(
172 self.pipeline, 53 self.pipeline,
173 _SAMPLE_FAILURE_LOG, *call_params)) 54 base_test._SAMPLE_FAILURE_LOG, *call_params))
174 self.assertEqual(_EXPECTED_TEST_STATUS, tests_statuses) 55 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, tests_statuses)
175 56
176 def testCheckTestsRunStatusesWhenTestDoesNotExist(self): 57 def testCheckTestsRunStatusesWhenTestDoesNotExist(self):
177 test_name = 'TestSuite1.new_test' 58 test_name = 'TestSuite1.new_test'
178 analysis = MasterFlakeAnalysis.Create( 59 analysis = MasterFlakeAnalysis.Create(
179 self.master_name, self.builder_name, 60 self.master_name, self.builder_name,
180 self.build_number, self.step_name, test_name) 61 self.build_number, self.step_name, test_name)
181 analysis.Save() 62 analysis.Save()
182 63
183 task = FlakeSwarmingTask.Create( 64 task = FlakeSwarmingTask.Create(
184 self.master_name, self.builder_name, 65 self.master_name, self.builder_name,
185 self.build_number, self.step_name, test_name) 66 self.build_number, self.step_name, test_name)
186 task.put() 67 task.put()
187 68
188 pipeline = ProcessFlakeSwarmingTaskResultPipeline() 69 pipeline = ProcessFlakeSwarmingTaskResultPipeline()
189 tests_statuses = pipeline._CheckTestsRunStatuses( 70 tests_statuses = pipeline._CheckTestsRunStatuses(
190 _SAMPLE_FAILURE_LOG, self.master_name, self.builder_name, 71 base_test._SAMPLE_FAILURE_LOG, self.master_name, self.builder_name,
191 self.build_number, self.step_name, self.build_number, test_name, 72 self.build_number, self.step_name, self.build_number, test_name,
192 self.version_number) 73 self.version_number)
193 74
194 self.assertEqual(_EXPECTED_TEST_STATUS, tests_statuses) 75 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, tests_statuses)
195 76
196 task = FlakeSwarmingTask.Get( 77 task = FlakeSwarmingTask.Get(
197 self.master_name, self.builder_name, 78 self.master_name, self.builder_name,
198 self.build_number, self.step_name, test_name) 79 self.build_number, self.step_name, test_name)
199 self.assertEqual(0, task.tries) 80 self.assertEqual(0, task.tries)
200 self.assertEqual(0, task.successes) 81 self.assertEqual(0, task.successes)
201 82
202 analysis = MasterFlakeAnalysis.GetVersion( 83 analysis = MasterFlakeAnalysis.GetVersion(
203 self.master_name, self.builder_name, 84 self.master_name, self.builder_name,
204 self.build_number, self.step_name, test_name, self.version_number) 85 self.build_number, self.step_name, test_name, self.version_number)
205 self.assertTrue(analysis.data_points[-1].pass_rate < 0) 86 self.assertTrue(analysis.data_points[-1].pass_rate < 0)
206 87
207 def _MockedGetSwarmingTaskFailureLog(self, *_): 88 def _MockedGetSwarmingTaskFailureLog(self, *_):
208 return _SAMPLE_FAILURE_LOG 89 return base_test._SAMPLE_FAILURE_LOG
209 90
210 def testProcessFlakeSwarmingTaskResultPipeline(self): 91 def testProcessFlakeSwarmingTaskResultPipeline(self):
211 92 # End to end test.
212 self.mock(swarming_util, 'GetSwarmingTaskFailureLog', 93 self.mock(swarming_util, 'GetSwarmingTaskFailureLog',
213 self._MockedGetSwarmingTaskFailureLog) 94 self._MockedGetSwarmingTaskFailureLog)
214 95
215 task = FlakeSwarmingTask.Create( 96 task = FlakeSwarmingTask.Create(
216 self.master_name, self.builder_name, 97 self.master_name, self.builder_name,
217 self.build_number, self.step_name, self.test_name) 98 self.build_number, self.step_name, self.test_name)
218 task.task_id = 'task_id1' 99 task.task_id = 'task_id1'
219 task.put() 100 task.put()
220 101
221 analysis = MasterFlakeAnalysis.Create( 102 analysis = MasterFlakeAnalysis.Create(
222 self.master_name, self.builder_name, 103 self.master_name, self.builder_name,
223 self.build_number, self.step_name, self.test_name) 104 self.build_number, self.step_name, self.test_name)
224 analysis.Save() 105 analysis.Save()
225 106
226 pipeline = ProcessFlakeSwarmingTaskResultPipeline() 107 pipeline = ProcessFlakeSwarmingTaskResultPipeline()
227 step_name, task_info = pipeline.run( 108 step_name, task_info = pipeline.run(
228 self.master_name, self.builder_name, 109 self.master_name, self.builder_name,
229 self.build_number, self.step_name, 110 self.build_number, self.step_name,
230 'task_id1', self.build_number, self.test_name, 111 'task_id1', self.build_number, self.test_name,
231 analysis.version_number) 112 analysis.version_number)
232 self.assertEqual('abc_tests', task_info) 113 self.assertEqual('abc_tests', task_info)
233 self.assertEqual(self.step_name, step_name) 114 self.assertEqual(self.step_name, step_name)
234 115
235 task = FlakeSwarmingTask.Get( 116 task = FlakeSwarmingTask.Get(
236 self.master_name, self.builder_name, self.build_number, 117 self.master_name, self.builder_name, self.build_number,
237 self.step_name, self.test_name) 118 self.step_name, self.test_name)
238 119
239 self.assertEqual(analysis_status.COMPLETED, task.status) 120 self.assertEqual(analysis_status.COMPLETED, task.status)
240 self.assertEqual(_EXPECTED_TEST_STATUS, task.tests_statuses) 121 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, task.tests_statuses)
241 122
242 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220), 123 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220),
243 task.created_time) 124 task.created_time)
244 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550), 125 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550),
245 task.started_time) 126 task.started_time)
246 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9), 127 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9),
247 task.completed_time) 128 task.completed_time)
248
249 def testProcessFlakeSwarmingTaskResultPipelineTaskNotRunning(self):
250 task = FlakeSwarmingTask.Create(
251 self.master_name, self.builder_name,
252 self.build_number, self.step_name, self.test_name)
253 task.task_id = 'task_id2'
254 task.put()
255
256 analysis = MasterFlakeAnalysis.Create(
257 self.master_name, self.builder_name,
258 self.build_number, self.step_name, self.test_name)
259 analysis.Save()
260
261 pipeline = ProcessFlakeSwarmingTaskResultPipeline()
262 step_name, task_info = pipeline.run(
263 self.master_name, self.builder_name, self.build_number, self.step_name,
264 'task_id2', self.build_number, self.test_name, analysis.version_number)
265 self.assertEqual(None, task_info)
266 self.assertEqual(self.step_name, step_name)
267
268 task = FlakeSwarmingTask.Get(
269 self.master_name, self.builder_name, self.build_number, self.step_name,
270 self.test_name)
271
272 self.assertEqual(analysis_status.ERROR, task.status)
273
274 def testProcessFlakeSwarmingTaskResultPipelineTaskTimeOut(self):
275 # Override swarming config settings to force a timeout.
276 override_swarming_settings = {
277 'task_timeout_hours': -1
278 }
279 self.UpdateUnitTestConfigSettings(
280 'swarming_settings', override_swarming_settings)
281
282 task = FlakeSwarmingTask.Create(
283 self.master_name, self.builder_name, self.build_number, self.step_name,
284 self.test_name)
285 task.task_id = 'task_id1'
286 task.put()
287
288 pipeline = ProcessFlakeSwarmingTaskResultPipeline()
289 step_name, task_info = pipeline.run(
290 self.master_name, self.builder_name, self.build_number, self.step_name,
291 'task_id1', self.build_number, self.test_name, self.version_number)
292 self.assertEqual('abc_tests', task_info)
293 self.assertEqual(self.step_name, step_name)
294
295 task = FlakeSwarmingTask.Get(
296 self.master_name, self.builder_name, self.build_number, self.step_name,
297 self.test_name)
298 self.assertEqual(analysis_status.ERROR, task.status)
299 self.assertEqual({}, task.tests_statuses)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698