| 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 from datetime import datetime | 5 from datetime import datetime |
| 6 import json | 6 import json |
| 7 import mock | 7 import mock |
| 8 import time | 8 import time |
| 9 | 9 |
| 10 from common.waterfall import buildbucket_client | 10 from common.waterfall import buildbucket_client |
| 11 from common.waterfall import failure_type |
| 11 from common.waterfall import try_job_error | 12 from common.waterfall import try_job_error |
| 12 from common.waterfall import failure_type | |
| 13 from model import analysis_status | 13 from model import analysis_status |
| 14 from model.flake.flake_try_job import FlakeTryJob | 14 from model.flake.flake_try_job import FlakeTryJob |
| 15 from model.flake.flake_try_job_data import FlakeTryJobData |
| 15 from model.wf_try_job import WfTryJob | 16 from model.wf_try_job import WfTryJob |
| 16 from model.wf_try_job_data import WfTryJobData | 17 from model.wf_try_job_data import WfTryJobData |
| 17 from waterfall import monitor_try_job_pipeline | 18 from waterfall import monitor_try_job_pipeline |
| 18 from waterfall import waterfall_config | 19 from waterfall import waterfall_config |
| 19 from waterfall.monitor_try_job_pipeline import MonitorTryJobPipeline | 20 from waterfall.monitor_try_job_pipeline import MonitorTryJobPipeline |
| 20 from waterfall.test import wf_testcase | 21 from waterfall.test import wf_testcase |
| 21 | 22 |
| 22 | 23 |
| 23 class MonitorTryJobPipelineTest(wf_testcase.WaterfallTestCase): | 24 class MonitorTryJobPipelineTest(wf_testcase.WaterfallTestCase): |
| 24 | 25 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 54 | 55 |
| 55 def testUpdateTryJobMetadataForBuildError(self): | 56 def testUpdateTryJobMetadataForBuildError(self): |
| 56 error_data = { | 57 error_data = { |
| 57 'reason': 'BUILD_NOT_FOUND', | 58 'reason': 'BUILD_NOT_FOUND', |
| 58 'message': 'message' | 59 'message': 'message' |
| 59 } | 60 } |
| 60 error = buildbucket_client.BuildbucketError(error_data) | 61 error = buildbucket_client.BuildbucketError(error_data) |
| 61 try_job_data = WfTryJobData.Create('1') | 62 try_job_data = WfTryJobData.Create('1') |
| 62 | 63 |
| 63 monitor_try_job_pipeline._UpdateTryJobMetadata( | 64 monitor_try_job_pipeline._UpdateTryJobMetadata( |
| 64 try_job_data, None, None, error, False) | 65 try_job_data, failure_type.COMPILE, None, None, error, False) |
| 65 self.assertEqual(try_job_data.error, error_data) | 66 self.assertEqual(try_job_data.error, error_data) |
| 66 | 67 |
| 67 def testUpdateTryJobMetadata(self): | 68 def testUpdateTryJobMetadata(self): |
| 68 try_job_id = '1' | 69 try_job_id = '1' |
| 69 url = 'url' | 70 url = 'url' |
| 70 build_data = { | 71 build_data = { |
| 71 'id': try_job_id, | 72 'id': try_job_id, |
| 72 'url': url, | 73 'url': url, |
| 73 'status': 'COMPLETED', | 74 'status': 'COMPLETED', |
| 74 'completed_ts': '1454367574000000', | 75 'completed_ts': '1454367574000000', |
| (...skipping 15 matching lines...) Expand all Loading... |
| 90 build = buildbucket_client.BuildbucketBuild(build_data) | 91 build = buildbucket_client.BuildbucketBuild(build_data) |
| 91 expected_error_dict = { | 92 expected_error_dict = { |
| 92 'message': 'Try job monitoring was abandoned.', | 93 'message': 'Try job monitoring was abandoned.', |
| 93 'reason': ('Timeout after %s hours' % | 94 'reason': ('Timeout after %s hours' % |
| 94 waterfall_config.GetTryJobSettings().get( | 95 waterfall_config.GetTryJobSettings().get( |
| 95 'job_timeout_hours')) | 96 'job_timeout_hours')) |
| 96 } | 97 } |
| 97 try_job_data = WfTryJobData.Create(try_job_id) | 98 try_job_data = WfTryJobData.Create(try_job_id) |
| 98 | 99 |
| 99 monitor_try_job_pipeline._UpdateTryJobMetadata( | 100 monitor_try_job_pipeline._UpdateTryJobMetadata( |
| 100 try_job_data, None, build, None, False) | 101 try_job_data, failure_type.COMPILE, None, build, None, False) |
| 101 try_job_data = WfTryJobData.Get(try_job_id) | 102 try_job_data = WfTryJobData.Get(try_job_id) |
| 102 self.assertIsNone(try_job_data.error) | 103 self.assertIsNone(try_job_data.error) |
| 103 self.assertEqual(try_job_data.regression_range_size, 2) | 104 self.assertEqual(try_job_data.regression_range_size, 2) |
| 104 self.assertEqual(try_job_data.number_of_commits_analyzed, 2) | 105 self.assertEqual(try_job_data.number_of_commits_analyzed, 2) |
| 105 self.assertEqual(try_job_data.end_time, datetime(2016, 2, 1, 22, 59, 34)) | 106 self.assertEqual(try_job_data.end_time, datetime(2016, 2, 1, 22, 59, 34)) |
| 106 self.assertEqual(try_job_data.request_time, | 107 self.assertEqual(try_job_data.request_time, |
| 107 datetime(2016, 2, 1, 22, 59, 30)) | 108 datetime(2016, 2, 1, 22, 59, 30)) |
| 108 self.assertEqual(try_job_data.try_job_url, url) | 109 self.assertEqual(try_job_data.try_job_url, url) |
| 109 | 110 |
| 110 monitor_try_job_pipeline._UpdateTryJobMetadata( | 111 monitor_try_job_pipeline._UpdateTryJobMetadata( |
| 111 try_job_data, None, build, None, True) | 112 try_job_data, failure_type.COMPILE, None, build, None, True) |
| 112 self.assertEqual(try_job_data.error, expected_error_dict) | 113 self.assertEqual(try_job_data.error, expected_error_dict) |
| 113 self.assertEqual(try_job_data.error_code, try_job_error.TIMEOUT) | 114 self.assertEqual(try_job_data.error_code, try_job_error.TIMEOUT) |
| 114 | 115 |
| 115 @mock.patch.object(monitor_try_job_pipeline, 'buildbucket_client') | 116 @mock.patch.object(monitor_try_job_pipeline, 'buildbucket_client') |
| 116 def testGetTryJobsForCompileSuccess(self, mock_module): | 117 def testGetTryJobsForCompileSuccess(self, mock_module): |
| 117 master_name = 'm' | 118 master_name = 'm' |
| 118 builder_name = 'b' | 119 builder_name = 'b' |
| 119 build_number = 1 | 120 build_number = 1 |
| 120 try_job_id = '1' | 121 try_job_id = '1' |
| 121 regression_range_size = 2 | 122 regression_range_size = 2 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 }, | 292 }, |
| 292 'url': 'url', | 293 'url': 'url', |
| 293 'try_job_id': '3', | 294 'try_job_id': '3', |
| 294 } | 295 } |
| 295 self.assertEqual(expected_test_result, test_result) | 296 self.assertEqual(expected_test_result, test_result) |
| 296 | 297 |
| 297 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 298 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 298 self.assertEqual(expected_test_result, try_job.test_results[-1]) | 299 self.assertEqual(expected_test_result, try_job.test_results[-1]) |
| 299 self.assertEqual(analysis_status.RUNNING, try_job.status) | 300 self.assertEqual(analysis_status.RUNNING, try_job.status) |
| 300 | 301 |
| 302 @mock.patch.object(monitor_try_job_pipeline, 'buildbucket_client') |
| 303 def testGetTryJobsForFlakeSuccess(self, mock_module): |
| 304 master_name = 'm' |
| 305 builder_name = 'b' |
| 306 step_name = 's' |
| 307 test_name = 't' |
| 308 git_hash = 'a1b2c3d4' |
| 309 try_job_id = '1' |
| 310 |
| 311 try_job = FlakeTryJob.Create( |
| 312 master_name, builder_name, step_name, test_name, git_hash) |
| 313 try_job_data = FlakeTryJobData.Create(try_job_id) |
| 314 try_job_data.put() |
| 315 try_job.flake_results = [ |
| 316 { |
| 317 'report': None, |
| 318 'url': 'url', |
| 319 'try_job_id': '1', |
| 320 } |
| 321 ] |
| 322 try_job.status = analysis_status.RUNNING |
| 323 try_job.put() |
| 324 |
| 325 build_response = { |
| 326 'id': '1', |
| 327 'url': 'url', |
| 328 'status': 'COMPLETED', |
| 329 'result_details_json': json.dumps({ |
| 330 'properties': { |
| 331 'report': { |
| 332 'result': { |
| 333 'r0': { |
| 334 'gl_tests': { |
| 335 'status': 'passed', |
| 336 'valid': True, |
| 337 'pass_fail_counts': { |
| 338 'Test.One': { |
| 339 'pass_count': 100, |
| 340 'fail_count': 0 |
| 341 } |
| 342 } |
| 343 } |
| 344 } |
| 345 } |
| 346 } |
| 347 } |
| 348 }) |
| 349 } |
| 350 |
| 351 mock_module.GetTryJobs.return_value = [ |
| 352 (None, buildbucket_client.BuildbucketBuild(build_response))] |
| 353 |
| 354 pipeline = MonitorTryJobPipeline() |
| 355 flake_result = pipeline.run( |
| 356 try_job.key.urlsafe(), failure_type.FLAKY_TEST, try_job_id) |
| 357 |
| 358 expected_flake_result = { |
| 359 'report': { |
| 360 'result': { |
| 361 'r0': { |
| 362 'gl_tests': { |
| 363 'status': 'passed', |
| 364 'valid': True, |
| 365 'pass_fail_counts': { |
| 366 'Test.One': { |
| 367 'pass_count': 100, |
| 368 'fail_count': 0 |
| 369 } |
| 370 } |
| 371 } |
| 372 } |
| 373 } |
| 374 }, |
| 375 'url': 'url', |
| 376 'try_job_id': '1', |
| 377 } |
| 378 |
| 379 self.assertEqual(expected_flake_result, flake_result) |
| 380 |
| 381 try_job = FlakeTryJob.Get( |
| 382 master_name, builder_name, step_name, test_name, git_hash) |
| 383 self.assertEqual(expected_flake_result, try_job.flake_results[-1]) |
| 384 self.assertEqual(analysis_status.RUNNING, try_job.status) |
| 385 |
| 386 try_job_data = FlakeTryJobData.Get(try_job_id) |
| 387 self.assertEqual(try_job_data.last_buildbucket_response, build_response) |
| 388 |
| 301 def testUpdateTryJobResultAnalyzing(self): | 389 def testUpdateTryJobResultAnalyzing(self): |
| 302 master_name = 'm' | 390 master_name = 'm' |
| 303 builder_name = 'b' | 391 builder_name = 'b' |
| 304 build_number = 1 | 392 build_number = 1 |
| 305 try_job_id = '3' | 393 try_job_id = '3' |
| 306 | 394 |
| 307 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 395 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 308 try_job.put() | 396 try_job.put() |
| 309 | 397 |
| 310 pipeline = MonitorTryJobPipeline() | 398 pipeline = MonitorTryJobPipeline() |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 (expected_error_dict, try_job_error.UNKNOWN)) | 581 (expected_error_dict, try_job_error.UNKNOWN)) |
| 494 | 582 |
| 495 def testReturnNoneIfNoTryJobId(self): | 583 def testReturnNoneIfNoTryJobId(self): |
| 496 master_name = 'm' | 584 master_name = 'm' |
| 497 builder_name = 'b' | 585 builder_name = 'b' |
| 498 build_number = 1 | 586 build_number = 1 |
| 499 pipeline = MonitorTryJobPipeline() | 587 pipeline = MonitorTryJobPipeline() |
| 500 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 588 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 501 test_result = pipeline.run(try_job.key.urlsafe(), failure_type.TEST, None) | 589 test_result = pipeline.run(try_job.key.urlsafe(), failure_type.TEST, None) |
| 502 self.assertIsNone(test_result) | 590 self.assertIsNone(test_result) |
| OLD | NEW |