| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 import webapp2 | 5 import webapp2 |
| 6 | 6 |
| 7 from testing_utils import testing | 7 from testing_utils import testing |
| 8 | 8 |
| 9 from handlers import try_job_result | 9 from handlers import try_job_result |
| 10 from model.wf_analysis import WfAnalysis | |
| 11 from model import wf_analysis_status | |
| 12 from model.wf_swarming_task import WfSwarmingTask | |
| 13 from model.wf_try_job import WfTryJob | |
| 14 from waterfall import buildbot | 10 from waterfall import buildbot |
| 15 | 11 |
| 16 | 12 |
| 17 class TryJobResultTest(testing.AppengineTestCase): | 13 class TryJobResultTest(testing.AppengineTestCase): |
| 18 app_module = webapp2.WSGIApplication([ | 14 app_module = webapp2.WSGIApplication([ |
| 19 ('/try-job-result', try_job_result.TryJobResult),], debug=True) | 15 ('/try-job-result', try_job_result.TryJobResult),], debug=True) |
| 20 | 16 |
| 21 def setUp(self): | 17 def setUp(self): |
| 22 super(TryJobResultTest, self).setUp() | 18 super(TryJobResultTest, self).setUp() |
| 23 self.master_name = 'm' | 19 self.master_name = 'm' |
| 24 self.builder_name = 'b' | 20 self.builder_name = 'b' |
| 25 self.build_number = 121 | 21 self.build_number = 121 |
| 26 self.mock_current_user(user_email='test@chromium.org', is_admin=True) | 22 self.mock_current_user(user_email='test@chromium.org', is_admin=True) |
| 27 | 23 |
| 28 def testGetTryJobResultReturnNoneIfNoFailureResultMap(self): | |
| 29 analysis = WfAnalysis.Create( | |
| 30 self.master_name, self.builder_name, self.build_number) | |
| 31 analysis.put() | |
| 32 | |
| 33 result = try_job_result._GetAllTryJobResults( | |
| 34 self.master_name, self.builder_name, self.build_number) | |
| 35 | |
| 36 self.assertEqual({}, result) | |
| 37 | |
| 38 def testGetTryJobResultReturnNoneIfNoTryJob(self): | |
| 39 analysis = WfAnalysis.Create( | |
| 40 self.master_name, self.builder_name, self.build_number) | |
| 41 analysis.failure_result_map = { | |
| 42 'compile': 'm/b/121' | |
| 43 } | |
| 44 analysis.put() | |
| 45 | |
| 46 result = try_job_result._GetAllTryJobResults( | |
| 47 self.master_name, self.builder_name, self.build_number) | |
| 48 | |
| 49 expected_result = { | |
| 50 'compile': { | |
| 51 'step': 'compile', | |
| 52 'test': 'N/A', | |
| 53 'try_job_key': 'm/b/121' | |
| 54 } | |
| 55 } | |
| 56 | |
| 57 self.assertEqual(expected_result, result) | |
| 58 | |
| 59 def testGetTryJobResultOnlyReturnStatusIfPending(self): | |
| 60 analysis = WfAnalysis.Create( | |
| 61 self.master_name, self.builder_name, self.build_number) | |
| 62 analysis.failure_result_map = { | |
| 63 'compile': 'm/b/121' | |
| 64 } | |
| 65 analysis.put() | |
| 66 | |
| 67 try_job = WfTryJob.Create( | |
| 68 self.master_name, self.builder_name, self.build_number) | |
| 69 try_job.put() | |
| 70 | |
| 71 result = try_job_result._GetAllTryJobResults( | |
| 72 self.master_name, self.builder_name, self.build_number) | |
| 73 | |
| 74 expected_result = { | |
| 75 'compile': { | |
| 76 'step': 'compile', | |
| 77 'test': 'N/A', | |
| 78 'try_job_key': 'm/b/121', | |
| 79 'status': 'Pending' | |
| 80 } | |
| 81 } | |
| 82 | |
| 83 self.assertEqual(expected_result, result) | |
| 84 | |
| 85 def testGetTryJobResultOnlyReturnUrlIfStarts(self): | |
| 86 analysis = WfAnalysis.Create( | |
| 87 self.master_name, self.builder_name, self.build_number) | |
| 88 analysis.failure_result_map = { | |
| 89 'compile': 'm/b/121' | |
| 90 } | |
| 91 analysis.put() | |
| 92 | |
| 93 try_job = WfTryJob.Create( | |
| 94 self.master_name, self.builder_name, self.build_number) | |
| 95 try_job.status = wf_analysis_status.ANALYZING | |
| 96 try_job.compile_results = [ | |
| 97 { | |
| 98 'result': None, | |
| 99 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 100 'builders/linux_chromium_variable/builds/121') | |
| 101 } | |
| 102 ] | |
| 103 try_job.put() | |
| 104 | |
| 105 result = try_job_result._GetAllTryJobResults( | |
| 106 self.master_name, self.builder_name, self.build_number) | |
| 107 | |
| 108 expected_result = { | |
| 109 'compile': { | |
| 110 'step': 'compile', | |
| 111 'test': 'N/A', | |
| 112 'try_job_key': 'm/b/121', | |
| 113 'status': 'Running', | |
| 114 'try_job_build_number': 121, | |
| 115 'try_job_url': ('http://build.chromium.org/p/tryserver.chromium.' | |
| 116 'linux/builders/linux_chromium_variable/builds/121') | |
| 117 } | |
| 118 } | |
| 119 self.assertEqual(expected_result, result) | |
| 120 | |
| 121 def testGetTryJobResultOnlyReturnStatusIfError(self): | |
| 122 analysis = WfAnalysis.Create( | |
| 123 self.master_name, self.builder_name, self.build_number) | |
| 124 analysis.failure_result_map = { | |
| 125 'compile': 'm/b/121' | |
| 126 } | |
| 127 analysis.put() | |
| 128 | |
| 129 try_job = WfTryJob.Create( | |
| 130 self.master_name, self.builder_name, self.build_number) | |
| 131 try_job.status = wf_analysis_status.ERROR | |
| 132 try_job.compile_results = [ | |
| 133 { | |
| 134 'try_job_id': '1' | |
| 135 } | |
| 136 ] | |
| 137 try_job.put() | |
| 138 | |
| 139 result = try_job_result._GetAllTryJobResults( | |
| 140 self.master_name, self.builder_name, self.build_number) | |
| 141 | |
| 142 expected_result = { | |
| 143 'compile': { | |
| 144 'step': 'compile', | |
| 145 'test': 'N/A', | |
| 146 'try_job_key': 'm/b/121', | |
| 147 'status': 'Error' | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 self.assertEqual(expected_result, result) | |
| 152 | |
| 153 def testGetTryJobResultWhenTryJobCompleted(self): | |
| 154 analysis = WfAnalysis.Create( | |
| 155 self.master_name, self.builder_name, self.build_number) | |
| 156 analysis.failure_result_map = { | |
| 157 'compile': 'm/b/121' | |
| 158 } | |
| 159 analysis.put() | |
| 160 | |
| 161 try_job = WfTryJob.Create( | |
| 162 self.master_name, self.builder_name, self.build_number) | |
| 163 try_job.status = wf_analysis_status.ANALYZED | |
| 164 try_job.compile_results = [ | |
| 165 { | |
| 166 'result': [ | |
| 167 ['rev1', 'passed'], | |
| 168 ['rev2', 'failed'] | |
| 169 ], | |
| 170 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 171 'builders/linux_chromium_variable/builds/121'), | |
| 172 'try_job_id': '1', | |
| 173 'culprit': { | |
| 174 'compile': { | |
| 175 'revision': 'rev2', | |
| 176 'commit_position': '2', | |
| 177 'review_url': 'url_2' | |
| 178 } | |
| 179 } | |
| 180 } | |
| 181 ] | |
| 182 try_job.put() | |
| 183 | |
| 184 result = try_job_result._GetAllTryJobResults( | |
| 185 self.master_name, self.builder_name, self.build_number) | |
| 186 | |
| 187 expected_result = { | |
| 188 'compile': { | |
| 189 'step': 'compile', | |
| 190 'test': 'N/A', | |
| 191 'try_job_key': 'm/b/121', | |
| 192 'try_job_build_number': 121, | |
| 193 'status': 'Completed', | |
| 194 'try_job_url': ( | |
| 195 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 196 'builders/linux_chromium_variable/builds/121'), | |
| 197 'revision': 'rev2', | |
| 198 'commit_position': '2', | |
| 199 'review_url': 'url_2' | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 self.assertEqual(expected_result, result) | |
| 204 | |
| 205 def testGetTryJobResultWhenTryJobCompletedAllPassed(self): | |
| 206 analysis = WfAnalysis.Create( | |
| 207 self.master_name, self.builder_name, self.build_number) | |
| 208 analysis.failure_result_map = { | |
| 209 'compile': 'm/b/121' | |
| 210 } | |
| 211 analysis.put() | |
| 212 | |
| 213 try_job = WfTryJob.Create( | |
| 214 self.master_name, self.builder_name, self.build_number) | |
| 215 try_job.status = wf_analysis_status.ANALYZED | |
| 216 try_job.compile_results = [ | |
| 217 { | |
| 218 'result': [ | |
| 219 ['rev1', 'passed'], | |
| 220 ['rev2', 'passed'] | |
| 221 ], | |
| 222 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 223 'builders/linux_chromium_variable/builds/121') | |
| 224 } | |
| 225 ] | |
| 226 try_job.put() | |
| 227 | |
| 228 result = try_job_result._GetAllTryJobResults( | |
| 229 self.master_name, self.builder_name, self.build_number) | |
| 230 | |
| 231 expected_result = { | |
| 232 'compile': { | |
| 233 'step': 'compile', | |
| 234 'test': 'N/A', | |
| 235 'try_job_key': 'm/b/121', | |
| 236 'try_job_build_number': 121, | |
| 237 'status': 'Completed', | |
| 238 'try_job_url': ( | |
| 239 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 240 'builders/linux_chromium_variable/builds/121') | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 self.assertEqual(expected_result, result) | |
| 245 | 24 |
| 246 def testTryJobResultHandler(self): | 25 def testTryJobResultHandler(self): |
| 247 build_url = buildbot.CreateBuildUrl( | 26 build_url = buildbot.CreateBuildUrl( |
| 248 self.master_name, self.builder_name, self.build_number) | 27 self.master_name, self.builder_name, self.build_number) |
| 249 response = self.test_app.get('/try-job-result', params={'url': build_url}) | 28 response = self.test_app.get('/try-job-result', params={'url': build_url}) |
| 250 expected_results = {} | 29 expected_results = {} |
| 251 | 30 |
| 252 self.assertEqual(200, response.status_int) | 31 self.assertEqual(200, response.status_int) |
| 253 self.assertEqual(expected_results, response.json_body) | 32 self.assertEqual(expected_results, response.json_body) |
| 254 | |
| 255 def testGetTryJobResultWhenTryJobForTestCompleted(self): | |
| 256 analysis = WfAnalysis.Create( | |
| 257 self.master_name, self.builder_name, self.build_number) | |
| 258 analysis.failure_result_map = { | |
| 259 'a_test': { | |
| 260 'a_test1': 'm/b/121', | |
| 261 'a_test2': 'm/b/121', | |
| 262 'a_test3': 'm/b/120', | |
| 263 'a_test4': 'm/b/121' | |
| 264 }, | |
| 265 'b_test': { | |
| 266 'b_test1': 'm/b/121' | |
| 267 }, | |
| 268 'c_test': 'm/b/121', | |
| 269 'd_test': 'm/b/122' | |
| 270 } | |
| 271 analysis.put() | |
| 272 | |
| 273 task_120_a = WfSwarmingTask.Create( | |
| 274 self.master_name, self.builder_name, 120, 'a_test') | |
| 275 task_120_a.tests_statuses = { | |
| 276 'a_test3': { | |
| 277 'total_run': 1, | |
| 278 'FAILURE': 1 | |
| 279 } | |
| 280 } | |
| 281 task_120_a.put() | |
| 282 | |
| 283 task_121_a = WfSwarmingTask.Create( | |
| 284 self.master_name, self.builder_name, self.build_number, 'a_test') | |
| 285 task_121_a.tests_statuses = { | |
| 286 'a_test1': { | |
| 287 'total_run': 1, | |
| 288 'FAILURE': 1 | |
| 289 }, | |
| 290 'a_test2': { | |
| 291 'total_run': 1, | |
| 292 'FAILURE': 1 | |
| 293 }, | |
| 294 'a_test4': { | |
| 295 'total_run': 1, | |
| 296 'SUCCESS': 1 | |
| 297 } | |
| 298 } | |
| 299 task_121_a.put() | |
| 300 | |
| 301 task_121_b = WfSwarmingTask.Create( | |
| 302 self.master_name, self.builder_name, self.build_number, 'b_test') | |
| 303 task_121_b.tests_statuses = { | |
| 304 'b_test1': { | |
| 305 'total_run': 1, | |
| 306 'SUCCESS': 1 | |
| 307 } | |
| 308 } | |
| 309 task_121_b.put() | |
| 310 | |
| 311 try_job_120 = WfTryJob.Create( | |
| 312 self.master_name, self.builder_name, 120) | |
| 313 try_job_120.status = wf_analysis_status.ANALYZED | |
| 314 try_job_120.test_results = [ | |
| 315 { | |
| 316 'result': { | |
| 317 'rev0': { | |
| 318 'a_test': { | |
| 319 'status': 'failed', | |
| 320 'valid': True, | |
| 321 'failures': ['a_test3'] | |
| 322 } | |
| 323 } | |
| 324 }, | |
| 325 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 326 'builders/linux_chromium_variable/builds/120'), | |
| 327 'try_job_id': '0', | |
| 328 'culprit': { | |
| 329 'a_test': { | |
| 330 'tests': { | |
| 331 'a_test3': { | |
| 332 'revision': 'rev0', | |
| 333 'commit_position': '0', | |
| 334 'review_url': 'url_0' | |
| 335 } | |
| 336 } | |
| 337 } | |
| 338 } | |
| 339 } | |
| 340 ] | |
| 341 try_job_120.put() | |
| 342 | |
| 343 try_job_121 = WfTryJob.Create( | |
| 344 self.master_name, self.builder_name, self.build_number) | |
| 345 try_job_121.status = wf_analysis_status.ANALYZED | |
| 346 try_job_121.test_results = [ | |
| 347 { | |
| 348 'result': { | |
| 349 'rev1': { | |
| 350 'a_test': { | |
| 351 'status': 'failed', | |
| 352 'valid': True, | |
| 353 'failures': ['a_test1'] | |
| 354 }, | |
| 355 'c_test': { | |
| 356 'status': 'passed', | |
| 357 'valid': True | |
| 358 } | |
| 359 }, | |
| 360 'rev2': { | |
| 361 'a_test': { | |
| 362 'status': 'failed', | |
| 363 'valid': True, | |
| 364 'failures': ['a_test1'] | |
| 365 }, | |
| 366 'c_test': { | |
| 367 'status': 'failed', | |
| 368 'valid': True, | |
| 369 'failures': [] | |
| 370 } | |
| 371 } | |
| 372 }, | |
| 373 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 374 'builders/linux_chromium_variable/builds/121'), | |
| 375 'try_job_id': '1', | |
| 376 'culprit': { | |
| 377 'a_test': { | |
| 378 'tests': { | |
| 379 'a_test1': { | |
| 380 'revision': 'rev1', | |
| 381 'commit_position': '1', | |
| 382 'review_url': 'url_1' | |
| 383 } | |
| 384 } | |
| 385 }, | |
| 386 'c_test': { | |
| 387 'revision': 'rev2', | |
| 388 'commit_position': '2', | |
| 389 'review_url': 'url_2', | |
| 390 'tests': {} | |
| 391 } | |
| 392 } | |
| 393 } | |
| 394 ] | |
| 395 try_job_121.put() | |
| 396 | |
| 397 try_job_122 = WfTryJob.Create( | |
| 398 self.master_name, self.builder_name, 122) | |
| 399 try_job_122.status = wf_analysis_status.ANALYZED | |
| 400 try_job_122.test_results = [ | |
| 401 { | |
| 402 'result': { | |
| 403 'rev3': { | |
| 404 'd_test': { | |
| 405 'status': 'passed', | |
| 406 'valid': True, | |
| 407 'failures': [] | |
| 408 } | |
| 409 } | |
| 410 }, | |
| 411 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 412 'builders/linux_chromium_variable/builds/122'), | |
| 413 'try_job_id': '2' | |
| 414 } | |
| 415 ] | |
| 416 try_job_122.put() | |
| 417 | |
| 418 result = try_job_result._GetAllTryJobResults( | |
| 419 self.master_name, self.builder_name, self.build_number) | |
| 420 | |
| 421 expected_result = { | |
| 422 'a_test-a_test1': { | |
| 423 'step': 'a_test', | |
| 424 'test': 'a_test1', | |
| 425 'try_job_key': 'm/b/121', | |
| 426 'try_job_build_number': 121, | |
| 427 'status': 'Completed', | |
| 428 'try_job_url': ( | |
| 429 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 430 'builders/linux_chromium_variable/builds/121'), | |
| 431 'revision': 'rev1', | |
| 432 'commit_position': '1', | |
| 433 'review_url': 'url_1' | |
| 434 }, | |
| 435 'a_test-a_test2': { | |
| 436 'step': 'a_test', | |
| 437 'test': 'a_test2', | |
| 438 'try_job_key': 'm/b/121', | |
| 439 'status': 'Completed', | |
| 440 'try_job_build_number': 121, | |
| 441 'try_job_url': ( | |
| 442 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 443 'builders/linux_chromium_variable/builds/121') | |
| 444 }, | |
| 445 'a_test-a_test3': { | |
| 446 'step': 'a_test', | |
| 447 'test': 'a_test3', | |
| 448 'try_job_key': 'm/b/120', | |
| 449 'try_job_build_number': 120, | |
| 450 'status': 'Completed', | |
| 451 'try_job_url': ( | |
| 452 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 453 'builders/linux_chromium_variable/builds/120'), | |
| 454 'revision': 'rev0', | |
| 455 'commit_position': '0', | |
| 456 'review_url': 'url_0' | |
| 457 }, | |
| 458 'a_test-a_test4': { | |
| 459 'step': 'a_test', | |
| 460 'test': 'a_test4', | |
| 461 'try_job_key': 'm/b/121', | |
| 462 'status': 'Flaky' | |
| 463 }, | |
| 464 'b_test-b_test1': { | |
| 465 'step': 'b_test', | |
| 466 'test': 'b_test1', | |
| 467 'try_job_key': 'm/b/121', | |
| 468 'status': 'Flaky' | |
| 469 }, | |
| 470 'c_test': { | |
| 471 'step': 'c_test', | |
| 472 'test': 'N/A', | |
| 473 'try_job_key': 'm/b/121', | |
| 474 'try_job_build_number': 121, | |
| 475 'status': 'Completed', | |
| 476 'try_job_url': ( | |
| 477 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 478 'builders/linux_chromium_variable/builds/121'), | |
| 479 'revision': 'rev2', | |
| 480 'commit_position': '2', | |
| 481 'review_url': 'url_2' | |
| 482 }, | |
| 483 'd_test': { | |
| 484 'step': 'd_test', | |
| 485 'test': 'N/A', | |
| 486 'try_job_key': 'm/b/122', | |
| 487 'try_job_build_number': 122, | |
| 488 'status': 'Completed', | |
| 489 'try_job_url': ( | |
| 490 'http://build.chromium.org/p/tryserver.chromium.linux/' | |
| 491 'builders/linux_chromium_variable/builds/122') | |
| 492 } | |
| 493 } | |
| 494 self.assertEqual(expected_result, result) | |
| OLD | NEW |