Chromium Code Reviews| 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 os | 5 import os |
| 6 | 6 |
| 7 from testing_utils import testing | |
| 8 | |
| 9 from model.wf_analysis import WfAnalysis | 7 from model.wf_analysis import WfAnalysis |
| 10 from model.wf_step import WfStep | 8 from model.wf_step import WfStep |
| 11 from pipeline_wrapper import pipeline_handlers | 9 from pipeline_wrapper import pipeline_handlers |
| 12 from waterfall import buildbot | 10 from waterfall import buildbot |
| 13 from waterfall import try_job_util | 11 from waterfall import try_job_util |
| 14 from waterfall import waterfall_config | |
| 15 from waterfall.extract_signal_pipeline import ExtractSignalPipeline | 12 from waterfall.extract_signal_pipeline import ExtractSignalPipeline |
| 13 from waterfall.test import wf_configured_test_case | |
| 16 | 14 |
| 17 | 15 |
| 18 class ExtractSignalPipelineTest(testing.AppengineTestCase): | 16 class ExtractSignalPipelineTest( |
| 17 wf_configured_test_case.WaterfallConfiguredTestCase): | |
| 19 app_module = pipeline_handlers._APP | 18 app_module = pipeline_handlers._APP |
| 20 | 19 |
| 21 def setUp(self): | 20 def setUp(self): |
| 22 super(ExtractSignalPipelineTest, self).setUp() | 21 super(ExtractSignalPipelineTest, self).setUp() |
| 23 | 22 |
| 24 def Mocked_ScheduleTryJobIfNeeded(*_, **__): | 23 def Mocked_ScheduleTryJobIfNeeded(*_, **__): |
| 25 pass | 24 pass |
| 26 self.mock( | 25 self.mock( |
| 27 try_job_util, 'ScheduleTryJobIfNeeded', Mocked_ScheduleTryJobIfNeeded) | 26 try_job_util, 'ScheduleTryJobIfNeeded', Mocked_ScheduleTryJobIfNeeded) |
| 28 | 27 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 84 step_name = 'abc_test' | 83 step_name = 'abc_test' |
| 85 step = WfStep.Create(master_name, builder_name, build_number, step_name) | 84 step = WfStep.Create(master_name, builder_name, build_number, step_name) |
| 86 step.log_data = self.ABC_TEST_FAILURE_LOG | 85 step.log_data = self.ABC_TEST_FAILURE_LOG |
| 87 step.put() | 86 step.put() |
| 88 | 87 |
| 89 step_log_url = buildbot.CreateStdioLogUrl( | 88 step_log_url = buildbot.CreateStdioLogUrl( |
| 90 master_name, builder_name, build_number, step_name) | 89 master_name, builder_name, build_number, step_name) |
| 91 with self.mock_urlfetch() as urlfetch: | 90 with self.mock_urlfetch() as urlfetch: |
| 92 urlfetch.register_handler(step_log_url, 'If used, test should fail!') | 91 urlfetch.register_handler(step_log_url, 'If used, test should fail!') |
| 93 | 92 |
| 94 def MockStepIsSupportedForMaster(*_): | |
| 95 return True | |
| 96 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 97 MockStepIsSupportedForMaster) | |
| 98 self._CreateAndSaveWfAnanlysis( | 93 self._CreateAndSaveWfAnanlysis( |
| 99 master_name, builder_name, build_number) | 94 master_name, builder_name, build_number) |
| 100 | 95 |
| 101 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) | 96 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) |
| 102 signals = pipeline.run(self.FAILURE_INFO, False) | 97 signals = pipeline.run(self.FAILURE_INFO, False) |
| 103 | 98 |
| 104 self.assertEqual(self.FAILURE_SIGNALS, signals) | 99 self.assertEqual(self.FAILURE_SIGNALS, signals) |
| 105 | 100 |
| 106 def MockGetStdiolog(self, master_name, builder_name, build_number, step_name): | 101 def MockGetStdiolog(self, master_name, builder_name, build_number, step_name): |
| 107 step_log_url = buildbot.CreateStdioLogUrl( | 102 step_log_url = buildbot.CreateStdioLogUrl( |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 build_number = 123 | 189 build_number = 123 |
| 195 step_name = 'abc_test' | 190 step_name = 'abc_test' |
| 196 | 191 |
| 197 # Mock both stdiolog and gtest json results to test whether Findit will | 192 # Mock both stdiolog and gtest json results to test whether Findit will |
| 198 # go to step log first when both logs exist. | 193 # go to step log first when both logs exist. |
| 199 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) | 194 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 200 self.MockGetGtestJsonResult() | 195 self.MockGetGtestJsonResult() |
| 201 self._CreateAndSaveWfAnanlysis( | 196 self._CreateAndSaveWfAnanlysis( |
| 202 master_name, builder_name, build_number) | 197 master_name, builder_name, build_number) |
| 203 | 198 |
| 204 def MockStepIsSupportedForMaster(*_): | |
| 205 return True | |
| 206 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 207 MockStepIsSupportedForMaster) | |
| 208 | |
| 209 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) | 199 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) |
| 210 signals = pipeline.run(self.FAILURE_INFO, False) | 200 signals = pipeline.run(self.FAILURE_INFO, False) |
| 211 | 201 |
| 212 step = WfStep.Get(master_name, builder_name, build_number, step_name) | 202 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 213 | 203 |
| 214 expected_files = { | 204 expected_files = { |
| 215 'a/b/u2s1.cc': [567], | 205 'a/b/u2s1.cc': [567], |
| 216 'a/b/u3s2.cc': [110] | 206 'a/b/u3s2.cc': [110] |
| 217 } | 207 } |
| 218 | 208 |
| 219 self.assertIsNotNone(step) | 209 self.assertIsNotNone(step) |
| 220 self.assertIsNotNone(step.log_data) | 210 self.assertIsNotNone(step.log_data) |
| 221 self.assertEqual(expected_files, signals['abc_test']['files']) | 211 self.assertEqual(expected_files, signals['abc_test']['files']) |
| 222 | 212 |
| 223 def testGetSignalFromStepLogFlaky(self): | 213 def testGetSignalFromStepLogFlaky(self): |
| 224 master_name = 'm' | 214 master_name = 'm' |
| 225 builder_name = 'b' | 215 builder_name = 'b' |
| 226 build_number = 124 | 216 build_number = 124 |
| 227 step_name = 'abc_test' | 217 step_name = 'abc_test' |
| 228 | 218 |
| 229 failure_info = { | 219 failure_info = { |
| 230 'master_name': 'm', | 220 'master_name': master_name, |
| 231 'builder_name': 'b', | 221 'builder_name': builder_name, |
| 232 'build_number': 124, | 222 'build_number': build_number, |
| 233 'failed': True, | 223 'failed': True, |
| 234 'chromium_revision': 'a_git_hash', | 224 'chromium_revision': 'a_git_hash', |
| 235 'failed_steps': { | 225 'failed_steps': { |
| 236 'abc_test': { | 226 'abc_test': { |
| 237 'last_pass': 123, | 227 'last_pass': 123, |
| 238 'current_failure': 124, | 228 'current_failure': 124, |
| 239 'first_failure': 124, | 229 'first_failure': 124, |
| 240 } | 230 } |
| 241 } | 231 } |
| 242 } | 232 } |
| 243 | 233 |
| 244 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) | 234 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 245 self.MockGetGtestJsonResult() | 235 self.MockGetGtestJsonResult() |
| 246 self._CreateAndSaveWfAnanlysis( | 236 self._CreateAndSaveWfAnanlysis( |
| 247 master_name, builder_name, build_number) | 237 master_name, builder_name, build_number) |
| 248 | 238 |
| 249 def MockStepIsSupportedForMaster(*_): | |
| 250 return True | |
| 251 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 252 MockStepIsSupportedForMaster) | |
| 253 | |
| 254 pipeline = ExtractSignalPipeline() | 239 pipeline = ExtractSignalPipeline() |
| 255 signals = pipeline.run(failure_info, False) | 240 signals = pipeline.run(failure_info, False) |
| 256 | 241 |
| 257 step = WfStep.Get(master_name, builder_name, build_number, step_name) | 242 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 258 | 243 |
| 259 self.assertIsNotNone(step) | 244 self.assertIsNotNone(step) |
| 260 self.assertIsNotNone(step.log_data) | 245 self.assertIsNotNone(step.log_data) |
| 261 self.assertEqual('flaky', step.log_data) | 246 self.assertEqual('flaky', step.log_data) |
| 262 self.assertEqual({}, signals['abc_test']['files']) | 247 self.assertEqual({}, signals['abc_test']['files']) |
| 263 | 248 |
| 264 def testGetSignalFromStepLogInvalid(self): | 249 def testGetSignalFromStepLogInvalid(self): |
| 265 master_name = 'm' | 250 master_name = 'm' |
| 266 builder_name = 'b' | 251 builder_name = 'b' |
| 267 build_number = 125 | 252 build_number = 125 |
| 268 step_name = 'abc_test' | 253 step_name = 'abc_test' |
| 269 | 254 |
| 270 failure_info = { | 255 failure_info = { |
| 271 'master_name': 'm', | 256 'master_name': master_name, |
| 272 'builder_name': 'b', | 257 'builder_name': builder_name, |
| 273 'build_number': 125, | 258 'build_number': build_number, |
| 274 'failed': True, | 259 'failed': True, |
| 275 'chromium_revision': 'a_git_hash', | 260 'chromium_revision': 'a_git_hash', |
| 276 'failed_steps': { | 261 'failed_steps': { |
| 277 'abc_test': { | 262 step_name: { |
| 278 'last_pass': 124, | 263 'last_pass': 124, |
| 279 'current_failure': 125, | 264 'current_failure': 125, |
| 280 'first_failure': 125, | 265 'first_failure': 125, |
| 281 } | 266 } |
| 282 } | 267 } |
| 283 } | 268 } |
| 284 | 269 |
| 285 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) | 270 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 286 self.MockGetGtestJsonResult() | 271 self.MockGetGtestJsonResult() |
| 287 self._CreateAndSaveWfAnanlysis( | 272 self._CreateAndSaveWfAnanlysis( |
| 288 master_name, builder_name, build_number) | 273 master_name, builder_name, build_number) |
| 289 | 274 |
| 290 def MockStepIsSupportedForMaster(*_): | |
| 291 return True | |
| 292 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 293 MockStepIsSupportedForMaster) | |
| 294 | |
| 295 pipeline = ExtractSignalPipeline() | 275 pipeline = ExtractSignalPipeline() |
| 296 signals = pipeline.run(failure_info, False) | 276 signals = pipeline.run(failure_info, False) |
| 297 | 277 |
| 298 step = WfStep.Get(master_name, builder_name, build_number, step_name) | 278 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 299 | 279 |
| 300 expected_files = { | 280 expected_files = { |
| 301 'content/common/gpu/media/v4l2_video_encode_accelerator.cc': [306] | 281 'content/common/gpu/media/v4l2_video_encode_accelerator.cc': [306] |
| 302 } | 282 } |
| 303 | 283 |
| 304 self.assertIsNotNone(step) | 284 self.assertIsNotNone(step) |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 'Unittest3.Subtest2': { | 366 'Unittest3.Subtest2': { |
| 387 'files': { | 367 'files': { |
| 388 'a/b/u3s2.cc': [110, 123] | 368 'a/b/u3s2.cc': [110, 123] |
| 389 }, | 369 }, |
| 390 'keywords': {} | 370 'keywords': {} |
| 391 } | 371 } |
| 392 } | 372 } |
| 393 } | 373 } |
| 394 } | 374 } |
| 395 | 375 |
| 396 def MockStepIsSupportedForMaster(*_): | |
| 397 return True | |
| 398 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 399 MockStepIsSupportedForMaster) | |
| 400 | |
| 401 self._CreateAndSaveWfAnanlysis( | 376 self._CreateAndSaveWfAnanlysis( |
| 402 master_name, builder_name, build_number) | 377 master_name, builder_name, build_number) |
| 403 | 378 |
| 404 pipeline = ExtractSignalPipeline() | 379 pipeline = ExtractSignalPipeline() |
| 405 signals = pipeline.run(failure_info, False) | 380 signals = pipeline.run(failure_info, False) |
| 406 self.assertEqual(expected_signals, signals) | 381 self.assertEqual(expected_signals, signals) |
| 407 | 382 |
| 408 def testExtractSignalsForTestsFlaky(self): | 383 def testExtractSignalsForTestsFlaky(self): |
| 409 master_name = 'm' | 384 master_name = 'm' |
| 410 builder_name = 'b' | 385 builder_name = 'b' |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 step.put() | 418 step.put() |
| 444 | 419 |
| 445 expected_signals = { | 420 expected_signals = { |
| 446 'abc_test': { | 421 'abc_test': { |
| 447 'files': {}, | 422 'files': {}, |
| 448 'keywords': {}, | 423 'keywords': {}, |
| 449 'tests': {} | 424 'tests': {} |
| 450 } | 425 } |
| 451 } | 426 } |
| 452 | 427 |
| 453 def MockStepIsSupportedForMaster(*_): | |
| 454 return True | |
| 455 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 456 MockStepIsSupportedForMaster) | |
| 457 self._CreateAndSaveWfAnanlysis( | 428 self._CreateAndSaveWfAnanlysis( |
| 458 master_name, builder_name, build_number) | 429 master_name, builder_name, build_number) |
| 459 | 430 |
| 460 pipeline = ExtractSignalPipeline() | 431 pipeline = ExtractSignalPipeline() |
| 461 signals = pipeline.run(failure_info, False) | 432 signals = pipeline.run(failure_info, False) |
| 462 self.assertEqual(expected_signals, signals) | 433 self.assertEqual(expected_signals, signals) |
| 463 | 434 |
| 464 def testBailOutForUnsupportedStep(self): | 435 def testBailOutForUnsupportedStep(self): |
| 465 master_name = 'm' | 436 master_name = 'm' |
| 466 builder_name = 'b' | 437 builder_name = 'b' |
| 467 build_number = 123 | 438 build_number = 123 |
| 468 supported_step_name = 'abc_test' | 439 supported_step_name = 'abc_test' |
| 440 unsupported_step_name = 'step6' | |
|
stgao
2016/03/31 18:07:13
We'd better to add 'unsupported_' to the step name
lijeffrey
2016/03/31 22:50:20
Done.
| |
| 469 failure_info = { | 441 failure_info = { |
| 470 'master_name': master_name, | 442 'master_name': master_name, |
| 471 'builder_name': 'b', | 443 'builder_name': 'b', |
| 472 'build_number': 123, | 444 'build_number': 123, |
| 473 'failed': True, | 445 'failed': True, |
| 474 'chromium_revision': 'a_git_hash', | 446 'chromium_revision': 'a_git_hash', |
| 475 'failed_steps': { | 447 'failed_steps': { |
| 476 supported_step_name: { | 448 supported_step_name: { |
| 477 'last_pass': 122, | 449 'last_pass': 122, |
| 478 'current_failure': 123, | 450 'current_failure': 123, |
| 479 'first_failure': 123, | 451 'first_failure': 123, |
| 480 }, | 452 }, |
| 481 'not_supported': { | 453 unsupported_step_name: { |
| 482 } | 454 } |
| 483 } | 455 } |
| 484 } | 456 } |
| 485 | 457 |
| 486 def MockStepIsSupportedForMaster(step_name, _): | |
| 487 return step_name == supported_step_name | |
| 488 | |
| 489 def MockGetGtestResultLog(*_): | 458 def MockGetGtestResultLog(*_): |
| 490 return None | 459 return None |
| 491 | 460 |
| 492 self.mock(waterfall_config, 'StepIsSupportedForMaster', | |
| 493 MockStepIsSupportedForMaster) | |
| 494 self.MockGetStdiolog(master_name, builder_name, build_number, | 461 self.MockGetStdiolog(master_name, builder_name, build_number, |
| 495 supported_step_name) | 462 supported_step_name) |
| 496 self.mock(buildbot, 'GetGtestResultLog', MockGetGtestResultLog) | 463 self.mock(buildbot, 'GetGtestResultLog', MockGetGtestResultLog) |
| 497 self._CreateAndSaveWfAnanlysis( | 464 self._CreateAndSaveWfAnanlysis( |
| 498 master_name, builder_name, build_number) | 465 master_name, builder_name, build_number) |
| 499 | 466 |
| 500 pipeline = ExtractSignalPipeline() | 467 pipeline = ExtractSignalPipeline() |
| 501 signals = pipeline.run(failure_info, False) | 468 signals = pipeline.run(failure_info, False) |
| 502 self.assertEqual(self.FAILURE_SIGNALS, signals) | 469 self.assertEqual(self.FAILURE_SIGNALS, signals) |
| OLD | NEW |