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

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

Powered by Google App Engine
This is Rietveld 408576698