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

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

Powered by Google App Engine
This is Rietveld 408576698