Chromium Code Reviews| 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 from testing_utils import testing | 5 from testing_utils import testing |
| 6 | 6 |
| 7 from common.git_repository import GitRepository | 7 from common.git_repository import GitRepository |
| 8 from model import wf_analysis_status | 8 from model import wf_analysis_status |
| 9 from model.wf_try_job import WfTryJob | 9 from model.wf_try_job import WfTryJob |
| 10 from waterfall.identify_try_job_culprit_pipeline import( | 10 from waterfall.identify_try_job_culprit_pipeline import( |
| 11 IdentifyTryJobCulpritPipeline) | 11 IdentifyTryJobCulpritPipeline) |
| 12 from waterfall.try_job_enums import TryJobType | |
| 12 | 13 |
| 13 | 14 |
| 14 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): | 15 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): |
| 15 | 16 |
| 16 def _MockGetChangeLog(self, revision): | 17 def _MockGetChangeLog(self, revision): |
| 17 class MockedChangeLog(object): | 18 class MockedChangeLog(object): |
| 18 | 19 |
| 19 def __init__(self, commit_position, code_review_url): | 20 def __init__(self, commit_position, code_review_url): |
| 20 self.commit_position = commit_position | 21 self.commit_position = commit_position |
| 21 self.code_review_url = code_review_url | 22 self.code_review_url = code_review_url |
| 22 | 23 |
| 23 mock_change_logs = {} | 24 mock_change_logs = {} |
| 25 mock_change_logs['rev1'] = MockedChangeLog('1', 'url_1') | |
| 24 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') | 26 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') |
| 25 return mock_change_logs.get(revision) | 27 return mock_change_logs.get(revision) |
| 26 | 28 |
| 27 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self): | 29 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self): |
| 28 master_name = 'm' | 30 master_name = 'm' |
| 29 builder_name = 'b' | 31 builder_name = 'b' |
| 30 build_number = 1 | 32 build_number = 1 |
| 31 try_job_id = '1' | |
| 32 compile_result = None | |
| 33 | 33 |
| 34 WfTryJob.Create(master_name, builder_name, build_number).put() | 34 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 35 pipeline = IdentifyTryJobCulpritPipeline() | 35 pipeline = IdentifyTryJobCulpritPipeline() |
| 36 culprit = pipeline.run( | 36 culprit = pipeline.run( |
| 37 master_name, builder_name, build_number, try_job_id, compile_result) | 37 master_name, builder_name, build_number, ['rev1'], |
| 38 TryJobType.COMPILE, '1', None) | |
| 38 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 39 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 39 | 40 |
| 40 self.assertIsNone(culprit) | 41 self.assertIsNone(culprit) |
| 41 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 42 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 42 | 43 |
| 43 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self): | 44 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self): |
| 44 master_name = 'm' | 45 master_name = 'm' |
| 45 builder_name = 'b' | 46 builder_name = 'b' |
| 46 build_number = 1 | 47 build_number = 1 |
| 47 try_job_id = '1' | |
| 48 compile_result = { | 48 compile_result = { |
| 49 'result': [], | 49 'result': [], |
| 50 'url': 'url', | 50 'url': 'url', |
| 51 'try_job_id': '1', | 51 'try_job_id': '1', |
| 52 } | 52 } |
| 53 WfTryJob.Create(master_name, builder_name, build_number).put() | 53 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 54 | 54 |
| 55 pipeline = IdentifyTryJobCulpritPipeline() | 55 pipeline = IdentifyTryJobCulpritPipeline() |
| 56 culprit = pipeline.run( | 56 culprit = pipeline.run( |
| 57 master_name, builder_name, build_number, try_job_id, compile_result) | 57 master_name, builder_name, build_number, ['rev1'], |
| 58 TryJobType.COMPILE, '1', compile_result) | |
| 58 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 59 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 59 | 60 |
| 60 self.assertIsNone(culprit) | 61 self.assertIsNone(culprit) |
| 61 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 62 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 62 | 63 |
| 63 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): | 64 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): |
| 64 master_name = 'm' | 65 master_name = 'm' |
| 65 builder_name = 'b' | 66 builder_name = 'b' |
| 66 build_number = 1 | 67 build_number = 1 |
| 67 try_job_id = '1' | |
| 68 compile_result = { | 68 compile_result = { |
| 69 'result': [ | 69 'result': [ |
| 70 ['rev1', 'passed'], | 70 ['rev1', 'passed'], |
| 71 ['rev2', 'passed'] | 71 ['rev2', 'passed'] |
| 72 ], | 72 ], |
| 73 'url': 'url', | 73 'url': 'url', |
| 74 'try_job_id': '1', | 74 'try_job_id': '1', |
| 75 } | 75 } |
| 76 WfTryJob.Create(master_name, builder_name, build_number).put() | 76 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 77 | 77 |
| 78 pipeline = IdentifyTryJobCulpritPipeline() | 78 pipeline = IdentifyTryJobCulpritPipeline() |
| 79 culprit = pipeline.run( | 79 culprit = pipeline.run( |
| 80 master_name, builder_name, build_number, try_job_id, compile_result) | 80 master_name, builder_name, build_number, ['rev1'], |
| 81 TryJobType.COMPILE, '1', compile_result) | |
| 81 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 82 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 82 | 83 |
| 83 self.assertIsNone(culprit) | 84 self.assertIsNone(culprit) |
| 84 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 85 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 85 | 86 |
| 86 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self): | 87 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self): |
| 87 master_name = 'm' | 88 master_name = 'm' |
| 88 builder_name = 'b' | 89 builder_name = 'b' |
| 89 build_number = 1 | 90 build_number = 1 |
| 90 try_job_id = '1' | |
| 91 compile_result = { | 91 compile_result = { |
| 92 'result': [ | 92 'result': [ |
| 93 ['rev1', 'failed'] | 93 ['rev0', 'failed'] |
| 94 ], | 94 ], |
| 95 'url': 'url', | 95 'url': 'url', |
| 96 'try_job_id': '1', | 96 'try_job_id': '1', |
| 97 } | 97 } |
| 98 | 98 |
| 99 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) | 99 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 100 WfTryJob.Create(master_name, builder_name, build_number).put() | 100 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 101 | 101 |
| 102 pipeline = IdentifyTryJobCulpritPipeline() | 102 pipeline = IdentifyTryJobCulpritPipeline() |
| 103 culprit = pipeline.run( | 103 culprit = pipeline.run( |
| 104 master_name, builder_name, build_number, try_job_id, compile_result) | 104 master_name, builder_name, build_number, ['rev1'], |
| 105 TryJobType.COMPILE, '1', compile_result) | |
| 105 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 106 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 106 | 107 |
| 107 self.assertIsNone(culprit) | 108 self.assertIsNone(culprit) |
| 108 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 109 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 109 | 110 |
| 110 def testIdentifyCulpritForCompileTryJobSuccess(self): | 111 def testIdentifyCulpritForCompileTryJobSuccess(self): |
| 111 master_name = 'm' | 112 master_name = 'm' |
| 112 builder_name = 'b' | 113 builder_name = 'b' |
| 113 build_number = 1 | 114 build_number = 1 |
| 114 try_job_id = '1' | |
| 115 compile_result = { | 115 compile_result = { |
| 116 'result': [ | 116 'result': [ |
| 117 ['rev1', 'passed'], | 117 ['rev1', 'passed'], |
| 118 ['rev2', 'failed'] | 118 ['rev2', 'failed'] |
| 119 ], | 119 ], |
| 120 'url': 'url', | 120 'url': 'url', |
| 121 'try_job_id': '1', | 121 'try_job_id': '1', |
| 122 } | 122 } |
| 123 | 123 |
| 124 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 124 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 125 try_job.status = wf_analysis_status.ANALYZING | 125 try_job.status = wf_analysis_status.ANALYZING |
| 126 try_job.compile_results = [{ | 126 try_job.compile_results = [compile_result] |
| 127 'result': [ | |
| 128 ['rev1', 'passed'], | |
| 129 ['rev2', 'failed'] | |
| 130 ], | |
| 131 'url': 'url', | |
| 132 'try_job_id': '1', | |
| 133 }] | |
| 134 try_job.put() | 127 try_job.put() |
| 135 | 128 |
| 136 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) | 129 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 137 | 130 |
| 138 pipeline = IdentifyTryJobCulpritPipeline() | 131 pipeline = IdentifyTryJobCulpritPipeline() |
| 139 culprit = pipeline.run( | 132 culprit = pipeline.run( |
| 140 master_name, builder_name, build_number, try_job_id, compile_result) | 133 master_name, builder_name, build_number, ['rev1'], |
| 134 TryJobType.COMPILE, '1', compile_result) | |
| 141 | 135 |
| 142 expected_compile_result = { | 136 expected_compile_result = { |
| 143 'result': [ | 137 'result': [ |
| 144 ['rev1', 'passed'], | 138 ['rev1', 'passed'], |
| 145 ['rev2', 'failed'] | 139 ['rev2', 'failed'] |
| 146 ], | 140 ], |
| 147 'url': 'url', | 141 'url': 'url', |
| 148 'try_job_id': '1', | 142 'try_job_id': '1', |
| 149 'culprit': { | 143 'culprit': { |
| 150 'revision': 'rev2', | 144 'revision': 'rev2', |
| 151 'commit_position': '2', | 145 'commit_position': '2', |
| 152 'review_url': 'url_2' | 146 'review_url': 'url_2' |
| 153 } | 147 } |
| 154 } | 148 } |
| 155 | 149 |
| 156 self.assertEqual(expected_compile_result['culprit'], culprit) | 150 self.assertEqual(expected_compile_result['culprit'], culprit) |
| 157 | 151 |
| 158 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 152 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 159 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) | 153 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) |
| 160 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 154 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 155 | |
| 156 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self): | |
| 157 master_name = 'm' | |
| 158 builder_name = 'b' | |
| 159 build_number = 1 | |
| 160 | |
| 161 try_job = WfTryJob.Create(master_name, builder_name, build_number) | |
| 162 try_job.status = wf_analysis_status.ANALYZING | |
| 163 try_job.put() | |
| 164 | |
| 165 pipeline = IdentifyTryJobCulpritPipeline() | |
| 166 culprit = pipeline.run( | |
| 167 master_name, builder_name, build_number, ['rev1', 'rev2'], | |
| 168 TryJobType.TEST, '1', None) | |
| 169 | |
| 170 self.assertIsNone(culprit) | |
| 171 | |
| 172 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self): | |
| 173 master_name = 'm' | |
| 174 builder_name = 'b' | |
| 175 build_number = 1 | |
| 176 test_result = { | |
| 177 'result': { | |
| 178 'rev1': { | |
| 179 'a_test': { | |
| 180 'status': 'failed', | |
| 181 'valid': True, | |
| 182 'failures': ['a_test1'] | |
| 183 } | |
| 184 } | |
| 185 }, | |
| 186 'url': 'url', | |
| 187 'try_job_id': '1' | |
| 188 } | |
| 189 | |
| 190 try_job = WfTryJob.Create(master_name, builder_name, build_number) | |
| 191 try_job.status = wf_analysis_status.ANALYZING | |
| 192 try_job.put() | |
| 193 | |
| 194 pipeline = IdentifyTryJobCulpritPipeline() | |
| 195 culprit = pipeline.run( | |
| 196 master_name, builder_name, build_number, [], TryJobType.TEST, '1', | |
| 197 test_result) | |
| 198 | |
| 199 self.assertIsNone(culprit) | |
| 200 | |
| 201 def testIdentifyCulpritForTestTryJobReturnNoneIfNoCulpritInfo(self): | |
| 202 master_name = 'm' | |
| 203 builder_name = 'b' | |
| 204 build_number = 1 | |
| 205 test_result = { | |
| 206 'result': { | |
| 207 'rev3': { | |
| 208 'a_test': { | |
| 209 'status': 'failed', | |
| 210 'valid': True, | |
| 211 'failures': ['a_test1'] | |
| 212 } | |
| 213 } | |
| 214 }, | |
| 215 'url': 'url', | |
| 216 'try_job_id': '1' | |
| 217 } | |
| 218 | |
| 219 try_job = WfTryJob.Create(master_name, builder_name, build_number) | |
| 220 try_job.status = wf_analysis_status.ANALYZING | |
| 221 try_job.put() | |
| 222 | |
| 223 pipeline = IdentifyTryJobCulpritPipeline() | |
| 224 culprit = pipeline.run( | |
| 225 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST, | |
| 226 '1', test_result) | |
| 227 | |
| 228 self.assertIsNone(culprit) | |
| 229 | |
| 230 def testIdentifyCulpritForTestTryJobSuccess(self): | |
| 231 master_name = 'm' | |
| 232 builder_name = 'b' | |
| 233 build_number = 1 | |
| 234 test_result = { | |
| 235 'result': { | |
| 236 'rev1': { | |
| 237 'a_test': { | |
| 238 'status': 'failed', | |
| 239 'valid': True, | |
| 240 'failures': ['a_test1'] | |
| 241 }, | |
| 242 'b_test': { | |
| 243 'status': 'failed', | |
| 244 'valid': True, | |
| 245 'failures': ['b_test1'] | |
| 246 }, | |
| 247 'c_test': { | |
| 248 'status': 'passed', | |
| 249 'valid': True | |
| 250 } | |
| 251 }, | |
| 252 'rev2': { | |
| 253 'a_test': { | |
| 254 'status': 'failed', | |
| 255 'valid': True, | |
| 256 'failures': ['a_test1', 'a_test2'] | |
| 257 }, | |
| 258 'b_test': { | |
| 259 'status': 'passed', | |
| 260 'valid': True | |
| 261 }, | |
| 262 'c_test': { | |
| 263 'status': 'failed', | |
| 264 'valid': True, | |
| 265 'failures': [] | |
| 266 } | |
| 267 } | |
| 268 }, | |
| 269 'url': 'url', | |
| 270 'try_job_id': '1' | |
| 271 } | |
| 272 | |
| 273 try_job = WfTryJob.Create(master_name, builder_name, build_number) | |
| 274 try_job.status = wf_analysis_status.ANALYZING | |
| 275 try_job.test_results = [test_result] | |
| 276 try_job.put() | |
| 277 | |
| 278 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) | |
| 279 | |
| 280 pipeline = IdentifyTryJobCulpritPipeline() | |
| 281 culprit = pipeline.run( | |
| 282 master_name, builder_name, build_number, ['rev1', 'rev2'], | |
| 283 TryJobType.TEST, '1', test_result) | |
| 284 | |
| 285 expected_test_result = { | |
|
stgao
2016/01/29 18:55:02
style nit: too many space.
chanli
2016/01/30 02:22:37
Done.
| |
| 286 'result': { | |
| 287 'rev1': { | |
| 288 'a_test': { | |
| 289 'status': 'failed', | |
| 290 'valid': True, | |
| 291 'failures': ['a_test1'] | |
| 292 }, | |
| 293 'b_test': { | |
| 294 'status': 'failed', | |
| 295 'valid': True, | |
| 296 'failures': ['b_test1'] | |
| 297 }, | |
| 298 'c_test': { | |
| 299 'status': 'passed', | |
| 300 'valid': True | |
| 301 } | |
| 302 }, | |
| 303 'rev2': { | |
| 304 'a_test': { | |
| 305 'status': 'failed', | |
| 306 'valid': True, | |
| 307 'failures': ['a_test1', 'a_test2'] | |
| 308 }, | |
| 309 'b_test': { | |
| 310 'status': 'passed', | |
| 311 'valid': True | |
| 312 }, | |
| 313 'c_test': { | |
| 314 'status': 'failed', | |
| 315 'valid': True, | |
| 316 'failures': [] | |
| 317 } | |
| 318 } | |
| 319 }, | |
| 320 'url': 'url', | |
| 321 'try_job_id': '1', | |
| 322 'culprit': { | |
| 323 'a_test': { | |
| 324 'tests': { | |
| 325 'a_test1': { | |
| 326 'revision': 'rev1', | |
| 327 'commit_position': '1', | |
| 328 'review_url': 'url_1' | |
| 329 }, | |
| 330 'a_test2': { | |
| 331 'revision': 'rev2', | |
| 332 'commit_position': '2', | |
| 333 'review_url': 'url_2' | |
| 334 } | |
| 335 } | |
| 336 }, | |
| 337 'b_test': { | |
| 338 'tests': { | |
| 339 'b_test1': { | |
| 340 'revision': 'rev1', | |
| 341 'commit_position': '1', | |
| 342 'review_url': 'url_1' | |
| 343 } | |
| 344 } | |
| 345 }, | |
| 346 'c_test': { | |
| 347 'revision': 'rev2', | |
| 348 'commit_position': '2', | |
| 349 'review_url': 'url_2', | |
| 350 'tests': {} | |
| 351 } | |
| 352 } | |
| 353 } | |
| 354 | |
| 355 self.assertEqual(expected_test_result['culprit'], culprit) | |
| 356 | |
| 357 try_job = WfTryJob.Get(master_name, builder_name, build_number) | |
| 358 self.assertEqual(expected_test_result, try_job.test_results[-1]) | |
| 359 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | |
| OLD | NEW |