| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 logging | 5 import logging |
| 6 | 6 |
| 7 from testing_utils import testing | 7 from testing_utils import testing |
| 8 | 8 |
| 9 from common import constants |
| 9 from model.wf_analysis import WfAnalysis | 10 from model.wf_analysis import WfAnalysis |
| 10 from model import wf_analysis_status | 11 from model import analysis_status |
| 11 from pipeline_wrapper import pipeline_handlers | 12 from pipeline_wrapper import pipeline_handlers |
| 12 from waterfall import build_failure_analysis_pipelines | 13 from waterfall import build_failure_analysis_pipelines |
| 13 | 14 |
| 14 | 15 |
| 15 class _MockRootPipeline(object): | 16 class _MockRootPipeline(object): |
| 16 STARTED = False | 17 STARTED = False |
| 17 | 18 |
| 18 def __init__(self, master_name, builder_name, build_number, build_completed): | 19 def __init__(self, master_name, builder_name, build_number, build_completed): |
| 19 pass | 20 pass |
| 20 | 21 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 48 master_name, builder_name, build_number, failed_steps, False, False) | 49 master_name, builder_name, build_number, failed_steps, False, False) |
| 49 | 50 |
| 50 self.assertTrue(need_analysis) | 51 self.assertTrue(need_analysis) |
| 51 | 52 |
| 52 def testNewAnalysisIsNotNeededWhenNotForcedAfterCompletedAnalysis(self): | 53 def testNewAnalysisIsNotNeededWhenNotForcedAfterCompletedAnalysis(self): |
| 53 master_name = 'm' | 54 master_name = 'm' |
| 54 builder_name = 'b 1' | 55 builder_name = 'b 1' |
| 55 build_number = 123 | 56 build_number = 123 |
| 56 not_passed_steps = ['a', 'b'] | 57 not_passed_steps = ['a', 'b'] |
| 57 self._CreateAndSaveWfAnalysis(master_name, builder_name, build_number, | 58 self._CreateAndSaveWfAnalysis(master_name, builder_name, build_number, |
| 58 not_passed_steps, wf_analysis_status.ANALYZED) | 59 not_passed_steps, analysis_status.COMPLETED) |
| 59 | 60 |
| 60 failed_steps = ['a', 'b'] | 61 failed_steps = ['a', 'b'] |
| 61 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 62 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 62 master_name, builder_name, build_number, failed_steps, False, False) | 63 master_name, builder_name, build_number, failed_steps, False, False) |
| 63 | 64 |
| 64 self.assertFalse(need_analysis) | 65 self.assertFalse(need_analysis) |
| 65 | 66 |
| 66 def testNewAnalysisIsNotNeededWhenForcedBeforeCompletedAnalysis(self): | 67 def testNewAnalysisIsNotNeededWhenForcedBeforeCompletedAnalysis(self): |
| 67 master_name = 'm' | 68 master_name = 'm' |
| 68 builder_name = 'b 1' | 69 builder_name = 'b 1' |
| 69 build_number = 123 | 70 build_number = 123 |
| 70 not_passed_steps = [] | 71 not_passed_steps = [] |
| 71 self._CreateAndSaveWfAnalysis( | 72 self._CreateAndSaveWfAnalysis( |
| 72 master_name, builder_name, build_number, | 73 master_name, builder_name, build_number, |
| 73 not_passed_steps, wf_analysis_status.ANALYZING) | 74 not_passed_steps, analysis_status.RUNNING) |
| 74 | 75 |
| 75 failed_steps = ['a'] | 76 failed_steps = ['a'] |
| 76 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 77 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 77 master_name, builder_name, build_number, failed_steps, False, True) | 78 master_name, builder_name, build_number, failed_steps, False, True) |
| 78 | 79 |
| 79 self.assertFalse(need_analysis) | 80 self.assertFalse(need_analysis) |
| 80 | 81 |
| 81 def testNewAnalysisIsNeededWhenForcedAfterCompletedAnalysis(self): | 82 def testNewAnalysisIsNeededWhenForcedAfterCompletedAnalysis(self): |
| 82 master_name = 'm' | 83 master_name = 'm' |
| 83 builder_name = 'b 1' | 84 builder_name = 'b 1' |
| 84 build_number = 123 | 85 build_number = 123 |
| 85 not_passed_steps = ['a'] | 86 not_passed_steps = ['a'] |
| 86 self._CreateAndSaveWfAnalysis( | 87 self._CreateAndSaveWfAnalysis( |
| 87 master_name, builder_name, build_number, | 88 master_name, builder_name, build_number, |
| 88 not_passed_steps, wf_analysis_status.ANALYZED) | 89 not_passed_steps, analysis_status.COMPLETED) |
| 89 | 90 |
| 90 failed_steps = ['a'] | 91 failed_steps = ['a'] |
| 91 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 92 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 92 master_name, builder_name, build_number, failed_steps, False, True) | 93 master_name, builder_name, build_number, failed_steps, False, True) |
| 93 | 94 |
| 94 self.assertTrue(need_analysis) | 95 self.assertTrue(need_analysis) |
| 95 | 96 |
| 96 def testNewAnalysisIsNotNeededWhenFailedStepsNotProvided(self): | 97 def testNewAnalysisIsNotNeededWhenFailedStepsNotProvided(self): |
| 97 master_name = 'm' | 98 master_name = 'm' |
| 98 builder_name = 'b 1' | 99 builder_name = 'b 1' |
| 99 build_number = 123 | 100 build_number = 123 |
| 100 not_passed_steps = ['a'] | 101 not_passed_steps = ['a'] |
| 101 self._CreateAndSaveWfAnalysis( | 102 self._CreateAndSaveWfAnalysis( |
| 102 master_name, builder_name, build_number, | 103 master_name, builder_name, build_number, |
| 103 not_passed_steps, wf_analysis_status.ANALYZED) | 104 not_passed_steps, analysis_status.COMPLETED) |
| 104 | 105 |
| 105 failed_steps = None | 106 failed_steps = None |
| 106 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 107 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 107 master_name, builder_name, build_number, failed_steps, False, False) | 108 master_name, builder_name, build_number, failed_steps, False, False) |
| 108 | 109 |
| 109 self.assertFalse(need_analysis) | 110 self.assertFalse(need_analysis) |
| 110 | 111 |
| 111 def testNewAnalysisIsNotNeededWhenNewFailedStepsBeforeCompletedAnalysis(self): | 112 def testNewAnalysisIsNotNeededWhenNewFailedStepsBeforeCompletedAnalysis(self): |
| 112 master_name = 'm' | 113 master_name = 'm' |
| 113 builder_name = 'b 1' | 114 builder_name = 'b 1' |
| 114 build_number = 123 | 115 build_number = 123 |
| 115 not_passed_steps = ['a'] | 116 not_passed_steps = ['a'] |
| 116 self._CreateAndSaveWfAnalysis( | 117 self._CreateAndSaveWfAnalysis( |
| 117 master_name, builder_name, build_number, | 118 master_name, builder_name, build_number, |
| 118 not_passed_steps, wf_analysis_status.ANALYZING) | 119 not_passed_steps, analysis_status.RUNNING) |
| 119 | 120 |
| 120 failed_steps = ['a', 'b'] | 121 failed_steps = ['a', 'b'] |
| 121 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 122 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 122 master_name, builder_name, build_number, failed_steps, False, False) | 123 master_name, builder_name, build_number, failed_steps, False, False) |
| 123 | 124 |
| 124 self.assertFalse(need_analysis) | 125 self.assertFalse(need_analysis) |
| 125 | 126 |
| 126 def testNewAnalysisIsNeededWhenNewFailedStepsAfterCompletedAnalysis(self): | 127 def testNewAnalysisIsNeededWhenNewFailedStepsAfterCompletedAnalysis(self): |
| 127 master_name = 'm' | 128 master_name = 'm' |
| 128 builder_name = 'b 1' | 129 builder_name = 'b 1' |
| 129 build_number = 123 | 130 build_number = 123 |
| 130 not_passed_steps = ['a'] | 131 not_passed_steps = ['a'] |
| 131 self._CreateAndSaveWfAnalysis( | 132 self._CreateAndSaveWfAnalysis( |
| 132 master_name, builder_name, build_number, | 133 master_name, builder_name, build_number, |
| 133 not_passed_steps, wf_analysis_status.ANALYZED) | 134 not_passed_steps, analysis_status.COMPLETED) |
| 134 | 135 |
| 135 failed_steps = ['a', 'b'] | 136 failed_steps = ['a', 'b'] |
| 136 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 137 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 137 master_name, builder_name, build_number, failed_steps, False, False) | 138 master_name, builder_name, build_number, failed_steps, False, False) |
| 138 | 139 |
| 139 self.assertTrue(need_analysis) | 140 self.assertTrue(need_analysis) |
| 140 | 141 |
| 141 def testNewAnalysisIsNeededWhenBuildCompletedAfterLastAnalysis(self): | 142 def testNewAnalysisIsNeededWhenBuildCompletedAfterLastAnalysis(self): |
| 142 master_name = 'm' | 143 master_name = 'm' |
| 143 builder_name = 'b 1' | 144 builder_name = 'b 1' |
| 144 build_number = 123 | 145 build_number = 123 |
| 145 not_passed_steps = ['a'] | 146 not_passed_steps = ['a'] |
| 146 self._CreateAndSaveWfAnalysis( | 147 self._CreateAndSaveWfAnalysis( |
| 147 master_name, builder_name, build_number, | 148 master_name, builder_name, build_number, |
| 148 not_passed_steps, wf_analysis_status.ANALYZED, build_completed=False) | 149 not_passed_steps, analysis_status.COMPLETED, build_completed=False) |
| 149 | 150 |
| 150 failed_steps = ['a'] | 151 failed_steps = ['a'] |
| 151 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( | 152 need_analysis = build_failure_analysis_pipelines.NeedANewAnalysis( |
| 152 master_name, builder_name, build_number, failed_steps, True, False) | 153 master_name, builder_name, build_number, failed_steps, True, False) |
| 153 | 154 |
| 154 self.assertTrue(need_analysis) | 155 self.assertTrue(need_analysis) |
| 155 | 156 |
| 156 def testStartPipelineForNewAnalysis(self): | 157 def testStartPipelineForNewAnalysis(self): |
| 157 master_name = 'm' | 158 master_name = 'm' |
| 158 builder_name = 'b' | 159 builder_name = 'b' |
| 159 build_number = 124 | 160 build_number = 124 |
| 160 | 161 |
| 161 self.mock(build_failure_analysis_pipelines.analyze_build_failure_pipeline, | 162 self.mock(build_failure_analysis_pipelines.analyze_build_failure_pipeline, |
| 162 'AnalyzeBuildFailurePipeline', | 163 'AnalyzeBuildFailurePipeline', |
| 163 _MockRootPipeline) | 164 _MockRootPipeline) |
| 164 _MockRootPipeline.STARTED = False | 165 _MockRootPipeline.STARTED = False |
| 165 | 166 |
| 166 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( | 167 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( |
| 167 master_name, builder_name, build_number, failed_steps=['a'], | 168 master_name, builder_name, build_number, failed_steps=['a'], |
| 168 build_completed=False, force=False, queue_name='default') | 169 build_completed=False, force=False, queue_name=constants.DEFAULT_QUEUE) |
| 169 | 170 |
| 170 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 171 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 171 | 172 |
| 172 self.assertTrue(_MockRootPipeline.STARTED) | 173 self.assertTrue(_MockRootPipeline.STARTED) |
| 173 self.assertIsNotNone(analysis) | 174 self.assertIsNotNone(analysis) |
| 174 | 175 |
| 175 def testNotStartPipelineForNewAnalysis(self): | 176 def testNotStartPipelineForNewAnalysis(self): |
| 176 master_name = 'm' | 177 master_name = 'm' |
| 177 builder_name = 'b' | 178 builder_name = 'b' |
| 178 build_number = 123 | 179 build_number = 123 |
| 179 not_passed_steps = ['a'] | 180 not_passed_steps = ['a'] |
| 180 | 181 |
| 181 self._CreateAndSaveWfAnalysis( | 182 self._CreateAndSaveWfAnalysis( |
| 182 master_name, builder_name, build_number, | 183 master_name, builder_name, build_number, |
| 183 not_passed_steps, wf_analysis_status.ANALYZING) | 184 not_passed_steps, analysis_status.RUNNING) |
| 184 | 185 |
| 185 self.mock(build_failure_analysis_pipelines.analyze_build_failure_pipeline, | 186 self.mock(build_failure_analysis_pipelines.analyze_build_failure_pipeline, |
| 186 'AnalyzeBuildFailurePipeline', | 187 'AnalyzeBuildFailurePipeline', |
| 187 _MockRootPipeline) | 188 _MockRootPipeline) |
| 188 _MockRootPipeline.STARTED = False | 189 _MockRootPipeline.STARTED = False |
| 189 | 190 |
| 190 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( | 191 build_failure_analysis_pipelines.ScheduleAnalysisIfNeeded( |
| 191 master_name, builder_name, build_number, failed_steps=['a'], | 192 master_name, builder_name, build_number, failed_steps=['a'], |
| 192 build_completed=True, force=False, queue_name='default') | 193 build_completed=True, force=False, queue_name=constants.DEFAULT_QUEUE) |
| 193 | 194 |
| 194 self.assertFalse(_MockRootPipeline.STARTED) | 195 self.assertFalse(_MockRootPipeline.STARTED) |
| OLD | NEW |