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

Side by Side Diff: appengine/findit/handlers/test/handlers_util_test.py

Issue 1827903002: [Findit] Modify handlers_util to prepare for the new UI change. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: address comments Created 4 years, 8 months 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 from testing_utils import testing 5 from testing_utils import testing
6 6
7 from handlers import result_status
7 from handlers import handlers_util 8 from handlers import handlers_util
9 from model import wf_analysis_status
8 from model.wf_analysis import WfAnalysis 10 from model.wf_analysis import WfAnalysis
9 from model import wf_analysis_status
10 from model.wf_swarming_task import WfSwarmingTask 11 from model.wf_swarming_task import WfSwarmingTask
11 from model.wf_try_job import WfTryJob 12 from model.wf_try_job import WfTryJob
12 from waterfall import buildbot 13 from waterfall import buildbot
13 from waterfall import waterfall_config 14 from waterfall import waterfall_config
14 15
15 16
16 class HandlersUtilResultTest(testing.AppengineTestCase): 17 class HandlersUtilResultTest(testing.AppengineTestCase):
17 18
18 def setUp(self): 19 def setUp(self):
19 super(HandlersUtilResultTest, self).setUp() 20 super(HandlersUtilResultTest, self).setUp()
20 self.master_name = 'm' 21 self.master_name = 'm'
21 self.builder_name = 'b' 22 self.builder_name = 'b'
22 self.build_number = 121 23 self.build_number = 121
23 24
24 def MockedGetSwarmingSettings(): 25 def MockedGetSwarmingSettings():
25 return {'server_host': 'chromium-swarm.appspot.com'} 26 return {'server_host': 'chromium-swarm.appspot.com'}
26 self.mock( 27 self.mock(
27 waterfall_config, 'GetSwarmingSettings', MockedGetSwarmingSettings) 28 waterfall_config, 'GetSwarmingSettings', MockedGetSwarmingSettings)
28 29
29 def testGenerateSwarmingTasksDataNoAnalysis(self): 30 def testGetSwarmingTaskInfoNoAnalysis(self):
30 data = handlers_util.GenerateSwarmingTasksData( 31 data = handlers_util.GetSwarmingTaskInfo(
31 self.master_name, self.builder_name, self.build_number) 32 self.master_name, self.builder_name, self.build_number)
32 33
33 self.assertEqual({}, data) 34 self.assertEqual({}, data)
34 35
35 def testGenerateSwarmingTasksDataReturnEmptyIfNoFailureMap(self): 36 def testGetSwarmingTaskInfoReturnEmptyIfNoFailureMap(self):
36 WfAnalysis.Create( 37 WfAnalysis.Create(
37 self.master_name, self.builder_name, self.build_number).put() 38 self.master_name, self.builder_name, self.build_number).put()
38 39
39 data = handlers_util.GenerateSwarmingTasksData( 40 data = handlers_util.GetSwarmingTaskInfo(
40 self.master_name, self.builder_name, self.build_number) 41 self.master_name, self.builder_name, self.build_number)
41 42
42 self.assertEqual({}, data) 43 self.assertEqual({}, data)
43 44
44 def testGenerateSwarmingTasksDataReturnEmptyIfNoSwarmingTests(self): 45 def testGetSwarmingTaskInfoNoSwarmingTasks(self):
45 analysis = WfAnalysis.Create(
46 self.master_name, self.builder_name, self.build_number)
47 analysis.failure_result_map = {
48 'step1': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
49 'step2': '%s/%s/%s' % (
50 self.master_name, self.builder_name, self.build_number)
51 }
52 analysis.put()
53
54 data = handlers_util.GenerateSwarmingTasksData(
55 self.master_name, self.builder_name, self.build_number)
56
57 self.assertEqual({}, data)
58
59 def testGenerateSwarmingTasksDataIfNoSwarmingTask(self):
60 analysis = WfAnalysis.Create( 46 analysis = WfAnalysis.Create(
61 self.master_name, self.builder_name, self.build_number) 47 self.master_name, self.builder_name, self.build_number)
62 analysis.failure_result_map = { 48 analysis.failure_result_map = {
63 'step1': { 49 'step1': {
64 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120), 50 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
65 'test2': '%s/%s/%s' % ( 51 'test2': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
66 self.master_name, self.builder_name, self.build_number) 52 'test3': '%s/%s/%s' % (self.master_name, self.builder_name, 119),
67 },
68 'step2': {
69 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120)
70 } 53 }
71 } 54 }
72 analysis.put() 55 analysis.put()
73 56
74 data = handlers_util.GenerateSwarmingTasksData( 57 data = handlers_util.GetSwarmingTaskInfo(
75 self.master_name, self.builder_name, self.build_number) 58 self.master_name, self.builder_name, self.build_number)
76 59
77 expected_data = { 60 expected_data = {
78 'step1': { 61 'step1': {
79 'swarming_tasks': [], 62 'swarming_tasks': {
80 'tests': {} 63 'm/b/119': {
81 }, 64 'task_info': {
82 'step2': { 65 'status': result_status.NO_SWARMING_TASK_FOUND
83 'swarming_tasks': [], 66 },
84 'tests': {} 67 'all_tests': ['test3']
68 },
69 'm/b/120': {
70 'task_info': {
71 'status': result_status.NO_SWARMING_TASK_FOUND
72 },
73 'all_tests': ['test1', 'test2']
74 }
75 }
85 } 76 }
86 } 77 }
78
87 self.assertEqual(expected_data, data) 79 self.assertEqual(expected_data, data)
88 80
89 def testGenerateSwarmingTasksData(self): 81 def testGetSwarmingTaskInfoReturnIfNonSwarming(self):
82 analysis = WfAnalysis.Create(
83 self.master_name, self.builder_name, self.build_number)
84 analysis.failure_result_map = {
85 'step1': '%s/%s/%s' % (self.master_name, self.builder_name, 120)
86 }
87 analysis.put()
88
89 data = handlers_util.GetSwarmingTaskInfo(
90 self.master_name, self.builder_name, self.build_number)
91
92 expected_data = {
93 'step1': {
94 'swarming_tasks': {
95 'm/b/120': {
96 'task_info': {
97 'status': result_status.NON_SWARMING_NO_RERUN
98 }
99 }
100 }
101 }
102 }
103
104 self.assertEqual(expected_data, data)
105
106 def testGetSwarmingTaskInfoIfNoSwarmingTask(self):
90 analysis = WfAnalysis.Create( 107 analysis = WfAnalysis.Create(
91 self.master_name, self.builder_name, self.build_number) 108 self.master_name, self.builder_name, self.build_number)
92 analysis.failure_result_map = { 109 analysis.failure_result_map = {
93 'step1': { 110 'step1': {
94 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120), 111 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
112 'test2': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
113 'test3': '%s/%s/%s' % (self.master_name, self.builder_name, 119),
114 }
115 }
116 analysis.put()
117
118 data = handlers_util.GetSwarmingTaskInfo(
119 self.master_name, self.builder_name, self.build_number)
120
121 expected_data = {
122 'step1': {
123 'swarming_tasks': {
124 'm/b/119': {
125 'task_info': {
126 'status': result_status.NO_SWARMING_TASK_FOUND
127 },
128 'all_tests': ['test3']
129 },
130 'm/b/120': {
131 'task_info': {
132 'status': result_status.NO_SWARMING_TASK_FOUND
133 },
134 'all_tests': ['test1', 'test2']
135 }
136 }
137 }
138 }
139 self.assertEqual(expected_data, data)
140
141 def testGetSwarmingTaskInfo(self):
142 analysis = WfAnalysis.Create(
143 self.master_name, self.builder_name, self.build_number)
144 analysis.failure_result_map = {
145 'step1 on platform': {
146 'test1': '%s/%s/%s' % (self.master_name, self.builder_name, 120),
95 'test2': '%s/%s/%s' % ( 147 'test2': '%s/%s/%s' % (
148 self.master_name, self.builder_name, self.build_number),
149 'test3': '%s/%s/%s' % (
150 self.master_name, self.builder_name, self.build_number),
151 'test4': '%s/%s/%s' % (
96 self.master_name, self.builder_name, self.build_number) 152 self.master_name, self.builder_name, self.build_number)
97 }, 153 },
98 'step2': { 154 'step2': {
99 'test1': '%s/%s/%s' % ( 155 'test1': '%s/%s/%s' % (
100 self.master_name, self.builder_name, self.build_number) 156 self.master_name, self.builder_name, self.build_number)
101 } 157 }
102 } 158 }
103 analysis.put() 159 analysis.put()
104 160
105 task0 = WfSwarmingTask.Create( 161 task0 = WfSwarmingTask.Create(
106 self.master_name, self.builder_name, 120, 'step1') 162 self.master_name, self.builder_name, 120, 'step1 on platform')
107 task0.task_id = 'task0' 163 task0.task_id = 'task0'
108 task0.status = wf_analysis_status.ANALYZED 164 task0.status = wf_analysis_status.ANALYZED
165 task0.parameters = {
166 'tests': ['test1']
167 }
168 task0.tests_statuses = {
169 'test1': {
170 'total_run': 2,
171 'FAILURE': 2
172 }
173 }
109 task0.put() 174 task0.put()
110 175
111 task1 = WfSwarmingTask.Create( 176 task1 = WfSwarmingTask.Create(
112 self.master_name, self.builder_name, self.build_number, 'step1') 177 self.master_name, self.builder_name, self.build_number,
178 'step1 on platform')
113 task1.task_id = 'task1' 179 task1.task_id = 'task1'
114 task1.status = wf_analysis_status.ANALYZED 180 task1.status = wf_analysis_status.ANALYZED
181 task1.parameters = {
182 'tests': ['test2', 'test3', 'test4']
183 }
184 task1.tests_statuses = {
185 'test2': {
186 'total_run': 2,
187 'FAILURE': 2
188 },
189 'test3': {
190 'total_run': 4,
191 'SUCCESS': 2,
192 'FAILURE': 2
193 },
194 'test4': {
195 'total_run': 6,
196 'SUCCESS': 6
197 }
198 }
115 task1.put() 199 task1.put()
116 200
117 task2 = WfSwarmingTask.Create( 201 task2 = WfSwarmingTask.Create(
118 self.master_name, self.builder_name, self.build_number, 'step2') 202 self.master_name, self.builder_name, self.build_number, 'step2')
119 task2.put() 203 task2.put()
120 204
121 data = handlers_util.GenerateSwarmingTasksData( 205 data = handlers_util.GetSwarmingTaskInfo(
122 self.master_name, self.builder_name, self.build_number) 206 self.master_name, self.builder_name, self.build_number)
123 207
124 expected_data = { 208 expected_data = {
125 'step1': { 209 'step1 on platform': {
126 'swarming_tasks': [ 210 'swarming_tasks': {
127 { 211 'm/b/121': {
128 'status': 'Completed', 212 'task_info': {
129 'task_id': 'task1', 213 'status': wf_analysis_status.ANALYZED,
130 'task_url': ( 214 'task_id': 'task1',
131 'https://chromium-swarm.appspot.com/user/task/task1'), 215 'task_url': ('https://chromium-swarm.appspot.com/user'
132 'tests': ['test2'] 216 '/task/task1')
217 },
218 'all_tests': ['test2', 'test3', 'test4'],
219 'reliable_tests': ['test2'],
220 'flaky_tests': ['test3', 'test4'],
221 'ref_name': 'step1'
133 }, 222 },
134 { 223 'm/b/120': {
135 'status': 'Completed', 224 'task_info': {
136 'task_id': 'task0', 225 'status': wf_analysis_status.ANALYZED,
137 'task_url': (
138 'https://chromium-swarm.appspot.com/user/task/task0'),
139 'tests': ['test1']
140 }
141 ],
142 'tests': {
143 'test1': {
144 'status': 'Completed',
145 'task_id': 'task0', 226 'task_id': 'task0',
146 'task_url': ( 227 'task_url': (
147 'https://chromium-swarm.appspot.com/user/task/task0') 228 'https://chromium-swarm.appspot.com/user/task/task0')
148 }, 229 },
149 'test2': { 230 'all_tests': ['test1'],
150 'status': 'Completed', 231 'reliable_tests': ['test1'],
151 'task_id': 'task1', 232 'flaky_tests': [],
152 'task_url': ( 233 'ref_name': 'step1'
153 'https://chromium-swarm.appspot.com/user/task/task1')
154 } 234 }
155 } 235 }
156 }, 236 },
157 'step2': { 237 'step2': {
158 'swarming_tasks': [ 238 'swarming_tasks': {
159 { 239 'm/b/121': {
160 'status': 'Pending', 240 'task_info': {
161 'tests': ['test1'] 241 'status': wf_analysis_status.PENDING
162 } 242 },
163 ], 243 'all_tests': ['test1'],
164 'tests': { 244 'ref_name': 'step2'
165 'test1': {
166 'status': 'Pending'
167 } 245 }
168 } 246 }
169 } 247 }
170 } 248 }
171 self.assertEqual(expected_data, data) 249 self.assertEqual(expected_data, data)
172 250
173 def testGetAllTryJobResultsNoAnalysis(self): 251 def testGetAllTryJobResultsNoAnalysis(self):
174 data = handlers_util.GetAllTryJobResults( 252 data = handlers_util.GetAllTryJobResults(
175 self.master_name, self.builder_name, self.build_number) 253 self.master_name, self.builder_name, self.build_number)
176 254
177 self.assertEqual({}, data) 255 self.assertEqual({}, data)
178 256
179 def testGetTryJobResultReturnNoneIfNoFailureResultMap(self): 257 def testGetTryJobResultReturnNoneIfNoFailureResultMap(self):
180 analysis = WfAnalysis.Create( 258 analysis = WfAnalysis.Create(
181 self.master_name, self.builder_name, self.build_number) 259 self.master_name, self.builder_name, self.build_number)
182 analysis.put() 260 analysis.put()
183 261
184 result = handlers_util.GetAllTryJobResults( 262 result = handlers_util.GetAllTryJobResults(
185 self.master_name, self.builder_name, self.build_number) 263 self.master_name, self.builder_name, self.build_number)
186 264
187 self.assertEqual({}, result) 265 self.assertEqual({}, result)
188 266
189 def testGetTryJobResultReturnNoneIfNoTryJob(self): 267 def testGetTryJobResultReturnNoneIfNoFailureResultMapWithResult(self):
190 analysis = WfAnalysis.Create( 268 analysis = WfAnalysis.Create(
191 self.master_name, self.builder_name, self.build_number) 269 self.master_name, self.builder_name, self.build_number)
192 analysis.failure_result_map = { 270 analysis.result = {
193 'compile': 'm/b/121' 271 'failures': [
272 {
273 'step_name': 'a',
274 'first_failure': 121,
275 'last_pass': 120,
276 'supported': True,
277 'suspected_cls': [],
278 'tests': [
279 {
280 'test_name': 'Unittest1.Subtest1',
281 'first_failure': 121,
282 'last_pass': 120,
283 'suspected_cls': []
284 }
285 ]
286 }
287 ]
194 } 288 }
195 analysis.put() 289 analysis.put()
196 290
197 result = handlers_util.GetAllTryJobResults( 291 result = handlers_util.GetAllTryJobResults(
198 self.master_name, self.builder_name, self.build_number) 292 self.master_name, self.builder_name, self.build_number)
199 293
200 expected_result = { 294 expected_result = {
295 'a': {
296 'try_jobs': [
297 {
298 'status': result_status.NO_FAILURE_RESULT_MAP,
299 'tests': ['Unittest1.Subtest1']
300 }
301 ]
302 }
303 }
304 self.assertEqual(expected_result, result)
305
306 def testGetTryJobResultForCompileReturnNoneIfNoTryJob(self):
307 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
308
309 self.assertEqual({}, result)
310
311 def testGetTryJobResultForCompileOnlyReturnStatusNoResult(self):
312 WfTryJob.Create(
313 self.master_name, self.builder_name, self.build_number).put()
314
315 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
316
317 expected_result = {
201 'compile': { 318 'compile': {
202 'step_name': 'compile', 319 'try_jobs': [
203 'test_name': 'N/A', 320 {
204 'try_job_key': 'm/b/121' 321 'try_job_key': 'm/b/121',
322 'status': wf_analysis_status.PENDING
323 }
324 ]
205 } 325 }
206 } 326 }
207 327
208 self.assertEqual(expected_result, result) 328 self.assertEqual(expected_result, result)
209 329
210 def testGetTryJobResultOnlyReturnStatusIfPending(self): 330 def testGetTryJobResultForCompileOnlyReturnStatusIfPending(self):
211 analysis = WfAnalysis.Create(
212 self.master_name, self.builder_name, self.build_number)
213 analysis.failure_result_map = {
214 'compile': 'm/b/121'
215 }
216 analysis.put()
217
218 try_job = WfTryJob.Create( 331 try_job = WfTryJob.Create(
219 self.master_name, self.builder_name, self.build_number) 332 self.master_name, self.builder_name, self.build_number)
333 try_job.compile_results.append({'try_job_id': 'try_job_id'})
220 try_job.put() 334 try_job.put()
221 335
222 result = handlers_util.GetAllTryJobResults( 336 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
223 self.master_name, self.builder_name, self.build_number)
224 337
225 expected_result = { 338 expected_result = {
226 'compile': { 339 'compile': {
227 'step_name': 'compile', 340 'try_jobs': [
228 'test_name': 'N/A', 341 {
229 'try_job_key': 'm/b/121', 342 'try_job_key': 'm/b/121',
230 'status': 'Pending' 343 'status': wf_analysis_status.PENDING
344 }
345 ]
231 } 346 }
232 } 347 }
233 348
234 self.assertEqual(expected_result, result) 349 self.assertEqual(expected_result, result)
235 350
236 def testGetTryJobResultOnlyReturnUrlIfStarts(self): 351 def testGetTryJobResultForCompileOnlyReturnUrlIfStarts(self):
237 analysis = WfAnalysis.Create(
238 self.master_name, self.builder_name, self.build_number)
239 analysis.failure_result_map = {
240 'compile': 'm/b/121'
241 }
242 analysis.put()
243
244 try_job = WfTryJob.Create( 352 try_job = WfTryJob.Create(
245 self.master_name, self.builder_name, self.build_number) 353 self.master_name, self.builder_name, self.build_number)
246 try_job.status = wf_analysis_status.ANALYZING 354 try_job.status = wf_analysis_status.ANALYZING
247 try_job.compile_results = [ 355 try_job.compile_results = [
248 { 356 {
249 'result': None, 357 'result': None,
250 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 358 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/'
251 'builders/linux_chromium_variable/builds/121') 359 'builders/linux_chromium_variable/builds/121')
252 } 360 }
253 ] 361 ]
254 try_job.put() 362 try_job.put()
255 363
256 result = handlers_util.GetAllTryJobResults( 364 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
257 self.master_name, self.builder_name, self.build_number)
258 365
259 expected_result = { 366 expected_result = {
260 'compile': { 367 'compile': {
261 'step_name': 'compile', 368 'try_jobs': [
262 'test_name': 'N/A', 369 {
263 'try_job_key': 'm/b/121', 370 'try_job_key': 'm/b/121',
264 'status': 'Running', 371 'status': wf_analysis_status.ANALYZING,
265 'try_job_build_number': 121, 372 'try_job_build_number': 121,
266 'try_job_url': ('http://build.chromium.org/p/tryserver.chromium.' 373 'try_job_url': (
267 'linux/builders/linux_chromium_variable/builds/121') 374 'http://build.chromium.org/p/tryserver.chromium.'
375 'linux/builders/linux_chromium_variable/builds/121')
376 }
377 ]
268 } 378 }
269 } 379 }
270 self.assertEqual(expected_result, result) 380 self.assertEqual(expected_result, result)
271 381
272 def testGetTryJobResultOnlyReturnStatusIfError(self): 382 def testGetTryJobResultForCompileOnlyReturnStatusIfError(self):
273 analysis = WfAnalysis.Create(
274 self.master_name, self.builder_name, self.build_number)
275 analysis.failure_result_map = {
276 'compile': 'm/b/121'
277 }
278 analysis.put()
279
280 try_job = WfTryJob.Create( 383 try_job = WfTryJob.Create(
281 self.master_name, self.builder_name, self.build_number) 384 self.master_name, self.builder_name, self.build_number)
282 try_job.status = wf_analysis_status.ERROR 385 try_job.status = wf_analysis_status.ERROR
283 try_job.compile_results = [ 386 try_job.compile_results = [
284 { 387 {
285 'try_job_id': '1' 388 'try_job_id': '1'
286 } 389 }
287 ] 390 ]
288 try_job.put() 391 try_job.put()
289 392
290 result = handlers_util.GetAllTryJobResults( 393 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
291 self.master_name, self.builder_name, self.build_number)
292 394
293 expected_result = { 395 expected_result = {
294 'compile': { 396 'compile': {
295 'step_name': 'compile', 397 'try_jobs': [
296 'test_name': 'N/A', 398 {
297 'try_job_key': 'm/b/121', 399 'try_job_key': 'm/b/121',
298 'status': 'Error' 400 'status': wf_analysis_status.ERROR
401 }
402 ]
299 } 403 }
300 } 404 }
301 405
302 self.assertEqual(expected_result, result) 406 self.assertEqual(expected_result, result)
303 407
304 def testGetTryJobResultWhenTryJobCompleted(self): 408 def testGetTryJobResultWhenTryJobCompleted(self):
305 analysis = WfAnalysis.Create( 409 analysis = WfAnalysis.Create(
306 self.master_name, self.builder_name, self.build_number) 410 self.master_name, self.builder_name, self.build_number)
307 analysis.failure_result_map = { 411 analysis.failure_result_map = {
308 'compile': 'm/b/121' 412 'compile': 'm/b/121'
309 } 413 }
310 analysis.put() 414 analysis.put()
311 415
312 try_job = WfTryJob.Create( 416 try_job = WfTryJob.Create(
313 self.master_name, self.builder_name, self.build_number) 417 self.master_name, self.builder_name, self.build_number)
314 try_job.status = wf_analysis_status.ANALYZED 418 try_job.status = wf_analysis_status.ANALYZED
315 try_job.compile_results = [ 419 try_job.compile_results = [
316 { 420 {
317 'result': [ 421 'report': {
318 ['rev1', 'passed'], 422 'result': {
319 ['rev2', 'failed'] 423 'rev1': 'passed',
320 ], 424 'rev2': 'failed'
321 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 425 }
322 'builders/linux_chromium_variable/builds/121'), 426 },
323 'try_job_id': '1', 427 'try_job_id': 'm/b/121',
428 'url': ('http://build.chromium.org/p/tryserver.chromium.'
429 'linux/builders/linux_chromium_variable/builds/121'),
324 'culprit': { 430 'culprit': {
325 'compile': { 431 'compile': {
326 'revision': 'rev2', 432 'revision': 'rev2',
327 'commit_position': '2', 433 'commit_position': '2',
328 'review_url': 'url_2' 434 'review_url': 'url_2'
329 } 435 }
330 } 436 }
331 } 437 }
332 ] 438 ]
333 try_job.put() 439 try_job.put()
334 440
335 result = handlers_util.GetAllTryJobResults( 441 result = handlers_util.GetAllTryJobResults(
336 self.master_name, self.builder_name, self.build_number) 442 self.master_name, self.builder_name, self.build_number)
337 443
338 expected_result = { 444 expected_result = {
339 'compile': { 445 'compile': {
340 'step_name': 'compile', 446 'try_jobs': [
341 'test_name': 'N/A', 447 {
342 'try_job_key': 'm/b/121', 448 'try_job_key': 'm/b/121',
343 'try_job_build_number': 121, 449 'status': wf_analysis_status.ANALYZED,
344 'status': 'Completed', 450 'try_job_build_number': 121,
345 'try_job_url': ( 451 'try_job_url': (
346 'http://build.chromium.org/p/tryserver.chromium.linux/' 452 'http://build.chromium.org/p/tryserver.chromium.'
347 'builders/linux_chromium_variable/builds/121'), 453 'linux/builders/linux_chromium_variable/builds/121'),
348 'revision': 'rev2', 454 'culprit': {
349 'commit_position': '2', 455 'revision': 'rev2',
350 'review_url': 'url_2' 456 'commit_position': '2',
457 'review_url': 'url_2'
458 }
459 }
460 ]
351 } 461 }
352 } 462 }
353 463
354 self.assertEqual(expected_result, result) 464 self.assertEqual(expected_result, result)
355 465
356 def testGetTryJobResultWhenTryJobCompletedAllPassed(self): 466 def testGetTryJobResultWhenTryJobCompletedAllPassed(self):
357 analysis = WfAnalysis.Create( 467 analysis = WfAnalysis.Create(
358 self.master_name, self.builder_name, self.build_number) 468 self.master_name, self.builder_name, self.build_number)
359 analysis.failure_result_map = { 469 analysis.failure_result_map = {
360 'compile': 'm/b/121' 470 'compile': 'm/b/121'
361 } 471 }
362 analysis.put() 472 analysis.put()
363 473
364 try_job = WfTryJob.Create( 474 try_job = WfTryJob.Create(
365 self.master_name, self.builder_name, self.build_number) 475 self.master_name, self.builder_name, self.build_number)
366 try_job.status = wf_analysis_status.ANALYZED 476 try_job.status = wf_analysis_status.ANALYZED
367 try_job.compile_results = [ 477 try_job.compile_results = [
368 { 478 {
369 'result': [ 479 'report': {
370 ['rev1', 'passed'], 480 'result': {
371 ['rev2', 'passed'] 481 'rev1': 'passed',
372 ], 482 'rev2': 'failed'
483 },
484 },
373 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 485 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/'
374 'builders/linux_chromium_variable/builds/121') 486 'builders/linux_chromium_variable/builds/121')
375 } 487 }
376 ] 488 ]
377 try_job.put() 489 try_job.put()
378 490
379 result = handlers_util.GetAllTryJobResults( 491 result = handlers_util.GetAllTryJobResults(
380 self.master_name, self.builder_name, self.build_number) 492 self.master_name, self.builder_name, self.build_number)
381 493
382 expected_result = { 494 expected_result = {
383 'compile': { 495 'compile': {
384 'step_name': 'compile', 496 'try_jobs': [
385 'test_name': 'N/A', 497 {
386 'try_job_key': 'm/b/121', 498 'try_job_key': 'm/b/121',
387 'try_job_build_number': 121, 499 'status': wf_analysis_status.ANALYZED,
388 'status': 'Completed', 500 'try_job_build_number': 121,
389 'try_job_url': ( 501 'try_job_url': (
390 'http://build.chromium.org/p/tryserver.chromium.linux/' 502 'http://build.chromium.org/p/tryserver.chromium.'
391 'builders/linux_chromium_variable/builds/121') 503 'linux/builders/linux_chromium_variable/builds/121')
504 }
505 ]
392 } 506 }
393 } 507 }
394 508
395 self.assertEqual(expected_result, result) 509 self.assertEqual(expected_result, result)
396 510
397 def testGetTryJobResultWhenTryJobForTestCompleted(self): 511 def testGetAllTryJobResultsTestFailureNoTaskInfo(self):
398 analysis = WfAnalysis.Create( 512 analysis = WfAnalysis.Create(
399 self.master_name, self.builder_name, self.build_number) 513 self.master_name, self.builder_name, self.build_number)
400 analysis.failure_result_map = { 514 analysis.failure_result_map = {
401 'a_test on platform': { 515 'step1': {
402 'a_test1': 'm/b/121', 516 'test1': 'm/b/118'
403 'a_test2': 'm/b/121', 517 }
404 'a_test3': 'm/b/120',
405 'a_test4': 'm/b/121'
406 },
407 'b_test_on_platform': {
408 'b_test1': 'm/b/121'
409 },
410 'c_test': 'm/b/121',
411 'd_test': 'm/b/122'
412 } 518 }
413 analysis.put() 519 analysis.put()
414 520
415 task_120_a = WfSwarmingTask.Create( 521 result = handlers_util.GetAllTryJobResults(
416 self.master_name, self.builder_name, 120, 'a_test on platform') 522 self.master_name, self.builder_name, self.build_number)
417 task_120_a.tests_statuses = { 523
418 'a_test3': { 524 expected_result = {
419 'total_run': 1, 525 'step1':{
420 'FAILURE': 1 526 'try_jobs': [
421 } 527 {
422 } 528 'try_job_key': 'm/b/118',
423 task_120_a.put() 529 'status': (
424 530 result_status.NO_TRY_JOB_REASON_MAP.get(
425 task_121_a = WfSwarmingTask.Create( 531 result_status.NO_SWARMING_TASK_FOUND)),
426 self.master_name, self.builder_name, self.build_number, 532 'tests': ['test1']
427 'a_test on platform') 533 }
428 task_121_a.tests_statuses = { 534 ]
429 'a_test1': { 535 }
430 'total_run': 1, 536 }
431 'FAILURE': 1 537
432 }, 538 self.assertEqual(expected_result, result)
433 'a_test2': { 539
434 'total_run': 1, 540 def testGetAllTryJobResultsForTestNonSwarming(self):
435 'FAILURE': 1 541 tasks_info = {
436 }, 542 'step1': {
437 'a_test4': { 543 'swarming_tasks': {
438 'total_run': 1, 544 'm/b/119': {
439 'SUCCESS': 1 545 'task_info': {
440 } 546 'status': result_status.NON_SWARMING_NO_RERUN
441 } 547 },
442 task_121_a.put() 548 'all_tests': ['test1']
443 549 },
444 task_121_b = WfSwarmingTask.Create( 550 }
445 self.master_name, self.builder_name, self.build_number, 551 }
446 'b_test_on_platform') 552 }
447 task_121_b.tests_statuses = { 553 result = handlers_util._GetAllTryJobResultsForTest(
448 'b_test1': { 554 {'step1': 'm/b/119'}, tasks_info)
449 'total_run': 1, 555
450 'SUCCESS': 1 556 expected_result = {
451 } 557 'step1': {
452 } 558 'try_jobs': [
453 task_121_b.parameters = { 559 {
454 'ref_name': 'b_test' 560 'try_job_key': 'm/b/119',
455 } 561 'status': result_status.NO_TRY_JOB_REASON_MAP.get(
456 task_121_b.put() 562 result_status.NON_SWARMING_NO_RERUN),
457 563 'tests': ['test1']
458 try_job_120 = WfTryJob.Create( 564 }
459 self.master_name, self.builder_name, 120) 565 ]
460 try_job_120.status = wf_analysis_status.ANALYZED 566 }
461 try_job_120.test_results = [ 567 }
568 self.assertEqual(expected_result, result)
569
570 def testGetAllTryJobResultsForTestNoSwarmingTaskInfo(self):
571 failure_result_map = {
572 'step1': {
573 'test3': 'm/b/119'
574 }
575 }
576
577 tasks_info = {}
578
579 result = handlers_util._GetAllTryJobResultsForTest(
580 failure_result_map, tasks_info)
581
582 self.assertEqual({}, result)
583
584 def testGetAllTryJobResultsForTestSwarmingTaskNotComplete(self):
585 failure_result_map = {
586 'step1': {
587 'test1': 'm/b/118',
588 'test3': 'm/b/119'
589 }
590 }
591
592 tasks_info = {
593 'step1': {
594 'swarming_tasks': {
595 'm/b/118': {
596 'task_info': {
597 'status': wf_analysis_status.PENDING
598 },
599 'all_tests': ['test1']
600 },
601 'm/b/119': {
602 'task_info': {
603 'status': wf_analysis_status.ANALYZING,
604 'task_id': 'task3',
605 'task_url': 'task3_url'
606 },
607 'all_tests': ['test3']
608 }
609 }
610 }
611 }
612
613 result = handlers_util._GetAllTryJobResultsForTest(
614 failure_result_map, tasks_info)
615
616 expected_result = {
617 'step1':{
618 'try_jobs': [
619 {
620 'try_job_key': 'm/b/118',
621 'status': result_status.NO_TRY_JOB_REASON_MAP[
622 wf_analysis_status.PENDING],
623 'tests': ['test1']
624 },
625 {
626 'try_job_key': 'm/b/119',
627 'status': result_status.NO_TRY_JOB_REASON_MAP[
628 wf_analysis_status.ANALYZING],
629 'task_id': 'task3',
630 'task_url': 'task3_url',
631 'tests': ['test3']
632 }
633 ]
634 }
635 }
636 self.assertEqual(expected_result, result)
637
638 def testUpdateTryJobInfoBasedOnSwarmingAllFlaky(self):
639 step_tasks_info = {
640 'swarming_tasks': {
641 'm/b/119': {
642 'task_info': {
643 'status': wf_analysis_status.ANALYZED,
644 'task_id': 'task1',
645 'task_url': 'task_url'
646 },
647 'all_tests': ['test2', 'test3'],
648 'reliable_tests': [],
649 'flaky_tests': ['test2', 'test3'],
650 'ref_name': 'step1'
651 }
652 }
653 }
654
655 try_jobs = [
462 { 656 {
463 'result': { 657 'try_job_key': 'm/b/119'
464 'rev0': { 658 }
465 'a_test': { 659 ]
466 'status': 'failed', 660
467 'valid': True, 661 handlers_util._UpdateTryJobInfoBasedOnSwarming(
468 'failures': ['a_test3'] 662 step_tasks_info, try_jobs)
469 } 663
470 } 664 expected_try_jobs = [
471 }, 665 {
472 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 666 'try_job_key': 'm/b/119',
473 'builders/linux_chromium_variable/builds/120'), 667 'ref_name': 'step1',
474 'try_job_id': '0', 668 'tests': ['test2', 'test3'],
475 'culprit': { 669 'status': result_status.FLAKY,
476 'a_test': { 670 'task_id': 'task1',
477 'tests': { 671 'task_url': 'task_url'
478 'a_test3': { 672 }
479 'revision': 'rev0', 673 ]
480 'commit_position': '0', 674 self.assertEqual(expected_try_jobs, try_jobs)
481 'review_url': 'url_0' 675
676 def testGetAllTryJobResultsForTestHasCulprit(self):
677 failure_result_map = {
678 'step1 on platform': {
679 'test3': 'm/b/119'
680 }
681 }
682
683 tasks_info = {
684 'step1 on platform': {
685 'swarming_tasks': {
686 'm/b/119': {
687 'task_info': {
688 'status': wf_analysis_status.ANALYZED,
689 'task_id': 'task1',
690 'task_url': ('https://chromium-swarm.appspot.com/user'
691 '/task/task1')
692 },
693 'all_tests': ['test3'],
694 'reliable_tests': ['test3'],
695 'flaky_tests': [],
696 'ref_name': 'step1'
697 }
698 }
699 }
700 }
701
702 try_job = WfTryJob.Create('m', 'b', 119)
703 try_job.status = wf_analysis_status.ANALYZED
704 try_job.test_results = [
705 {
706 'report': {
707 'result': {
708 'rev1': {
709 'step1': {
710 'status': 'passed',
711 'valid': True
712 }
713 },
714 'rev2': {
715 'step1': {
716 'status': 'failed',
717 'valid': True,
718 'failures': ['test3']
482 } 719 }
483 } 720 }
484 } 721 }
485 }
486 }
487 ]
488 try_job_120.put()
489
490 try_job_121 = WfTryJob.Create(
491 self.master_name, self.builder_name, self.build_number)
492 try_job_121.status = wf_analysis_status.ANALYZED
493 try_job_121.test_results = [
494 {
495 'result': {
496 'rev1': {
497 'a_test': {
498 'status': 'failed',
499 'valid': True,
500 'failures': ['a_test1']
501 },
502 'c_test': {
503 'status': 'passed',
504 'valid': True
505 }
506 },
507 'rev2': {
508 'a_test': {
509 'status': 'failed',
510 'valid': True,
511 'failures': ['a_test1']
512 },
513 'c_test': {
514 'status': 'failed',
515 'valid': True,
516 'failures': []
517 }
518 }
519 }, 722 },
520 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 723 'url': ('http://build.chromium.org/p/tryserver.chromium.'
521 'builders/linux_chromium_variable/builds/121'), 724 'linux/builders/linux_chromium_variable/builds/121'),
522 'try_job_id': '1', 725 'try_job_id': 'try_job_id',
523 'culprit': { 726 'culprit': {
524 'a_test': { 727 'step1': {
525 'tests': { 728 'tests': {
526 'a_test1': { 729 'test3': {
527 'revision': 'rev1', 730 'revision': 'rev2',
528 'commit_position': '1', 731 'commit_position': '2',
529 'review_url': 'url_1' 732 'review_url': 'url_2'
530 } 733 }
531 } 734 }
532 },
533 'c_test': {
534 'revision': 'rev2',
535 'commit_position': '2',
536 'review_url': 'url_2',
537 'tests': {}
538 } 735 }
539 } 736 }
540 } 737 }
541 ] 738 ]
542 try_job_121.put() 739 try_job.put()
543 740
544 try_job_122 = WfTryJob.Create( 741 result = handlers_util._GetAllTryJobResultsForTest(
545 self.master_name, self.builder_name, 122) 742 failure_result_map, tasks_info)
546 try_job_122.status = wf_analysis_status.ANALYZED 743
547 try_job_122.test_results = [ 744 expected_result = {
745 'step1 on platform':{
746 'try_jobs': [
747 {
748 'ref_name': 'step1',
749 'try_job_key': 'm/b/119',
750 'status': wf_analysis_status.ANALYZED,
751 'try_job_url': (
752 'http://build.chromium.org/p/tryserver.chromium.'
753 'linux/builders/linux_chromium_variable/builds/121'),
754 'try_job_build_number': 121,
755 'culprit': {
756 'revision': 'rev2',
757 'commit_position': '2',
758 'review_url': 'url_2'
759 },
760 'task_id': 'task1',
761 'task_url': ('https://chromium-swarm.appspot.com/user'
762 '/task/task1'),
763 'tests': ['test3']
764 }
765 ]
766 }
767 }
768 self.assertEqual(expected_result, result)
769
770 def testGetAllTryJobResultsForTest(self):
771 failure_result_map = {
772 'step1 on platform': {
773 'test1': 'm/b/118',
774 'test2': 'm/b/119',
775 'test3': 'm/b/119',
776 'test4': 'm/b/119'
777 }
778 }
779
780 tasks_info = {
781 'step1 on platform': {
782 'swarming_tasks': {
783 'm/b/119': {
784 'task_info': {
785 'status': wf_analysis_status.ANALYZED,
786 'task_id': 'task1',
787 'task_url': 'url/task1'
788 },
789 'all_tests': ['test2', 'test3', 'test4'],
790 'reliable_tests': ['test2', 'test3'],
791 'flaky_tests': ['test4'],
792 'ref_name': 'step1'
793 },
794 'm/b/118': {
795 'task_info': {
796 'status': result_status.NO_SWARMING_TASK_FOUND
797 },
798 'all_tests': ['test1']
799 }
800 }
801 }
802 }
803
804 try_job = WfTryJob.Create('m', 'b', 119)
805 try_job.status = wf_analysis_status.ANALYZED
806 try_job.test_results = [
548 { 807 {
549 'result': { 808 'report': {
550 'rev3': { 809 'result': {
551 'd_test': { 810 'rev1': {
552 'status': 'passed', 811 'step1': {
553 'valid': True, 812 'status': 'passed',
554 'failures': [] 813 'valid': True
814 }
815 },
816 'rev2': {
817 'step1': {
818 'status': 'failed',
819 'valid': True,
820 'failures': ['test2']
821 }
555 } 822 }
556 } 823 }
557 }, 824 },
558 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 825 'url': ('http://build.chromium.org/p/tryserver.chromium.'
559 'builders/linux_chromium_variable/builds/122'), 826 'linux/builders/linux_chromium_variable/builds/121'),
560 'try_job_id': '2' 827 'try_job_id': 'try_job_id',
828 'culprit': {
829 'step1': {
830 'tests': {
831 'test2': {
832 'revision': 'rev2',
833 'commit_position': '2',
834 'review_url': 'url_2'
835 }
836 }
837 }
838 }
561 } 839 }
562 ] 840 ]
563 try_job_122.put() 841 try_job.put()
564 842
565 result = handlers_util.GetAllTryJobResults( 843 result = handlers_util._GetAllTryJobResultsForTest(
566 self.master_name, self.builder_name, self.build_number) 844 failure_result_map, tasks_info)
567 845
568 expected_result = { 846 expected_result = {
569 'a_test on platform-a_test1': { 847 'step1 on platform':{
570 'step_name': 'a_test on platform', 848 'try_jobs': [
571 'test_name': 'a_test1', 849 {
572 'step_no_platform': 'a_test', 850 'try_job_key': 'm/b/118',
573 'try_job_key': 'm/b/121', 851 'status': result_status.NO_TRY_JOB_REASON_MAP.get(
574 'try_job_build_number': 121, 852 result_status.NO_SWARMING_TASK_FOUND),
575 'status': 'Completed', 853 'tests': ['test1']
576 'try_job_url': ( 854 },
577 'http://build.chromium.org/p/tryserver.chromium.linux/' 855 {
578 'builders/linux_chromium_variable/builds/121'), 856 'ref_name': 'step1',
857 'try_job_key': 'm/b/119',
858 'task_id': 'task1',
859 'task_url': 'url/task1',
860 'status': wf_analysis_status.ANALYZED,
861 'try_job_url': (
862 'http://build.chromium.org/p/tryserver.chromium.'
863 'linux/builders/linux_chromium_variable/builds/121'),
864 'try_job_build_number': 121,
865 'tests': ['test3'],
866 'culprit': {}
867 },
868 {
869 'ref_name': 'step1',
870 'try_job_key': 'm/b/119',
871 'task_id': 'task1',
872 'task_url': 'url/task1',
873 'status': wf_analysis_status.ANALYZED,
874 'try_job_url': (
875 'http://build.chromium.org/p/tryserver.chromium.'
876 'linux/builders/linux_chromium_variable/builds/121'),
877 'try_job_build_number': 121,
878 'culprit': {
879 'revision': 'rev2',
880 'commit_position': '2',
881 'review_url': 'url_2'
882 },
883 'tests': ['test2']
884 },
885 {
886 'ref_name': 'step1',
887 'try_job_key': 'm/b/119',
888 'status': result_status.FLAKY,
889 'task_id': 'task1',
890 'task_url': 'url/task1',
891 'tests': ['test4']
892 }
893 ]
894 }
895 }
896 self.assertEqual(set(expected_result), set(result))
897
898 def testOrganizeTryJobResultByCulpritsNoCulprits(self):
899 self.assertEqual({}, handlers_util._OrganizeTryJobResultByCulprits({}))
900
901 def testOrganizeTryJobResultByCulprits(self):
902 try_job_culprits = {
903 'tests': {
904 'a_test1': {
905 'revision': 'rev1',
906 'commit_position': '1',
907 'review_url': 'url_1'
908 },
909 'a_test2': {
910 'revision': 'rev1',
911 'commit_position': '1',
912 'review_url': 'url_1'
913 }
914 }
915 }
916
917 result = handlers_util._OrganizeTryJobResultByCulprits(try_job_culprits)
918 expected_result = {
919 'rev1': {
579 'revision': 'rev1', 920 'revision': 'rev1',
580 'commit_position': '1', 921 'commit_position': '1',
581 'review_url': 'url_1' 922 'review_url': 'url_1',
582 }, 923 'failed_tests': ['a_test2', 'a_test1']
583 'a_test on platform-a_test2': { 924 }
584 'step_name': 'a_test on platform', 925 }
585 'test_name': 'a_test2', 926 self.assertEqual(expected_result,result)
586 'step_no_platform': 'a_test', 927
587 'try_job_key': 'm/b/121', 928 def testGetCulpritInfoForTryJobResultForTestTryJobNoResult(self):
588 'status': 'Completed', 929 try_job_key = 'm/b/119'
589 'try_job_build_number': 121,
590 'try_job_url': (
591 'http://build.chromium.org/p/tryserver.chromium.linux/'
592 'builders/linux_chromium_variable/builds/121')
593 },
594 'a_test on platform-a_test3': {
595 'step_name': 'a_test on platform',
596 'test_name': 'a_test3',
597 'step_no_platform': 'a_test',
598 'try_job_key': 'm/b/120',
599 'try_job_build_number': 120,
600 'status': 'Completed',
601 'try_job_url': (
602 'http://build.chromium.org/p/tryserver.chromium.linux/'
603 'builders/linux_chromium_variable/builds/120'),
604 'revision': 'rev0',
605 'commit_position': '0',
606 'review_url': 'url_0'
607 },
608 'a_test on platform-a_test4': {
609 'step_name': 'a_test on platform',
610 'test_name': 'a_test4',
611 'step_no_platform': 'a_test',
612 'try_job_key': 'm/b/121',
613 'status': 'Flaky'
614 },
615 'b_test_on_platform-b_test1': {
616 'step_name': 'b_test_on_platform',
617 'test_name': 'b_test1',
618 'step_no_platform': 'b_test',
619 'try_job_key': 'm/b/121',
620 'status': 'Flaky'
621 },
622 'c_test': {
623 'step_name': 'c_test',
624 'test_name': 'N/A',
625 'try_job_key': 'm/b/121',
626 'try_job_build_number': 121,
627 'status': 'Completed',
628 'try_job_url': (
629 'http://build.chromium.org/p/tryserver.chromium.linux/'
630 'builders/linux_chromium_variable/builds/121'),
631 'revision': 'rev2',
632 'commit_position': '2',
633 'review_url': 'url_2'
634 },
635 'd_test': {
636 'step_name': 'd_test',
637 'test_name': 'N/A',
638 'try_job_key': 'm/b/122',
639 'try_job_build_number': 122,
640 'status': 'Completed',
641 'try_job_url': (
642 'http://build.chromium.org/p/tryserver.chromium.linux/'
643 'builders/linux_chromium_variable/builds/122')
644 }
645 }
646 self.assertEqual(expected_result, result)
647
648 def testUpdateTryJobCulpritUsingSwarmingTaskNoTask(self):
649 step_name = 's'
650 failure_key_set = ['m/b/1']
651 culprits_info = None
652 handlers_util._UpdateTryJobCulpritUsingSwarmingTask(
653 step_name, failure_key_set, culprits_info)
654 self.assertIsNone(culprits_info)
655
656 def testGetCulpritInfoForTryJobResultStep(self):
657 try_job_key = 'm/b/120'
658 culprits_info = { 930 culprits_info = {
659 'a_test on platform': { 931 'step1 on platform':{
660 'step_name': 'a_test on platform', 932 'try_jobs': [
661 'test_name': 'N/A', 933 {
662 'try_job_key': try_job_key 934 'ref_name': 'step1',
663 } 935 'try_job_key': try_job_key,
664 } 936 'tests': ['test2', 'test3']
665 937 }
666 try_job_120 = WfTryJob.Create( 938 ]
667 self.master_name, self.builder_name, 120) 939 }
668 try_job_120.status = wf_analysis_status.ANALYZED 940 }
669 try_job_120.test_results = [ 941 WfTryJob.Create('m', 'b', '119').put()
942 handlers_util._GetCulpritInfoForTryJobResultForTest(
943 try_job_key, culprits_info)
944
945 expected_culprits_info = {
946 'step1 on platform':{
947 'try_jobs': [
948 {
949 'ref_name': 'step1',
950 'try_job_key': try_job_key,
951 'tests': ['test2', 'test3'],
952 'status': wf_analysis_status.PENDING
953 }
954 ]
955 }
956 }
957 self.assertEqual(expected_culprits_info, culprits_info)
958
959 def testGetCulpritInfoForTryJobResultForTestTryJobPending(self):
960 try_job_key = 'm/b/119'
961 culprits_info = {
962 'step1 on platform':{
963 'try_jobs': [
964 {
965 'ref_name': 'step1',
966 'try_job_key': try_job_key,
967 'tests': ['test2', 'test3']
968 }
969 ]
970 }
971 }
972 try_job = WfTryJob.Create('m', 'b', '119')
973 try_job.test_results.append({'try_job_id': 'try_job_id'})
974 try_job.put()
975 handlers_util._GetCulpritInfoForTryJobResultForTest(
976 try_job_key, culprits_info)
977
978 expected_culprits_info = {
979 'step1 on platform':{
980 'try_jobs': [
981 {
982 'ref_name': 'step1',
983 'try_job_key': try_job_key,
984 'tests': ['test2', 'test3'],
985 'status': wf_analysis_status.PENDING
986 }
987 ]
988 }
989 }
990 self.assertEqual(expected_culprits_info, culprits_info)
991
992 def testGetCulpritInfoForTryJobResultForTestTryJobRunning(self):
993 try_job_key = 'm/b/119'
994 culprits_info = {
995 'step1 on platform':{
996 'try_jobs': [
997 {
998 'ref_name': 'step1',
999 'try_job_key': try_job_key,
1000 'tests': ['test2', 'test3']
1001 }
1002 ]
1003 }
1004 }
1005 try_job = WfTryJob.Create('m', 'b', '119')
1006 try_job.status = wf_analysis_status.ANALYZING
1007 try_job.test_results = [
670 { 1008 {
671 'result': { 1009 'url': ('http://build.chromium.org/p/tryserver.chromium.'
672 'rev0': { 1010 'linux/builders/linux_chromium_variable/builds/121'),
673 'a_test on platform': { 1011 'try_job_id': '121'
674 'status': 'failed',
675 'valid': True,
676 'failures': ['a_test3']
677 }
678 }
679 },
680 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/'
681 'builders/linux_chromium_variable/builds/120'),
682 'try_job_id': '0',
683 'culprit': {
684 'a_test on platform': {
685 'tests': {
686 'a_test3': {
687 'revision': 'rev0',
688 'commit_position': '0',
689 'review_url': 'url_0'
690 }
691 }
692 }
693 }
694 } 1012 }
695 ] 1013 ]
696 try_job_120.put() 1014 try_job.put()
697 1015 handlers_util._GetCulpritInfoForTryJobResultForTest(
698 handlers_util._GetCulpritInfoForTryJobResult(try_job_key, culprits_info) 1016 try_job_key, culprits_info)
699 1017
700 expected_culprits_info = { 1018 expected_culprits_info = {
701 'a_test on platform-a_test3': { 1019 'step1 on platform':{
702 'step_name': 'a_test on platform', 1020 'try_jobs': [
703 'test_name': 'a_test3', 1021 {
704 'try_job_key': 'm/b/120', 1022 'ref_name': 'step1',
705 'try_job_build_number': 120, 1023 'try_job_key': try_job_key,
706 'status': 'Completed', 1024 'tests': ['test2', 'test3'],
707 'try_job_url': ( 1025 'status': wf_analysis_status.ANALYZING,
708 'http://build.chromium.org/p/tryserver.chromium.linux/' 1026 'try_job_url': (
709 'builders/linux_chromium_variable/builds/120'), 1027 'http://build.chromium.org/p/tryserver.chromium.'
710 'revision': 'rev0', 1028 'linux/builders/linux_chromium_variable/builds/121'),
711 'commit_position': '0', 1029 'try_job_build_number': 121
712 'review_url': 'url_0' 1030 }
713 } 1031 ]
714 } 1032 }
715 1033 }
716 self.assertEqual(expected_culprits_info, culprits_info) 1034 self.assertEqual(expected_culprits_info, culprits_info)
OLDNEW
« appengine/findit/handlers/handlers_util.py ('K') | « appengine/findit/handlers/swarming_task.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698