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

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

Issue 2491473002: [Findit] Implementing swarming task error detection (Closed)
Patch Set: Rebase 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.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
1 import datetime 5 import datetime
6 import mock
2 7
3 from model import analysis_status 8 from model import analysis_status
4 from model.flake.flake_swarming_task import FlakeSwarmingTask 9 from model.flake.flake_swarming_task import FlakeSwarmingTask
5 from model.flake.master_flake_analysis import MasterFlakeAnalysis 10 from model.flake.master_flake_analysis import MasterFlakeAnalysis
6 from model.wf_swarming_task import WfSwarmingTask 11 from model.wf_swarming_task import WfSwarmingTask
7 from waterfall import swarming_util 12 from waterfall import swarming_util
8 from waterfall.process_base_swarming_task_result_pipeline import ( 13 from waterfall.process_base_swarming_task_result_pipeline import (
9 ProcessBaseSwarmingTaskResultPipeline) 14 ProcessBaseSwarmingTaskResultPipeline)
10 from waterfall.process_flake_swarming_task_result_pipeline import ( 15 from waterfall.process_flake_swarming_task_result_pipeline import (
11 ProcessFlakeSwarmingTaskResultPipeline) 16 ProcessFlakeSwarmingTaskResultPipeline)
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 'namespace': 'default-gzip', 104 'namespace': 'default-gzip',
100 'isolated': 'shard1_isolated' 105 'isolated': 'shard1_isolated'
101 }, 106 },
102 'created_ts': '2016-02-10T18:32:06.538220', 107 'created_ts': '2016-02-10T18:32:06.538220',
103 'started_ts': '2016-02-10T18:32:09.090550', 108 'started_ts': '2016-02-10T18:32:09.090550',
104 'completed_ts': '2016-02-10T18:33:09' 109 'completed_ts': '2016-02-10T18:33:09'
105 }, 110 },
106 'task_id2': { 111 'task_id2': {
107 'state': 'TIMED_OUT', 112 'state': 'TIMED_OUT',
108 'outputs_ref': None 113 'outputs_ref': None
109 } 114 },
115 'task_id3': {
116 'state': 'COMPLETED',
117 'exit_code': '2', # Swarming task failed.
118 },
110 } 119 }
111 120
112 121
113 _EXPECTED_TESTS_STATUS = { 122 _EXPECTED_TESTS_STATUS = {
114 'TestSuite1.test1': { 123 'TestSuite1.test1': {
115 'total_run': 2, 124 'total_run': 2,
116 'SUCCESS': 2 125 'SUCCESS': 2
117 }, 126 },
118 'TestSuite1.test2': { 127 'TestSuite1.test2': {
119 'total_run': 4, 128 'total_run': 4,
120 'SUCCESS': 2, 129 'SUCCESS': 2,
121 'FAILURE': 2 130 'FAILURE': 2
122 }, 131 },
123 'TestSuite1.test3': { 132 'TestSuite1.test3': {
124 'total_run': 6, 133 'total_run': 6,
125 'FAILURE': 6 134 'FAILURE': 6
126 } 135 },
127 } 136 }
128 137
129 138
130 _EXPECTED_CLASSIFIED_TESTS = { 139 _EXPECTED_CLASSIFIED_TESTS = {
131 'flaky_tests': ['TestSuite1.test2', 'TestSuite1.test1'], 140 'flaky_tests': ['TestSuite1.test2', 'TestSuite1.test1'],
132 'reliable_tests': ['TestSuite1.test3'] 141 'reliable_tests': ['TestSuite1.test3']
133 } 142 }
134 143
135 144
136 class ProcessBaseSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase): 145 class ProcessBaseSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase):
137 146
138 def _MockedGetSwarmingTaskResultById(self, task_id, _): 147 def _MockedGetSwarmingTaskResultById(self, task_id, _):
139 return _SWARMING_TASK_RESULTS[task_id] 148 return _SWARMING_TASK_RESULTS[task_id], None
149
150 def _MockedGetSwarmingTaskFailureLog(self, *_):
151 return _SAMPLE_FAILURE_LOG, None
140 152
141 def setUp(self): 153 def setUp(self):
142 super(ProcessBaseSwarmingTaskResultPipelineTest, self).setUp() 154 super(ProcessBaseSwarmingTaskResultPipelineTest, self).setUp()
143 self.pipeline = ProcessBaseSwarmingTaskResultPipeline() 155 self.pipeline = ProcessBaseSwarmingTaskResultPipeline()
144 self.master_name = 'm' 156 self.master_name = 'm'
145 self.builder_name = 'b' 157 self.builder_name = 'b'
146 self.build_number = 121 158 self.build_number = 121
147 self.step_name = 'abc_tests on platform' 159 self.step_name = 'abc_tests on platform'
148 self.test_name = 'test' 160 self.test_name = 'test'
149 self.mock(swarming_util, 'GetSwarmingTaskResultById', 161 self.mock(swarming_util, 'GetSwarmingTaskResultById',
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 self.assertEqual(self.step_name, step_name) 236 self.assertEqual(self.step_name, step_name)
225 self.assertIsNone(task_info[0]) 237 self.assertIsNone(task_info[0])
226 self.assertEqual([], task_info[1]) 238 self.assertEqual([], task_info[1])
227 239
228 task = WfSwarmingTask.Get( 240 task = WfSwarmingTask.Get(
229 self.master_name, self.builder_name, self.build_number, self.step_name) 241 self.master_name, self.builder_name, self.build_number, self.step_name)
230 242
231 self.assertEqual(analysis_status.ERROR, task.status) 243 self.assertEqual(analysis_status.ERROR, task.status)
232 self.assertEqual({}, task.tests_statuses) 244 self.assertEqual({}, task.tests_statuses)
233 self.assertEqual({}, task.classified_tests) 245 self.assertEqual({}, task.classified_tests)
246
247 @mock.patch.object(swarming_util, 'GetSwarmingTaskResultById',
248 return_value=({}, {'code': 1, 'message': 'error'}))
249 def testMonitorSwarmingTaskGetSwarmingTaskResultIdError(self, _):
250 task = WfSwarmingTask.Create(
251 self.master_name, self.builder_name,
252 self.build_number, self.step_name)
253 task.task_id = 'task_id2'
254 task.put()
255
256 pipeline = ProcessSwarmingTaskResultPipeline()
257 pipeline.run(
258 self.master_name, self.builder_name, self.build_number, self.step_name)
259
260 self.assertEqual(analysis_status.ERROR, task.status)
261 self.assertEqual(task.error, {'code': 1, 'message': 'error'})
262
263 @mock.patch.object(swarming_util, 'GetSwarmingTaskFailureLog',
264 return_value=(None, {'code': 1, 'message': 'error'}))
265 def testMonitorSwarmingTaskGetSwarmingTaskFailureLogError(self, _):
266 task = WfSwarmingTask.Create(
267 self.master_name, self.builder_name,
268 self.build_number, self.step_name)
269 task.task_id = 'task_id1'
270 task.put()
271
272 pipeline = ProcessSwarmingTaskResultPipeline()
273 pipeline.run(
274 self.master_name, self.builder_name, self.build_number, self.step_name)
275
276 self.assertEqual(analysis_status.ERROR, task.status)
277 self.assertEqual(task.error, {'code': 1, 'message': 'error'})
278
279 def testMonitorSwarmingTaskWhereTaskFailed(self):
280 task = WfSwarmingTask.Create(
281 self.master_name, self.builder_name,
282 self.build_number, self.step_name)
283 task.task_id = 'task_id3'
284 task.put()
285
286 pipeline = ProcessSwarmingTaskResultPipeline()
287 pipeline.run(
288 self.master_name, self.builder_name, self.build_number, self.step_name)
289
290 self.assertEqual(analysis_status.ERROR, task.status)
291 self.assertEqual(
292 task.error,
293 {
294 'code': swarming_util.TASK_FAILED,
295 'message': swarming_util.EXIT_CODE_DESCRIPTIONS[
296 swarming_util.TASK_FAILED]
297 })
298
299 def testProcessSwarmingTaskResultPipeline(self):
300 # End to end test.
301 self.mock(swarming_util, 'GetSwarmingTaskFailureLog',
302 self._MockedGetSwarmingTaskFailureLog)
303
304 task = WfSwarmingTask.Create(
305 self.master_name, self.builder_name,
306 self.build_number, self.step_name)
307 task.task_id = 'task_id1'
308 task.put()
309
310 pipeline = ProcessSwarmingTaskResultPipeline()
311 step_name, task_info = pipeline.run(
312 self.master_name, self.builder_name,
313 self.build_number, self.step_name)
314
315 self.assertEqual(self.step_name, step_name)
316 self.assertEqual('abc_tests', task_info[0])
317 self.assertEqual(
318 _EXPECTED_CLASSIFIED_TESTS['reliable_tests'], task_info[1])
319
320 task = WfSwarmingTask.Get(
321 self.master_name, self.builder_name, self.build_number, self.step_name)
322
323 self.assertEqual(analysis_status.COMPLETED, task.status)
324 self.assertEqual(_EXPECTED_TESTS_STATUS, task.tests_statuses)
325 self.assertEqual(
326 _EXPECTED_CLASSIFIED_TESTS, task.classified_tests)
327 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220),
328 task.created_time)
329 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550),
330 task.started_time)
331 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9),
332 task.completed_time)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698