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

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

Powered by Google App Engine
This is Rietveld 408576698