Chromium Code Reviews| Index: appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py |
| diff --git a/appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py b/appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py |
| index c6a122366af9f8182d638ca18a17f113b2fda190..1e0c29fb4d3f5f3dd5cdb394fa3380ca42ecdf6e 100644 |
| --- a/appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py |
| +++ b/appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py |
| @@ -6,9 +6,12 @@ from common import constants |
| from common.pipeline_wrapper import pipeline_handlers |
| from model import analysis_status |
| from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| +from model.flake.flake_swarming_task import FlakeSwarmingTask |
| from waterfall.flake import recursive_flake_pipeline |
| from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline |
| from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline |
| +from waterfall.flake.recursive_flake_pipeline import get_next_run |
|
chanli
2016/08/18 00:50:31
nit: move this line up
caiw
2016/08/18 20:01:25
Done.
|
| +from waterfall.flake.recursive_flake_pipeline import sequential_next_run |
| from waterfall.test import wf_testcase |
| @@ -23,24 +26,46 @@ class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase): |
| analysis.status = status |
| analysis.put() |
| + def _CreateAndSaveFlakeSwarmingTask( |
| + self, master_name, builder_name, build_number, |
| + step_name, test_name, status): |
| + flake_swarming_task = FlakeSwarmingTask.Create( |
| + master_name, builder_name, build_number, step_name, test_name) |
| + flake_swarming_task.status = status |
| + flake_swarming_task.put() |
| + |
| def testRecursiveFlakePipeline(self): |
| master_name = 'm' |
| builder_name = 'b' |
| - master_build_number = 124 |
| - build_number = 124 |
| - run_build_number = 124 |
| + master_build_number = 100 |
| + build_number = 100 |
| + run_build_number = 100 |
| step_name = 's' |
| test_name = 't' |
| test_result_future = 'test_result_future' |
| queue_name = constants.DEFAULT_QUEUE |
| task_id = 'task_id' |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + |
| + } |
| + |
| self.MockPipeline( |
| recursive_flake_pipeline.TriggerFlakeSwarmingTaskPipeline, |
| 'task_id', |
| expected_args=[master_name, builder_name, |
| run_build_number, step_name, [test_name]], |
| expected_kwargs={}) |
| + |
| self.MockPipeline( |
| recursive_flake_pipeline.ProcessFlakeSwarmingTaskResultPipeline, |
| 'test_result_future', |
| @@ -48,82 +73,560 @@ class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase): |
| run_build_number, step_name, task_id, |
| master_build_number, test_name], |
| expected_kwargs={}) |
| + |
| self.MockPipeline( |
| recursive_flake_pipeline.NextBuildNumberPipeline, |
| '', |
| expected_args=[master_name, builder_name, master_build_number, |
| - step_name, test_name, test_result_future, |
| - queue_name], |
| + build_number, step_name, test_name, |
| + test_result_future, queue_name, |
| + flakiness_algorithm_results_dict], |
| expected_kwargs={}) |
| rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, |
| step_name, test_name, master_build_number, |
| + flakiness_algorithm_results_dict= |
| + flakiness_algorithm_results_dict, |
| queue_name=queue_name) |
| + |
| rfp.start(queue_name=queue_name) |
| self.execute_queued_tasks() |
| - def testNextBuildPipelineForNewRecursion(self): |
| + def testNextBuildPipelineForNewRecursionFirstFlake(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.08) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, test_name, |
| + test_result_future, queue_name, flakiness_algorithm_results_dict) |
| + self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| + |
| + def testNextBuildPipelineForNewRecursionFirstStable(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(0) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, |
| + test_name, test_result_future, queue_name, |
| + flakiness_algorithm_results_dict) |
| + self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| + |
| + def testNextBuildPipelineForNewRecursionFlakeInARow(self): |
| master_name = 'm' |
| builder_name = 'b' |
| - master_build_number = 124 |
| - build_number = 124 |
| + master_build_number = 100 |
| + build_number = 100 |
| step_name = 's' |
| test_name = 't' |
| test_result_future = 'trf' |
| queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 4, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + } |
| self._CreateAndSaveMasterFlakeAnalysis( |
| master_name, builder_name, build_number, step_name, |
| test_name, status=analysis_status.PENDING |
| ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| build_number, step_name, test_name) |
| - analysis.build_numbers.append(124) |
| + analysis.success_rates.append(0) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, |
| + test_name, test_result_future, queue_name, |
| + flakiness_algorithm_results_dict) |
| + self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| + |
| + def testNextBuildPipelineForNewRecursionStableInARow(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 4, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.50) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, |
| + test_name, test_result_future, queue_name, |
| + flakiness_algorithm_results_dict) |
| + self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| + |
| + |
| + def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 200, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.50) |
| + analysis.build_numbers.append(100) |
| analysis.put() |
| queue_name = {'x': False} |
| - # Unused argument (class method calls in python) - pylint: disable=W0613 |
| - def my_mocked_run(arg1, queue_name): |
| - queue_name['x'] = True |
| + def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| + queue_name['x'] = True # pragma: no cover |
| self.mock( |
| recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| NextBuildNumberPipeline.run( |
| NextBuildNumberPipeline(), master_name, builder_name, |
| - master_build_number, step_name, test_name, test_result_future, |
| - queue_name) |
| - self.assertTrue(queue_name['x']) |
| + master_build_number, build_number, step_name, test_name, |
| + test_result_future, queue_name, flakiness_algorithm_results_dict) |
| + self.assertFalse(queue_name['x']) |
| - def testNextBuildPipelineForNewRecursionWhenDone(self): |
| + def testNextBuildPipelineForFailedSwarmingTask(self): |
| master_name = 'm' |
| builder_name = 'b' |
| - master_build_number = 124 |
| - build_number = 124 |
| + master_build_number = 100 |
| + build_number = 100 |
| step_name = 's' |
| test_name = 't' |
| test_result_future = 'trf' |
| queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + } |
| self._CreateAndSaveMasterFlakeAnalysis( |
| master_name, builder_name, build_number, step_name, |
| test_name, status=analysis_status.PENDING |
| ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.ERROR |
| + ) |
| analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| build_number, step_name, test_name) |
| - for _ in range(10): |
| - analysis.build_numbers.append(124) |
| + analysis.success_rates.append(.50) |
| + analysis.build_numbers.append(100) |
| analysis.put() |
| queue_name = {'x': False} |
| - |
| - # Unused argument (class method calls in python) - pylint: disable=W0613 |
| - def my_mocked_run(*_): |
| + def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| queue_name['x'] = True # pragma: no cover |
| self.mock( |
| recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| NextBuildNumberPipeline.run( |
| NextBuildNumberPipeline(), master_name, builder_name, |
| - master_build_number, step_name, test_name, test_result_future, |
| - queue_name) |
| + master_build_number, build_number, step_name, test_name, |
| + test_result_future, queue_name, flakiness_algorithm_results_dict) |
| self.assertFalse(queue_name['x']) |
| + |
| + def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 4, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 200, |
| + 'upper_boundary': 210, |
| + 'lower_boundary_result': 'FLAKE', |
| + 'sequential_run_index': 0 |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.50) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + queue_name = {'x': False} |
| + def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| + queue_name['x'] = True # pragma: no cover |
| + |
| + self.mock( |
| + recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, test_name, |
| + test_result_future, queue_name, flakiness_algorithm_results_dict) |
| + self.assertTrue(queue_name['x']) |
| + |
| + def testGetNextRunSetStableLowerBoundary(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(1) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 4, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': False, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + } |
| + get_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(flakiness_algorithm_results_dict['lower_boundary'], |
| + build_number) |
| + self.assertEqual(flakiness_algorithm_results_dict['lower_boundary_result'], |
| + 'STABLE') |
| + |
| + def testGetNextRunSetFlakeLowerBoundary(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.5) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': False, |
| + 'last_build_number': 0, |
| + 'lower_boundary': False, |
| + 'upper_boundary': False, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + } |
| + get_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(flakiness_algorithm_results_dict['lower_boundary'], |
| + build_number) |
| + self.assertEqual(flakiness_algorithm_results_dict['lower_boundary_result'], |
| + 'FLAKE') |
| + |
| + def testSequentialNextRunFirstTime(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.5) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 100, |
| + 'upper_boundary': 110, |
| + 'lower_boundary_result': 'STABLE', |
| + 'sequential_run_index': 0 |
| + } |
| + next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(next_run, 101) |
| + |
| + def testSequentialFoundBorderFlake(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(.5) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 100, |
| + 'upper_boundary': 110, |
| + 'lower_boundary_result': 'STABLE', |
| + 'sequential_run_index': 1 |
| + } |
| + next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(next_run, False) |
| + self.assertEqual(analysis.suspected_flake_build_number, 101) |
| + |
| + def testSequentialFoundBorderStable(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(1) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 100, |
| + 'upper_boundary': 110, |
| + 'lower_boundary_result': 'FLAKE', |
| + 'sequential_run_index': 1 |
| + } |
| + next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(next_run, False) |
| + self.assertEqual(analysis.suspected_flake_build_number, 101) |
| + |
| + |
| + def testSequentialDidntFindBorderStable(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(1) |
| + analysis.build_numbers.append(100) |
| + analysis.put() |
| + |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 100, |
| + 'upper_boundary': 110, |
| + 'lower_boundary_result': 'STABLE', |
| + 'sequential_run_index': 1 |
| + } |
| + next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| + self.assertEqual(next_run, 102) |
| + self.assertEqual(analysis.suspected_flake_build_number, None) |
| + |
| + def testNextBuildPipelineStabledOutFlakedOutFirstTime(self): |
| + master_name = 'm' |
| + builder_name = 'b' |
| + master_build_number = 100 |
| + build_number = 100 |
| + step_name = 's' |
| + test_name = 't' |
| + test_result_future = 'trf' |
| + queue_name = constants.DEFAULT_QUEUE |
| + flakiness_algorithm_results_dict = { |
| + 'flakes_in_a_row': 0, |
| + 'stable_in_a_row': 0, |
| + 'stabled_out': True, |
| + 'flaked_out': True, |
| + 'last_build_number': 0, |
| + 'lower_boundary': 100, |
| + 'upper_boundary': 110, |
| + 'lower_boundary_result': False, |
| + 'sequential_run_index': 0 |
| + |
| + } |
| + self._CreateAndSaveMasterFlakeAnalysis( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.PENDING |
| + ) |
| + self._CreateAndSaveFlakeSwarmingTask( |
| + master_name, builder_name, build_number, step_name, |
| + test_name, status=analysis_status.COMPLETED |
| + ) |
| + analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| + build_number, step_name, test_name) |
| + analysis.success_rates.append(1) |
| + analysis.build_numbers.append(50) |
| + analysis.put() |
| + |
| + NextBuildNumberPipeline.run( |
| + NextBuildNumberPipeline(), master_name, builder_name, |
| + master_build_number, build_number, step_name, test_name, |
| + test_result_future, queue_name, flakiness_algorithm_results_dict) |
| + self.assertEquals( |
| + flakiness_algorithm_results_dict['sequential_run_index'], 1) |