| OLD | NEW |
| 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 import json | 5 import json |
| 6 | 6 |
| 7 from common import buildbucket_client | 7 from common import buildbucket_client |
| 8 from common.git_repository import GitRepository | 8 from common.git_repository import GitRepository |
| 9 from model import wf_analysis_result_status |
| 10 from model.wf_analysis import WfAnalysis |
| 9 from model.wf_try_job import WfTryJob | 11 from model.wf_try_job import WfTryJob |
| 10 from pipeline_wrapper import pipeline_handlers | 12 from pipeline_wrapper import pipeline_handlers |
| 11 from waterfall import swarming_util | 13 from waterfall import swarming_util |
| 12 from waterfall import trigger_swarming_task_pipeline | 14 from waterfall import trigger_swarming_task_pipeline |
| 13 from waterfall.swarming_task_request import SwarmingTaskRequest | 15 from waterfall.swarming_task_request import SwarmingTaskRequest |
| 14 from waterfall.swarming_tasks_to_try_job_pipeline import ( | 16 from waterfall.swarming_tasks_to_try_job_pipeline import ( |
| 15 SwarmingTasksToTryJobPipeline) | 17 SwarmingTasksToTryJobPipeline) |
| 16 from waterfall.test import wf_testcase | 18 from waterfall.test import wf_testcase |
| 17 from waterfall.try_job_type import TryJobType | 19 from waterfall.try_job_type import TryJobType |
| 18 | 20 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 'url': 'url', | 196 'url': 'url', |
| 195 'status': 'SCHEDULED', | 197 'status': 'SCHEDULED', |
| 196 } | 198 } |
| 197 } | 199 } |
| 198 ] | 200 ] |
| 199 self._MockTriggerTryJobs(responses) | 201 self._MockTriggerTryJobs(responses) |
| 200 self._MockGetTryJobs('1') | 202 self._MockGetTryJobs('1') |
| 201 self._MockGetChangeLog('rev2') | 203 self._MockGetChangeLog('rev2') |
| 202 | 204 |
| 203 WfTryJob.Create(master_name, builder_name, build_number).put() | 205 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 206 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 207 analysis.put() |
| 204 | 208 |
| 205 root_pipeline = SwarmingTasksToTryJobPipeline( | 209 root_pipeline = SwarmingTasksToTryJobPipeline( |
| 206 master_name, builder_name, build_number, 'rev1', 'rev2', ['rev2'], | 210 master_name, builder_name, build_number, 'rev1', 'rev2', ['rev2'], |
| 207 TryJobType.COMPILE) | 211 TryJobType.COMPILE) |
| 208 root_pipeline.start() | 212 root_pipeline.start() |
| 209 self.execute_queued_tasks() | 213 self.execute_queued_tasks() |
| 210 | 214 |
| 211 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 215 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 212 | 216 |
| 217 expected_suspected_cl = { |
| 218 'revision': 'rev2', |
| 219 'commit_position': '2', |
| 220 'review_url': 'url_2', |
| 221 'repo_name': 'chromium' |
| 222 } |
| 223 |
| 213 expected_try_job_results = [ | 224 expected_try_job_results = [ |
| 214 { | 225 { |
| 215 'report': { | 226 'report': { |
| 216 'result': { | 227 'result': { |
| 217 'rev1': 'passed', | 228 'rev1': 'passed', |
| 218 'rev2': 'failed' | 229 'rev2': 'failed' |
| 219 }, | 230 }, |
| 220 'metadata': { | 231 'metadata': { |
| 221 'regression_range_size': 2 | 232 'regression_range_size': 2 |
| 222 } | 233 } |
| 223 }, | 234 }, |
| 224 'url': 'url', | 235 'url': 'url', |
| 225 'try_job_id': '1', | 236 'try_job_id': '1', |
| 226 'culprit': { | 237 'culprit': { |
| 227 'compile': { | 238 'compile': expected_suspected_cl |
| 228 'revision': 'rev2', | |
| 229 'commit_position': '2', | |
| 230 'review_url': 'url_2' | |
| 231 } | |
| 232 } | 239 } |
| 233 } | 240 } |
| 234 ] | 241 ] |
| 242 |
| 235 self.assertEqual(expected_try_job_results, try_job.compile_results) | 243 self.assertEqual(expected_try_job_results, try_job.compile_results) |
| 244 self.assertEqual(analysis.result_status, |
| 245 wf_analysis_result_status.FOUND_UNTRIAGED) |
| 246 self.assertEqual(analysis.suspected_cls, |
| 247 [expected_suspected_cl]) |
| 236 | 248 |
| 237 def testSuccessfullyScheduleNewTryJobForTest(self): | 249 def testSuccessfullyScheduleNewTryJobForTest(self): |
| 238 master_name = 'm' | 250 master_name = 'm' |
| 239 builder_name = 'b' | 251 builder_name = 'b' |
| 240 build_number = 1 | 252 build_number = 1 |
| 241 targeted_tests = { | 253 targeted_tests = { |
| 242 'a_test': ['TestSuite1.test1', 'TestSuite1.test3'], | 254 'a_test': ['TestSuite1.test1', 'TestSuite1.test3'], |
| 243 'b_test': [], # Non-swarming test. | 255 'b_test': [], # Non-swarming test. |
| 244 } | 256 } |
| 245 | 257 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 'url': 'url', | 331 'url': 'url', |
| 320 'status': 'SCHEDULED', | 332 'status': 'SCHEDULED', |
| 321 } | 333 } |
| 322 } | 334 } |
| 323 ] | 335 ] |
| 324 self._MockTriggerTryJobs(responses) | 336 self._MockTriggerTryJobs(responses) |
| 325 self._MockGetTryJobs('2') | 337 self._MockGetTryJobs('2') |
| 326 self._MockGetChangeLog('rev1') | 338 self._MockGetChangeLog('rev1') |
| 327 | 339 |
| 328 WfTryJob.Create(master_name, builder_name, build_number).put() | 340 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 341 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 342 analysis.put() |
| 329 | 343 |
| 330 root_pipeline = SwarmingTasksToTryJobPipeline( | 344 root_pipeline = SwarmingTasksToTryJobPipeline( |
| 331 master_name, builder_name, build_number, 'rev0', 'rev1', ['rev1'], | 345 master_name, builder_name, build_number, 'rev0', 'rev1', ['rev1'], |
| 332 TryJobType.TEST, None, targeted_tests) | 346 TryJobType.TEST, None, targeted_tests) |
| 333 root_pipeline.start() | 347 root_pipeline.start() |
| 334 self.execute_queued_tasks() | 348 self.execute_queued_tasks() |
| 335 | 349 |
| 336 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 350 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 337 | 351 |
| 352 expected_suspected_cl = { |
| 353 'revision': 'rev1', |
| 354 'commit_position': '1', |
| 355 'review_url': 'url_1', |
| 356 'repo_name': 'chromium' |
| 357 } |
| 358 |
| 338 expected_try_job_results = [ | 359 expected_try_job_results = [ |
| 339 { | 360 { |
| 340 'report': { | 361 'report': { |
| 341 'result': { | 362 'result': { |
| 342 'rev1': { | 363 'rev1': { |
| 343 'a_test': { | 364 'a_test': { |
| 344 'status': 'failed', | 365 'status': 'failed', |
| 345 'valid': True, | 366 'valid': True, |
| 346 'failures': ['TestSuite1.test3'] | 367 'failures': ['TestSuite1.test3'] |
| 347 }, | 368 }, |
| 348 'b_test': { | 369 'b_test': { |
| 349 'status': 'passed', | 370 'status': 'passed', |
| 350 'valid': True, | 371 'valid': True, |
| 351 'failures': [], | 372 'failures': [], |
| 352 }, | 373 }, |
| 353 } | 374 } |
| 354 }, | 375 }, |
| 355 'metadata': { | 376 'metadata': { |
| 356 'regression_range_size': 2 | 377 'regression_range_size': 2 |
| 357 } | 378 } |
| 358 }, | 379 }, |
| 359 'url': 'url', | 380 'url': 'url', |
| 360 'try_job_id': '2', | 381 'try_job_id': '2', |
| 361 'culprit': { | 382 'culprit': { |
| 362 'a_test': { | 383 'a_test': { |
| 363 'tests': { | 384 'tests': { |
| 364 'TestSuite1.test3': { | 385 'TestSuite1.test3': expected_suspected_cl |
| 365 'revision': 'rev1', | |
| 366 'commit_position': '1', | |
| 367 'review_url': 'url_1' | |
| 368 } | |
| 369 } | 386 } |
| 370 } | 387 } |
| 371 } | 388 } |
| 372 } | 389 } |
| 373 ] | 390 ] |
| 374 | 391 |
| 375 self.assertEqual(expected_try_job_results, try_job.test_results) | 392 self.assertEqual(expected_try_job_results, try_job.test_results) |
| 393 self.assertEqual(analysis.result_status, |
| 394 wf_analysis_result_status.FOUND_UNTRIAGED) |
| 395 self.assertEqual(analysis.suspected_cls, [expected_suspected_cl]) |
| OLD | NEW |