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 |