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 |