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

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: remove possible flaky tests. 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
« no previous file with comments | « appengine/findit/handlers/swarming_task.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 testGetTryJobResultForCompileOnlyReturnUrlIfStarts(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(
219 self.master_name, self.builder_name, self.build_number)
220 try_job.put()
221
222 result = handlers_util.GetAllTryJobResults(
223 self.master_name, self.builder_name, self.build_number)
224
225 expected_result = {
226 'compile': {
227 'step_name': 'compile',
228 'test_name': 'N/A',
229 'try_job_key': 'm/b/121',
230 'status': 'Pending'
231 }
232 }
233
234 self.assertEqual(expected_result, result)
235
236 def testGetTryJobResultOnlyReturnUrlIfStarts(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( 331 try_job = WfTryJob.Create(
245 self.master_name, self.builder_name, self.build_number) 332 self.master_name, self.builder_name, self.build_number)
246 try_job.status = wf_analysis_status.ANALYZING 333 try_job.status = wf_analysis_status.ANALYZING
247 try_job.compile_results = [ 334 try_job.compile_results = [
248 { 335 {
249 'result': None, 336 'result': None,
250 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 337 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/'
251 'builders/linux_chromium_variable/builds/121') 338 'builders/linux_chromium_variable/builds/121')
252 } 339 }
253 ] 340 ]
254 try_job.put() 341 try_job.put()
255 342
256 result = handlers_util.GetAllTryJobResults( 343 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
257 self.master_name, self.builder_name, self.build_number)
258 344
259 expected_result = { 345 expected_result = {
260 'compile': { 346 'compile': {
261 'step_name': 'compile', 347 'try_jobs': [
262 'test_name': 'N/A', 348 {
263 'try_job_key': 'm/b/121', 349 'try_job_key': 'm/b/121',
264 'status': 'Running', 350 'status': wf_analysis_status.ANALYZING,
265 'try_job_build_number': 121, 351 'try_job_build_number': 121,
266 'try_job_url': ('http://build.chromium.org/p/tryserver.chromium.' 352 'try_job_url': (
267 'linux/builders/linux_chromium_variable/builds/121') 353 'http://build.chromium.org/p/tryserver.chromium.'
354 'linux/builders/linux_chromium_variable/builds/121')
355 }
356 ]
268 } 357 }
269 } 358 }
270 self.assertEqual(expected_result, result) 359 self.assertEqual(expected_result, result)
271 360
272 def testGetTryJobResultOnlyReturnStatusIfError(self): 361 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( 362 try_job = WfTryJob.Create(
281 self.master_name, self.builder_name, self.build_number) 363 self.master_name, self.builder_name, self.build_number)
282 try_job.status = wf_analysis_status.ERROR 364 try_job.status = wf_analysis_status.ERROR
283 try_job.compile_results = [ 365 try_job.compile_results = [
284 { 366 {
285 'try_job_id': '1' 367 'try_job_id': '1'
286 } 368 }
287 ] 369 ]
288 try_job.put() 370 try_job.put()
289 371
290 result = handlers_util.GetAllTryJobResults( 372 result = handlers_util._GetTryJobResultForCompile({'compile': 'm/b/121'})
291 self.master_name, self.builder_name, self.build_number)
292 373
293 expected_result = { 374 expected_result = {
294 'compile': { 375 'compile': {
295 'step_name': 'compile', 376 'try_jobs': [
296 'test_name': 'N/A', 377 {
297 'try_job_key': 'm/b/121', 378 'try_job_key': 'm/b/121',
298 'status': 'Error' 379 'status': wf_analysis_status.ERROR
380 }
381 ]
299 } 382 }
300 } 383 }
301 384
302 self.assertEqual(expected_result, result) 385 self.assertEqual(expected_result, result)
303 386
304 def testGetTryJobResultWhenTryJobCompleted(self): 387 def testGetTryJobResultWhenTryJobCompleted(self):
305 analysis = WfAnalysis.Create( 388 analysis = WfAnalysis.Create(
306 self.master_name, self.builder_name, self.build_number) 389 self.master_name, self.builder_name, self.build_number)
307 analysis.failure_result_map = { 390 analysis.failure_result_map = {
308 'compile': 'm/b/121' 391 'compile': 'm/b/121'
309 } 392 }
310 analysis.put() 393 analysis.put()
311 394
312 try_job = WfTryJob.Create( 395 try_job = WfTryJob.Create(
313 self.master_name, self.builder_name, self.build_number) 396 self.master_name, self.builder_name, self.build_number)
314 try_job.status = wf_analysis_status.ANALYZED 397 try_job.status = wf_analysis_status.ANALYZED
315 try_job.compile_results = [ 398 try_job.compile_results = [
316 { 399 {
317 'result': [ 400 'report': {
318 ['rev1', 'passed'], 401 'result': {
319 ['rev2', 'failed'] 402 'rev1': 'passed',
320 ], 403 'rev2': 'failed'
321 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 404 }
322 'builders/linux_chromium_variable/builds/121'), 405 },
323 'try_job_id': '1', 406 'try_job_id': 'm/b/121',
407 'url': ('http://build.chromium.org/p/tryserver.chromium.'
408 'linux/builders/linux_chromium_variable/builds/121'),
324 'culprit': { 409 'culprit': {
325 'compile': { 410 'compile': {
326 'revision': 'rev2', 411 'revision': 'rev2',
327 'commit_position': '2', 412 'commit_position': '2',
328 'review_url': 'url_2' 413 'review_url': 'url_2'
329 } 414 }
330 } 415 }
331 } 416 }
332 ] 417 ]
333 try_job.put() 418 try_job.put()
334 419
335 result = handlers_util.GetAllTryJobResults( 420 result = handlers_util.GetAllTryJobResults(
336 self.master_name, self.builder_name, self.build_number) 421 self.master_name, self.builder_name, self.build_number)
337 422
338 expected_result = { 423 expected_result = {
339 'compile': { 424 'compile': {
340 'step_name': 'compile', 425 'try_jobs': [
341 'test_name': 'N/A', 426 {
342 'try_job_key': 'm/b/121', 427 'try_job_key': 'm/b/121',
343 'try_job_build_number': 121, 428 'status': wf_analysis_status.ANALYZED,
344 'status': 'Completed', 429 'try_job_build_number': 121,
345 'try_job_url': ( 430 'try_job_url': (
346 'http://build.chromium.org/p/tryserver.chromium.linux/' 431 'http://build.chromium.org/p/tryserver.chromium.'
347 'builders/linux_chromium_variable/builds/121'), 432 'linux/builders/linux_chromium_variable/builds/121'),
348 'revision': 'rev2', 433 'culprit': {
349 'commit_position': '2', 434 'revision': 'rev2',
350 'review_url': 'url_2' 435 'commit_position': '2',
436 'review_url': 'url_2'
437 }
438 }
439 ]
351 } 440 }
352 } 441 }
353 442
354 self.assertEqual(expected_result, result) 443 self.assertEqual(expected_result, result)
355 444
356 def testGetTryJobResultWhenTryJobCompletedAllPassed(self): 445 def testGetTryJobResultWhenTryJobCompletedAllPassed(self):
357 analysis = WfAnalysis.Create( 446 analysis = WfAnalysis.Create(
358 self.master_name, self.builder_name, self.build_number) 447 self.master_name, self.builder_name, self.build_number)
359 analysis.failure_result_map = { 448 analysis.failure_result_map = {
360 'compile': 'm/b/121' 449 'compile': 'm/b/121'
361 } 450 }
362 analysis.put() 451 analysis.put()
363 452
364 try_job = WfTryJob.Create( 453 try_job = WfTryJob.Create(
365 self.master_name, self.builder_name, self.build_number) 454 self.master_name, self.builder_name, self.build_number)
366 try_job.status = wf_analysis_status.ANALYZED 455 try_job.status = wf_analysis_status.ANALYZED
367 try_job.compile_results = [ 456 try_job.compile_results = [
368 { 457 {
369 'result': [ 458 'report': {
370 ['rev1', 'passed'], 459 'result': {
371 ['rev2', 'passed'] 460 'rev1': 'passed',
372 ], 461 'rev2': 'failed'
462 },
463 },
373 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 464 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/'
374 'builders/linux_chromium_variable/builds/121') 465 'builders/linux_chromium_variable/builds/121')
375 } 466 }
376 ] 467 ]
377 try_job.put() 468 try_job.put()
378 469
379 result = handlers_util.GetAllTryJobResults( 470 result = handlers_util.GetAllTryJobResults(
380 self.master_name, self.builder_name, self.build_number) 471 self.master_name, self.builder_name, self.build_number)
381 472
382 expected_result = { 473 expected_result = {
383 'compile': { 474 'compile': {
384 'step_name': 'compile', 475 'try_jobs': [
385 'test_name': 'N/A', 476 {
386 'try_job_key': 'm/b/121', 477 'try_job_key': 'm/b/121',
387 'try_job_build_number': 121, 478 'status': wf_analysis_status.ANALYZED,
388 'status': 'Completed', 479 'try_job_build_number': 121,
389 'try_job_url': ( 480 'try_job_url': (
390 'http://build.chromium.org/p/tryserver.chromium.linux/' 481 'http://build.chromium.org/p/tryserver.chromium.'
391 'builders/linux_chromium_variable/builds/121') 482 'linux/builders/linux_chromium_variable/builds/121')
483 }
484 ]
392 } 485 }
393 } 486 }
394 487
395 self.assertEqual(expected_result, result) 488 self.assertEqual(expected_result, result)
396 489
397 def testGetTryJobResultWhenTryJobForTestCompleted(self): 490 def testGetAllTryJobResultsTestFailureNoTaskInfo(self):
398 analysis = WfAnalysis.Create( 491 analysis = WfAnalysis.Create(
399 self.master_name, self.builder_name, self.build_number) 492 self.master_name, self.builder_name, self.build_number)
400 analysis.failure_result_map = { 493 analysis.failure_result_map = {
401 'a_test on platform': { 494 'step1': {
402 'a_test1': 'm/b/121', 495 'test1': 'm/b/118'
403 'a_test2': 'm/b/121', 496 }
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 } 497 }
413 analysis.put() 498 analysis.put()
414 499
415 task_120_a = WfSwarmingTask.Create( 500 result = handlers_util.GetAllTryJobResults(
416 self.master_name, self.builder_name, 120, 'a_test on platform') 501 self.master_name, self.builder_name, self.build_number)
417 task_120_a.tests_statuses = { 502
418 'a_test3': { 503 expected_result = {
419 'total_run': 1, 504 'step1':{
420 'FAILURE': 1 505 'try_jobs': [
421 } 506 {
422 } 507 'try_job_key': 'm/b/118',
423 task_120_a.put() 508 'status': (
424 509 result_status.NO_TRY_JOB_REASON_MAP.get(
425 task_121_a = WfSwarmingTask.Create( 510 result_status.NO_SWARMING_TASK_FOUND)),
426 self.master_name, self.builder_name, self.build_number, 511 'tests': ['test1']
427 'a_test on platform') 512 }
428 task_121_a.tests_statuses = { 513 ]
429 'a_test1': { 514 }
430 'total_run': 1, 515 }
431 'FAILURE': 1 516
432 }, 517 self.assertEqual(expected_result, result)
433 'a_test2': { 518
434 'total_run': 1, 519 def testGetAllTryJobResultsForTestNonSwarming(self):
435 'FAILURE': 1 520 tasks_info = {
436 }, 521 'step1': {
437 'a_test4': { 522 'swarming_tasks': {
438 'total_run': 1, 523 'm/b/119': {
439 'SUCCESS': 1 524 'task_info': {
440 } 525 'status': result_status.NON_SWARMING_NO_RERUN
441 } 526 },
442 task_121_a.put() 527 'all_tests': ['test1']
443 528 },
444 task_121_b = WfSwarmingTask.Create( 529 }
445 self.master_name, self.builder_name, self.build_number, 530 }
446 'b_test_on_platform') 531 }
447 task_121_b.tests_statuses = { 532 result = handlers_util._GetAllTryJobResultsForTest(
448 'b_test1': { 533 {'step1': 'm/b/119'}, tasks_info)
449 'total_run': 1, 534
450 'SUCCESS': 1 535 expected_result = {
451 } 536 'step1': {
452 } 537 'try_jobs': [
453 task_121_b.parameters = { 538 {
454 'ref_name': 'b_test' 539 'try_job_key': 'm/b/119',
455 } 540 'status': result_status.NO_TRY_JOB_REASON_MAP.get(
456 task_121_b.put() 541 result_status.NON_SWARMING_NO_RERUN),
457 542 'tests': ['test1']
458 try_job_120 = WfTryJob.Create( 543 }
459 self.master_name, self.builder_name, 120) 544 ]
460 try_job_120.status = wf_analysis_status.ANALYZED 545 }
461 try_job_120.test_results = [ 546 }
547 self.assertEqual(expected_result, result)
548
549 def testGetAllTryJobResultsForTestNoSwarmingTaskInfo(self):
550 failure_result_map = {
551 'step1': {
552 'test3': 'm/b/119'
553 }
554 }
555
556 tasks_info = {}
557
558 result = handlers_util._GetAllTryJobResultsForTest(
559 failure_result_map, tasks_info)
560
561 self.assertEqual({}, result)
562
563 def testGetAllTryJobResultsForTestSwarmingTaskNotComplete(self):
564 failure_result_map = {
565 'step1': {
566 'test1': 'm/b/118',
567 'test3': 'm/b/119'
568 }
569 }
570
571 tasks_info = {
572 'step1': {
573 'swarming_tasks': {
574 'm/b/118': {
575 'task_info': {
576 'status': wf_analysis_status.PENDING
577 },
578 'all_tests': ['test1']
579 },
580 'm/b/119': {
581 'task_info': {
582 'status': wf_analysis_status.ANALYZING,
583 'task_id': 'task3',
584 'task_url': 'task3_url'
585 },
586 'all_tests': ['test3']
587 }
588 }
589 }
590 }
591
592 result = handlers_util._GetAllTryJobResultsForTest(
593 failure_result_map, tasks_info)
594
595 expected_result = {
596 'step1':{
597 'try_jobs': [
598 {
599 'try_job_key': 'm/b/118',
600 'status': result_status.NO_TRY_JOB_REASON_MAP[
601 wf_analysis_status.PENDING],
602 'tests': ['test1']
603 },
604 {
605 'try_job_key': 'm/b/119',
606 'status': result_status.NO_TRY_JOB_REASON_MAP[
607 wf_analysis_status.ANALYZING],
608 'task_id': 'task3',
609 'task_url': 'task3_url',
610 'tests': ['test3']
611 }
612 ]
613 }
614 }
615 self.assertEqual(expected_result, result)
616
617 def testUpdateTryJobInfoBasedOnSwarmingAllFlaky(self):
618 step_tasks_info = {
619 'swarming_tasks': {
620 'm/b/119': {
621 'task_info': {
622 'status': wf_analysis_status.ANALYZED,
623 'task_id': 'task1',
624 'task_url': 'task_url'
625 },
626 'all_tests': ['test2', 'test3'],
627 'reliable_tests': [],
628 'flaky_tests': ['test2', 'test3'],
629 'ref_name': 'step1'
630 }
631 }
632 }
633
634 try_jobs = [
462 { 635 {
463 'result': { 636 'try_job_key': 'm/b/119'
464 'rev0': { 637 }
465 'a_test': { 638 ]
466 'status': 'failed', 639
467 'valid': True, 640 handlers_util._UpdateTryJobInfoBasedOnSwarming(
468 'failures': ['a_test3'] 641 step_tasks_info, try_jobs)
469 } 642
470 } 643 expected_try_jobs = [
471 }, 644 {
472 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 645 'try_job_key': 'm/b/119',
473 'builders/linux_chromium_variable/builds/120'), 646 'ref_name': 'step1',
474 'try_job_id': '0', 647 'tests': ['test2', 'test3'],
475 'culprit': { 648 'status': result_status.FLAKY,
476 'a_test': { 649 'task_id': 'task1',
477 'tests': { 650 'task_url': 'task_url'
478 'a_test3': { 651 }
479 'revision': 'rev0', 652 ]
480 'commit_position': '0', 653 self.assertEqual(expected_try_jobs, try_jobs)
481 'review_url': 'url_0' 654
655 def testGetAllTryJobResultsForTestHasCulprit(self):
656 failure_result_map = {
657 'step1 on platform': {
658 'test3': 'm/b/119'
659 }
660 }
661
662 tasks_info = {
663 'step1 on platform': {
664 'swarming_tasks': {
665 'm/b/119': {
666 'task_info': {
667 'status': wf_analysis_status.ANALYZED,
668 'task_id': 'task1',
669 'task_url': ('https://chromium-swarm.appspot.com/user'
670 '/task/task1')
671 },
672 'all_tests': ['test3'],
673 'reliable_tests': ['test3'],
674 'flaky_tests': [],
675 'ref_name': 'step1'
676 }
677 }
678 }
679 }
680
681 try_job = WfTryJob.Create('m', 'b', 119)
682 try_job.status = wf_analysis_status.ANALYZED
683 try_job.test_results = [
684 {
685 'report': {
686 'result': {
687 'rev1': {
688 'step1': {
689 'status': 'passed',
690 'valid': True
691 }
692 },
693 'rev2': {
694 'step1': {
695 'status': 'failed',
696 'valid': True,
697 'failures': ['test3']
482 } 698 }
483 } 699 }
484 } 700 }
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 }, 701 },
520 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 702 'url': ('http://build.chromium.org/p/tryserver.chromium.'
521 'builders/linux_chromium_variable/builds/121'), 703 'linux/builders/linux_chromium_variable/builds/121'),
522 'try_job_id': '1', 704 'try_job_id': 'try_job_id',
523 'culprit': { 705 'culprit': {
524 'a_test': { 706 'step1': {
525 'tests': { 707 'tests': {
526 'a_test1': { 708 'test3': {
527 'revision': 'rev1', 709 'revision': 'rev2',
528 'commit_position': '1', 710 'commit_position': '2',
529 'review_url': 'url_1' 711 'review_url': 'url_2'
530 } 712 }
531 } 713 }
532 },
533 'c_test': {
534 'revision': 'rev2',
535 'commit_position': '2',
536 'review_url': 'url_2',
537 'tests': {}
538 } 714 }
539 } 715 }
540 } 716 }
541 ] 717 ]
542 try_job_121.put() 718 try_job.put()
543 719
544 try_job_122 = WfTryJob.Create( 720 result = handlers_util._GetAllTryJobResultsForTest(
545 self.master_name, self.builder_name, 122) 721 failure_result_map, tasks_info)
546 try_job_122.status = wf_analysis_status.ANALYZED 722
547 try_job_122.test_results = [ 723 expected_result = {
724 'step1 on platform':{
725 'try_jobs': [
726 {
727 'ref_name': 'step1',
728 'try_job_key': 'm/b/119',
729 'status': wf_analysis_status.ANALYZED,
730 'try_job_url': (
731 'http://build.chromium.org/p/tryserver.chromium.'
732 'linux/builders/linux_chromium_variable/builds/121'),
733 'try_job_build_number': 121,
734 'culprit': {
735 'revision': 'rev2',
736 'commit_position': '2',
737 'review_url': 'url_2'
738 },
739 'task_id': 'task1',
740 'task_url': ('https://chromium-swarm.appspot.com/user'
741 '/task/task1'),
742 'tests': ['test3']
743 }
744 ]
745 }
746 }
747 self.assertEqual(expected_result, result)
748
749 def testGetAllTryJobResultsForTest(self):
750 failure_result_map = {
751 'step1 on platform': {
752 'test1': 'm/b/118',
753 'test2': 'm/b/119',
754 'test3': 'm/b/119',
755 'test4': 'm/b/119'
756 }
757 }
758
759 tasks_info = {
760 'step1 on platform': {
761 'swarming_tasks': {
762 'm/b/119': {
763 'task_info': {
764 'status': wf_analysis_status.ANALYZED,
765 'task_id': 'task1',
766 'task_url': 'url/task1'
767 },
768 'all_tests': ['test2', 'test3', 'test4'],
769 'reliable_tests': ['test2', 'test3'],
770 'flaky_tests': ['test4'],
771 'ref_name': 'step1'
772 },
773 'm/b/118': {
774 'task_info': {
775 'status': result_status.NO_SWARMING_TASK_FOUND
776 },
777 'all_tests': ['test1']
778 }
779 }
780 }
781 }
782
783 try_job = WfTryJob.Create('m', 'b', 119)
784 try_job.status = wf_analysis_status.ANALYZED
785 try_job.test_results = [
548 { 786 {
549 'result': { 787 'report': {
550 'rev3': { 788 'result': {
551 'd_test': { 789 'rev1': {
552 'status': 'passed', 790 'step1': {
553 'valid': True, 791 'status': 'passed',
554 'failures': [] 792 'valid': True
793 }
794 },
795 'rev2': {
796 'step1': {
797 'status': 'failed',
798 'valid': True,
799 'failures': ['test2']
800 }
555 } 801 }
556 } 802 }
557 }, 803 },
558 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' 804 'url': ('http://build.chromium.org/p/tryserver.chromium.'
559 'builders/linux_chromium_variable/builds/122'), 805 'linux/builders/linux_chromium_variable/builds/121'),
560 'try_job_id': '2' 806 'try_job_id': 'try_job_id',
807 'culprit': {
808 'step1': {
809 'tests': {
810 'test2': {
811 'revision': 'rev2',
812 'commit_position': '2',
813 'review_url': 'url_2'
814 }
815 }
816 }
817 }
561 } 818 }
562 ] 819 ]
563 try_job_122.put() 820 try_job.put()
564 821
565 result = handlers_util.GetAllTryJobResults( 822 result = handlers_util._GetAllTryJobResultsForTest(
566 self.master_name, self.builder_name, self.build_number) 823 failure_result_map, tasks_info)
567 824
568 expected_result = { 825 expected_result = {
569 'a_test on platform-a_test1': { 826 'step1 on platform':{
570 'step_name': 'a_test on platform', 827 'try_jobs': [
571 'test_name': 'a_test1', 828 {
572 'step_no_platform': 'a_test', 829 'try_job_key': 'm/b/118',
573 'try_job_key': 'm/b/121', 830 'status': result_status.NO_TRY_JOB_REASON_MAP.get(
574 'try_job_build_number': 121, 831 result_status.NO_SWARMING_TASK_FOUND),
575 'status': 'Completed', 832 'tests': ['test1']
576 'try_job_url': ( 833 },
577 'http://build.chromium.org/p/tryserver.chromium.linux/' 834 {
578 'builders/linux_chromium_variable/builds/121'), 835 'ref_name': 'step1',
836 'try_job_key': 'm/b/119',
837 'task_id': 'task1',
838 'task_url': 'url/task1',
839 'status': wf_analysis_status.ANALYZED,
840 'try_job_url': (
841 'http://build.chromium.org/p/tryserver.chromium.'
842 'linux/builders/linux_chromium_variable/builds/121'),
843 'try_job_build_number': 121,
844 'tests': ['test3'],
845 'culprit': {}
846 },
847 {
848 'ref_name': 'step1',
849 'try_job_key': 'm/b/119',
850 'task_id': 'task1',
851 'task_url': 'url/task1',
852 'status': wf_analysis_status.ANALYZED,
853 'try_job_url': (
854 'http://build.chromium.org/p/tryserver.chromium.'
855 'linux/builders/linux_chromium_variable/builds/121'),
856 'try_job_build_number': 121,
857 'culprit': {
858 'revision': 'rev2',
859 'commit_position': '2',
860 'review_url': 'url_2'
861 },
862 'tests': ['test2']
863 },
864 {
865 'ref_name': 'step1',
866 'try_job_key': 'm/b/119',
867 'status': result_status.FLAKY,
868 'task_id': 'task1',
869 'task_url': 'url/task1',
870 'tests': ['test4']
871 }
872 ]
873 }
874 }
875 self.assertEqual(set(expected_result), set(result))
876
877 def testOrganizeTryJobResultByCulpritsNoCulprits(self):
878 self.assertEqual({}, handlers_util._OrganizeTryJobResultByCulprits({}))
879
880 def testOrganizeTryJobResultByCulprits(self):
881 try_job_culprits = {
882 'tests': {
883 'a_test1': {
884 'revision': 'rev1',
885 'commit_position': '1',
886 'review_url': 'url_1'
887 },
888 'a_test2': {
889 'revision': 'rev1',
890 'commit_position': '1',
891 'review_url': 'url_1'
892 }
893 }
894 }
895
896 result = handlers_util._OrganizeTryJobResultByCulprits(try_job_culprits)
897 expected_result = {
898 'rev1': {
579 'revision': 'rev1', 899 'revision': 'rev1',
580 'commit_position': '1', 900 'commit_position': '1',
581 'review_url': 'url_1' 901 'review_url': 'url_1',
582 }, 902 'failed_tests': ['a_test2', 'a_test1']
583 'a_test on platform-a_test2': { 903 }
584 'step_name': 'a_test on platform', 904 }
585 'test_name': 'a_test2', 905 self.assertEqual(expected_result,result)
586 'step_no_platform': 'a_test', 906
587 'try_job_key': 'm/b/121', 907 def testGetCulpritInfoForTryJobResultForTestTryJobNoResult(self):
588 'status': 'Completed', 908 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 = { 909 culprits_info = {
659 'a_test on platform': { 910 'step1 on platform':{
660 'step_name': 'a_test on platform', 911 'try_jobs': [
661 'test_name': 'N/A', 912 {
662 'try_job_key': try_job_key 913 'ref_name': 'step1',
663 } 914 'try_job_key': try_job_key,
664 } 915 'tests': ['test2', 'test3']
665 916 }
666 try_job_120 = WfTryJob.Create( 917 ]
667 self.master_name, self.builder_name, 120) 918 }
668 try_job_120.status = wf_analysis_status.ANALYZED 919 }
669 try_job_120.test_results = [ 920 WfTryJob.Create('m', 'b', '119').put()
921 handlers_util._GetCulpritInfoForTryJobResultForTest(
922 try_job_key, culprits_info)
923
924 expected_culprits_info = {
925 'step1 on platform':{
926 'try_jobs': [
927 {
928 'ref_name': 'step1',
929 'try_job_key': try_job_key,
930 'tests': ['test2', 'test3'],
931 'status': wf_analysis_status.PENDING
932 }
933 ]
934 }
935 }
936 self.assertEqual(expected_culprits_info, culprits_info)
937
938 def testGetCulpritInfoForTryJobResultForTestTryJobRunning(self):
939 try_job_key = 'm/b/119'
940 culprits_info = {
941 'step1 on platform':{
942 'try_jobs': [
943 {
944 'ref_name': 'step1',
945 'try_job_key': try_job_key,
946 'tests': ['test2', 'test3']
947 }
948 ]
949 }
950 }
951 try_job = WfTryJob.Create('m', 'b', '119')
952 try_job.status = wf_analysis_status.ANALYZING
953 try_job.test_results = [
670 { 954 {
671 'result': { 955 'url': ('http://build.chromium.org/p/tryserver.chromium.'
672 'rev0': { 956 'linux/builders/linux_chromium_variable/builds/121'),
673 'a_test on platform': { 957 '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 } 958 }
695 ] 959 ]
696 try_job_120.put() 960 try_job.put()
697 961 handlers_util._GetCulpritInfoForTryJobResultForTest(
698 handlers_util._GetCulpritInfoForTryJobResult(try_job_key, culprits_info) 962 try_job_key, culprits_info)
699 963
700 expected_culprits_info = { 964 expected_culprits_info = {
701 'a_test on platform-a_test3': { 965 'step1 on platform':{
702 'step_name': 'a_test on platform', 966 'try_jobs': [
703 'test_name': 'a_test3', 967 {
704 'try_job_key': 'm/b/120', 968 'ref_name': 'step1',
705 'try_job_build_number': 120, 969 'try_job_key': try_job_key,
706 'status': 'Completed', 970 'tests': ['test2', 'test3'],
707 'try_job_url': ( 971 'status': wf_analysis_status.ANALYZING,
708 'http://build.chromium.org/p/tryserver.chromium.linux/' 972 'try_job_url': (
709 'builders/linux_chromium_variable/builds/120'), 973 'http://build.chromium.org/p/tryserver.chromium.'
710 'revision': 'rev0', 974 'linux/builders/linux_chromium_variable/builds/121'),
711 'commit_position': '0', 975 'try_job_build_number': 121
712 'review_url': 'url_0' 976 }
713 } 977 ]
714 } 978 }
715 979 }
716 self.assertEqual(expected_culprits_info, culprits_info) 980 self.assertEqual(expected_culprits_info, culprits_info)
OLDNEW
« no previous file with comments | « appengine/findit/handlers/swarming_task.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698