| 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 from testing_utils import testing | |
| 8 import time | 7 import time |
| 9 | 8 |
| 10 from common import buildbucket_client | 9 from common import buildbucket_client |
| 11 from model import wf_analysis_status | 10 from model import wf_analysis_status |
| 12 from model.wf_try_job import WfTryJob | 11 from model.wf_try_job import WfTryJob |
| 13 from model.wf_try_job_data import WfTryJobData | 12 from model.wf_try_job_data import WfTryJobData |
| 14 from waterfall import waterfall_config | |
| 15 from waterfall.monitor_try_job_pipeline import MonitorTryJobPipeline | 13 from waterfall.monitor_try_job_pipeline import MonitorTryJobPipeline |
| 14 from waterfall.test import wf_configured_test_case |
| 16 from waterfall.try_job_type import TryJobType | 15 from waterfall.try_job_type import TryJobType |
| 17 | 16 |
| 18 | 17 |
| 19 # A counter to enable different responses to requests in a loop. | 18 # A counter to enable different responses to requests in a loop. |
| 20 REQUEST_COUNTER = { | 19 REQUEST_COUNTER = { |
| 21 '1': 0, | 20 '1': 0, |
| 22 '2': 0, | 21 '2': 0, |
| 23 '3': 0 | 22 '3': 0 |
| 24 } | 23 } |
| 25 | 24 |
| 26 | 25 |
| 27 class MonitorTryJobPipelineTest(testing.AppengineTestCase): | 26 class MonitorTryJobPipelineTest(wf_configured_test_case.WaterfallTestCase): |
| 28 | 27 |
| 29 def _MockGetTryJobs(self, build_id): | 28 def _MockGetTryJobs(self, build_id): |
| 30 def Mocked_GetTryJobs(*_): | 29 def Mocked_GetTryJobs(*_): |
| 31 data = { | 30 data = { |
| 32 '1': [ | 31 '1': [ |
| 33 { | 32 { |
| 34 'build': { | 33 'build': { |
| 35 'id': '1', | 34 'id': '1', |
| 36 'url': 'url', | 35 'url': 'url', |
| 37 'status': 'COMPLETED', | 36 'status': 'COMPLETED', |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 try_job_results.append(( | 113 try_job_results.append(( |
| 115 buildbucket_client.BuildbucketError(build_error['error']), None)) | 114 buildbucket_client.BuildbucketError(build_error['error']), None)) |
| 116 else: | 115 else: |
| 117 try_job_results.append(( | 116 try_job_results.append(( |
| 118 None, buildbucket_client.BuildbucketBuild(build_error['build']))) | 117 None, buildbucket_client.BuildbucketBuild(build_error['build']))) |
| 119 REQUEST_COUNTER[build_id] += 1 | 118 REQUEST_COUNTER[build_id] += 1 |
| 120 return try_job_results | 119 return try_job_results |
| 121 | 120 |
| 122 self.mock(buildbucket_client, 'GetTryJobs', Mocked_GetTryJobs) | 121 self.mock(buildbucket_client, 'GetTryJobs', Mocked_GetTryJobs) |
| 123 | 122 |
| 124 def _MockGetTryJobSettings(self): | |
| 125 return { | |
| 126 'server_query_interval_seconds': 60, | |
| 127 'job_timeout_hours': 5, | |
| 128 'allowed_response_error_times': 5 | |
| 129 } | |
| 130 | |
| 131 def setUp(self): | 123 def setUp(self): |
| 132 super(MonitorTryJobPipelineTest, self).setUp() | 124 super(MonitorTryJobPipelineTest, self).setUp() |
| 133 self.mock( | |
| 134 waterfall_config, 'GetTryJobSettings', self._MockGetTryJobSettings) | |
| 135 self.mock(time, 'sleep', lambda x: None) | 125 self.mock(time, 'sleep', lambda x: None) |
| 136 | 126 |
| 137 def testMicrosecondsToDatetime(self): | 127 def testMicrosecondsToDatetime(self): |
| 138 self.assertEqual( | 128 self.assertEqual( |
| 139 datetime(2016, 2, 1, 22, 59, 34), | 129 datetime(2016, 2, 1, 22, 59, 34), |
| 140 MonitorTryJobPipeline._MicrosecondsToDatetime(1454367574000000)) | 130 MonitorTryJobPipeline._MicrosecondsToDatetime(1454367574000000)) |
| 141 self.assertIsNone(MonitorTryJobPipeline._MicrosecondsToDatetime(None)) | 131 self.assertIsNone(MonitorTryJobPipeline._MicrosecondsToDatetime(None)) |
| 142 | 132 |
| 143 def testUpdateTryJobMetadataForBuildError(self): | 133 def testUpdateTryJobMetadataForBuildError(self): |
| 144 error_data = { | 134 error_data = { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 try_job.compile_results = [ | 198 try_job.compile_results = [ |
| 209 { | 199 { |
| 210 'report': None, | 200 'report': None, |
| 211 'url': 'url', | 201 'url': 'url', |
| 212 'try_job_id': '1', | 202 'try_job_id': '1', |
| 213 } | 203 } |
| 214 ] | 204 ] |
| 215 try_job.status = wf_analysis_status.ANALYZING | 205 try_job.status = wf_analysis_status.ANALYZING |
| 216 try_job.put() | 206 try_job.put() |
| 217 self._MockGetTryJobs(try_job_id) | 207 self._MockGetTryJobs(try_job_id) |
| 218 self._MockGetTryJobSettings() | |
| 219 | 208 |
| 220 pipeline = MonitorTryJobPipeline() | 209 pipeline = MonitorTryJobPipeline() |
| 221 compile_result = pipeline.run( | 210 compile_result = pipeline.run( |
| 222 master_name, builder_name, build_number, TryJobType.COMPILE, | 211 master_name, builder_name, build_number, TryJobType.COMPILE, |
| 223 try_job_id) | 212 try_job_id) |
| 224 | 213 |
| 225 expected_compile_result = { | 214 expected_compile_result = { |
| 226 'report': { | 215 'report': { |
| 227 'result': { | 216 'result': { |
| 228 'rev1': 'passed', | 217 'rev1': 'passed', |
| (...skipping 26 matching lines...) Expand all Loading... |
| 255 try_job.test_results = [ | 244 try_job.test_results = [ |
| 256 { | 245 { |
| 257 'report': None, | 246 'report': None, |
| 258 'url': 'url', | 247 'url': 'url', |
| 259 'try_job_id': '3', | 248 'try_job_id': '3', |
| 260 } | 249 } |
| 261 ] | 250 ] |
| 262 try_job.status = wf_analysis_status.ANALYZING | 251 try_job.status = wf_analysis_status.ANALYZING |
| 263 try_job.put() | 252 try_job.put() |
| 264 self._MockGetTryJobs(try_job_id) | 253 self._MockGetTryJobs(try_job_id) |
| 265 self._MockGetTryJobSettings() | |
| 266 | 254 |
| 267 pipeline = MonitorTryJobPipeline() | 255 pipeline = MonitorTryJobPipeline() |
| 268 test_result = pipeline.run( | 256 test_result = pipeline.run( |
| 269 master_name, builder_name, build_number, TryJobType.TEST, | 257 master_name, builder_name, build_number, TryJobType.TEST, |
| 270 try_job_id) | 258 try_job_id) |
| 271 | 259 |
| 272 expected_test_result = { | 260 expected_test_result = { |
| 273 'report': { | 261 'report': { |
| 274 'result': { | 262 'result': { |
| 275 'rev1': { | 263 'rev1': { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 303 try_job_id = '3' | 291 try_job_id = '3' |
| 304 | 292 |
| 305 try_job = WfTryJob.Create(master_name, builder_name, build_number).put() | 293 try_job = WfTryJob.Create(master_name, builder_name, build_number).put() |
| 306 | 294 |
| 307 pipeline = MonitorTryJobPipeline() | 295 pipeline = MonitorTryJobPipeline() |
| 308 pipeline._UpdateTryJobResult( | 296 pipeline._UpdateTryJobResult( |
| 309 buildbucket_client.BuildbucketBuild.STARTED, master_name, builder_name, | 297 buildbucket_client.BuildbucketBuild.STARTED, master_name, builder_name, |
| 310 build_number, TryJobType.TEST, try_job_id, 'url') | 298 build_number, TryJobType.TEST, try_job_id, 'url') |
| 311 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 299 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 312 self.assertEqual(wf_analysis_status.ANALYZING, try_job.status) | 300 self.assertEqual(wf_analysis_status.ANALYZING, try_job.status) |
| OLD | NEW |