| 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 pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers | 7 from pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers |
| 8 from testing_utils import testing | 8 from testing_utils import testing |
| 9 | 9 |
| 10 from common import chromium_deps |
| 10 from model.wf_analysis import WfAnalysis | 11 from model.wf_analysis import WfAnalysis |
| 11 from model import wf_analysis_status | 12 from model import wf_analysis_status |
| 12 from waterfall import buildbot | 13 from waterfall import buildbot |
| 13 from waterfall.analyze_build_failure_pipeline import AnalyzeBuildFailurePipeline | 14 from waterfall.analyze_build_failure_pipeline import AnalyzeBuildFailurePipeline |
| 14 from waterfall import lock_util | 15 from waterfall import lock_util |
| 15 | 16 |
| 16 | 17 |
| 17 class AnalyzeBuildFailurePipelineTest(testing.AppengineTestCase): | 18 class AnalyzeBuildFailurePipelineTest(testing.AppengineTestCase): |
| 18 app_module = handlers._APP | 19 app_module = handlers._APP |
| 19 | 20 |
| 20 def _MockChangeLog( | 21 def _MockChangeLog( |
| 21 self, urlfetch, user_name, revision, commit_position, file_path): | 22 self, urlfetch, user_name, revision, commit_position, file_path): |
| 22 url = ('https://chromium.googlesource.com/chromium/src/+/%s?format=json' | 23 url = ('https://chromium.googlesource.com/chromium/src/+/%s?format=json' |
| 23 % revision) | 24 % revision) |
| 24 | 25 |
| 25 COMMIT_LOG_TEMPLATE = """)]}' | 26 COMMIT_LOG_TEMPLATE = """)]}' |
| 26 { | 27 { |
| 27 "commit": "REVISION", | 28 "commit": "REVISION", |
| 28 "tree": "tree_rev", | 29 "tree": "tree_rev", |
| 29 "parents": [ | 30 "parents": [ |
| (...skipping 22 matching lines...) Expand all Loading... |
| 52 "new_path": "FILE_PATH" | 53 "new_path": "FILE_PATH" |
| 53 } | 54 } |
| 54 ] | 55 ] |
| 55 } | 56 } |
| 56 """ | 57 """ |
| 57 commit_log = COMMIT_LOG_TEMPLATE.replace( | 58 commit_log = COMMIT_LOG_TEMPLATE.replace( |
| 58 'REVISION', revision).replace('USER_NAME', user_name).replace( | 59 'REVISION', revision).replace('USER_NAME', user_name).replace( |
| 59 'COMMIT_POSITION', str(commit_position)).replace('FILE_PATH', file_path) | 60 'COMMIT_POSITION', str(commit_position)).replace('FILE_PATH', file_path) |
| 60 urlfetch.register_handler(url, commit_log) | 61 urlfetch.register_handler(url, commit_log) |
| 61 | 62 |
| 62 def _Setup(self, master_name, builder_name, build_number): | 63 def _Setup(self, master_name, builder_name, build_number): |
| 63 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 64 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 64 analysis.status = wf_analysis_status.ANALYZING | 65 analysis.status = wf_analysis_status.ANALYZING |
| 65 analysis.put() | 66 analysis.put() |
| 66 | 67 |
| 67 def _WaitUntilDownloadAllowed(*_): | 68 def MockWaitUntilDownloadAllowed(*_): |
| 68 return True | 69 return True |
| 69 | 70 self.mock( |
| 70 self.mock(lock_util, 'WaitUntilDownloadAllowed', _WaitUntilDownloadAllowed) | 71 lock_util, 'WaitUntilDownloadAllowed', MockWaitUntilDownloadAllowed) |
| 71 | 72 |
| 72 with self.mock_urlfetch() as urlfetch: | 73 with self.mock_urlfetch() as urlfetch: |
| 73 # Mock build data. | 74 # Mock build data. |
| 74 for i in range(2): | 75 for i in range(2): |
| 75 build_url = buildbot.CreateBuildUrl( | 76 build_url = buildbot.CreateBuildUrl( |
| 76 master_name, builder_name, build_number - i, json_api=True) | 77 master_name, builder_name, build_number - i, json_api=True) |
| 77 file_name = os.path.join(os.path.dirname(__file__), 'data', | 78 file_name = os.path.join(os.path.dirname(__file__), 'data', |
| 78 'm_b_%s.json' % (build_number - i)) | 79 'm_b_%s.json' % (build_number - i)) |
| 79 with open(file_name, 'r') as f: | 80 with open(file_name, 'r') as f: |
| 80 urlfetch.register_handler(build_url, f.read()) | 81 urlfetch.register_handler(build_url, f.read()) |
| 81 # Mock step log. | 82 # Mock step log. |
| 82 step_log_url = buildbot.CreateStdioLogUrl( | 83 step_log_url = buildbot.CreateStdioLogUrl( |
| 83 master_name, builder_name, build_number, 'a') | 84 master_name, builder_name, build_number, 'a') |
| 84 urlfetch.register_handler( | 85 urlfetch.register_handler( |
| 85 step_log_url, 'error in file a/b/x.cc:89 ...') | 86 step_log_url, 'error in file a/b/x.cc:89 ...') |
| 86 | 87 |
| 87 # Mock change logs. | 88 # Mock change logs. |
| 88 self._MockChangeLog(urlfetch, 'user1', 'some_git_hash', 8888, 'a/b/x.cc') | 89 self._MockChangeLog(urlfetch, 'user1', 'some_git_hash', 8888, 'a/b/x.cc') |
| 89 self._MockChangeLog( | 90 self._MockChangeLog( |
| 90 urlfetch, 'user1', '64c72819e898e952103b63eabc12772f9640af07', | 91 urlfetch, 'user1', '64c72819e898e952103b63eabc12772f9640af07', |
| 91 8887, 'd/e/y.cc') | 92 8887, 'd/e/y.cc') |
| 92 | 93 |
| 94 def MockGetChromeDependency(*_): |
| 95 return {} |
| 96 self.mock(chromium_deps, 'GetChromeDependency', MockGetChromeDependency) |
| 97 |
| 93 def testBuildFailurePipeline(self): | 98 def testBuildFailurePipeline(self): |
| 94 master_name = 'm' | 99 master_name = 'm' |
| 95 builder_name = 'b' | 100 builder_name = 'b' |
| 96 build_number = 124 | 101 build_number = 124 |
| 97 | 102 |
| 98 self._Setup(master_name, builder_name, build_number) | 103 self._Setup(master_name, builder_name, build_number) |
| 99 | 104 |
| 100 root_pipeline = AnalyzeBuildFailurePipeline(master_name, | 105 root_pipeline = AnalyzeBuildFailurePipeline(master_name, |
| 101 builder_name, | 106 builder_name, |
| 102 build_number) | 107 build_number) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 133 self.assertEqual(expected_analysis_result, analysis.result) | 138 self.assertEqual(expected_analysis_result, analysis.result) |
| 134 self.assertIsNotNone(analysis.result_status) | 139 self.assertIsNotNone(analysis.result_status) |
| 135 | 140 |
| 136 def testBuildFailurePipelineStartWithNoneResultStatus(self): | 141 def testBuildFailurePipelineStartWithNoneResultStatus(self): |
| 137 master_name = 'm' | 142 master_name = 'm' |
| 138 builder_name = 'b' | 143 builder_name = 'b' |
| 139 build_number = 124 | 144 build_number = 124 |
| 140 | 145 |
| 141 self._Setup(master_name, builder_name, build_number) | 146 self._Setup(master_name, builder_name, build_number) |
| 142 | 147 |
| 143 root_pipeline = AnalyzeBuildFailurePipeline(master_name, | 148 root_pipeline = AnalyzeBuildFailurePipeline(master_name, |
| 144 builder_name, | 149 builder_name, |
| 145 build_number) | 150 build_number) |
| 146 root_pipeline._ResetAnalysis(master_name, builder_name, build_number) | 151 root_pipeline._ResetAnalysis(master_name, builder_name, build_number) |
| 147 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 152 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 148 self.assertIsNotNone(analysis) | 153 self.assertIsNotNone(analysis) |
| 149 self.assertEqual(wf_analysis_status.ANALYZING, analysis.status) | 154 self.assertEqual(wf_analysis_status.ANALYZING, analysis.status) |
| 150 self.assertIsNone(analysis.result_status) | 155 self.assertIsNone(analysis.result_status) |
| 151 | 156 |
| 152 def testAnalyzeBuildFailurePipelineAbortedWithAnalysis(self): | 157 def testAnalyzeBuildFailurePipelineAbortedWithAnalysis(self): |
| 153 master_name = 'm' | 158 master_name = 'm' |
| 154 builder_name = 'b' | 159 builder_name = 'b' |
| 155 build_number = 124 | 160 build_number = 124 |
| 156 | 161 |
| 157 self._Setup(master_name, builder_name, build_number) | 162 self._Setup(master_name, builder_name, build_number) |
| 158 | 163 |
| 159 root_pipeline = AnalyzeBuildFailurePipeline(master_name, | 164 root_pipeline = AnalyzeBuildFailurePipeline(master_name, |
| 160 builder_name, | 165 builder_name, |
| 161 build_number) | 166 build_number) |
| 162 root_pipeline._LogUnexpectedAborting(True) | 167 root_pipeline._LogUnexpectedAborting(True) |
| 163 | 168 |
| 164 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 169 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 165 self.assertIsNotNone(analysis) | 170 self.assertIsNotNone(analysis) |
| 166 self.assertEqual(wf_analysis_status.ERROR, analysis.status) | 171 self.assertEqual(wf_analysis_status.ERROR, analysis.status) |
| 167 self.assertIsNone(analysis.result_status) | 172 self.assertIsNone(analysis.result_status) |
| 168 | 173 |
| 169 def testAnalyzeBuildFailurePipelineAbortedWithoutAnalysis(self): | 174 def testAnalyzeBuildFailurePipelineAbortedWithoutAnalysis(self): |
| 170 master_name = 'm' | 175 master_name = 'm' |
| 171 builder_name = 'b' | 176 builder_name = 'b' |
| 172 build_number = 124 | 177 build_number = 124 |
| 173 | 178 |
| 174 root_pipeline = AnalyzeBuildFailurePipeline(master_name, | 179 root_pipeline = AnalyzeBuildFailurePipeline(master_name, |
| 175 builder_name, | 180 builder_name, |
| 176 build_number) | 181 build_number) |
| 177 root_pipeline._LogUnexpectedAborting(True) | 182 root_pipeline._LogUnexpectedAborting(True) |
| 178 | 183 |
| 179 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 184 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 180 self.assertIsNone(analysis) | 185 self.assertIsNone(analysis) |
| 181 | 186 |
| 182 def testAnalyzeBuildFailurePipelineNotAborted(self): | 187 def testAnalyzeBuildFailurePipelineNotAborted(self): |
| 183 master_name = 'm' | 188 master_name = 'm' |
| 184 builder_name = 'b' | 189 builder_name = 'b' |
| 185 build_number = 124 | 190 build_number = 124 |
| 186 | 191 |
| 187 self._Setup(master_name, builder_name, build_number) | 192 self._Setup(master_name, builder_name, build_number) |
| 188 | 193 |
| 189 root_pipeline = AnalyzeBuildFailurePipeline(master_name, | 194 root_pipeline = AnalyzeBuildFailurePipeline(master_name, |
| 190 builder_name, | 195 builder_name, |
| 191 build_number) | 196 build_number) |
| 192 root_pipeline._LogUnexpectedAborting(False) | 197 root_pipeline._LogUnexpectedAborting(False) |
| 193 | 198 |
| 194 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 199 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 195 self.assertIsNotNone(analysis) | 200 self.assertIsNotNone(analysis) |
| 196 self.assertNotEqual(wf_analysis_status.ERROR, analysis.status) | 201 self.assertNotEqual(wf_analysis_status.ERROR, analysis.status) |
| OLD | NEW |