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

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

Powered by Google App Engine
This is Rietveld 408576698