| 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_result_status |
| 8 from model import wf_analysis_status | 9 from model import wf_analysis_status |
| 10 from model.wf_analysis import WfAnalysis |
| 9 from model.wf_try_job import WfTryJob | 11 from model.wf_try_job import WfTryJob |
| 10 from model.wf_try_job_data import WfTryJobData | 12 from model.wf_try_job_data import WfTryJobData |
| 13 from waterfall import identify_try_job_culprit_pipeline |
| 11 from waterfall.identify_try_job_culprit_pipeline import( | 14 from waterfall.identify_try_job_culprit_pipeline import( |
| 12 IdentifyTryJobCulpritPipeline) | 15 IdentifyTryJobCulpritPipeline) |
| 13 from waterfall.try_job_type import TryJobType | 16 from waterfall.try_job_type import TryJobType |
| 14 | 17 |
| 15 | 18 |
| 16 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): | 19 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): |
| 17 | 20 |
| 18 def _MockGetChangeLog(self, revision): | 21 def _MockGetChangeLog(self, revision): |
| 19 class MockedChangeLog(object): | 22 class MockedChangeLog(object): |
| 20 | 23 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromCompileResult( | 72 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromCompileResult( |
| 70 { | 73 { |
| 71 'report': { | 74 'report': { |
| 72 'result': { | 75 'result': { |
| 73 'rev1': 'passed', | 76 'rev1': 'passed', |
| 74 'rev2': 'failed' | 77 'rev2': 'failed' |
| 75 } | 78 } |
| 76 } | 79 } |
| 77 })) | 80 })) |
| 78 | 81 |
| 82 def testGetResultanalysisStatusWithTryJobCulpritNotFoundUntriaged(self): |
| 83 # Heuristic analysis provided no results, but the try job found a culprit. |
| 84 analysis = WfAnalysis.Create('m', 'b', 1) |
| 85 analysis.result_status = wf_analysis_result_status.NOT_FOUND_UNTRIAGED |
| 86 analysis.put() |
| 87 |
| 88 result = { |
| 89 'culprit': { |
| 90 'compile': { |
| 91 'revision': 'rev1', |
| 92 'commit_position': '1', |
| 93 'review_url': 'url_1', |
| 94 'repo_name': 'chromium' |
| 95 } |
| 96 } |
| 97 } |
| 98 |
| 99 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 100 analysis, result) |
| 101 |
| 102 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED) |
| 103 |
| 104 def testGetResultanalysisStatusWithTryJobCulpritNotFoundCorrect(self): |
| 105 # Heuristic analysis found no results, which was correct. In this case, the |
| 106 # try job result is actually a false positive. |
| 107 analysis = WfAnalysis.Create('m', 'b', 1) |
| 108 analysis.result_status = wf_analysis_result_status.NOT_FOUND_CORRECT |
| 109 analysis.put() |
| 110 |
| 111 result = { |
| 112 'culprit': { |
| 113 'compile': { |
| 114 'revision': 'rev1', |
| 115 'commit_position': '1', |
| 116 'review_url': 'url_1', |
| 117 'repo_name': 'chromium' |
| 118 } |
| 119 } |
| 120 } |
| 121 |
| 122 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 123 analysis, result) |
| 124 |
| 125 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED) |
| 126 |
| 127 def testGetResultanalysisStatusWithTryJobCulpritNotFoundIncorrect(self): |
| 128 # Heuristic analysis found no results and was triaged to incorrect before a |
| 129 # try job result was found. In this case the try job result should override |
| 130 # the heuristic result. |
| 131 analysis = WfAnalysis.Create('m', 'b', 1) |
| 132 analysis.result_status = wf_analysis_result_status.NOT_FOUND_INCORRECT |
| 133 analysis.put() |
| 134 |
| 135 result = { |
| 136 'culprit': { |
| 137 'compile': { |
| 138 'revision': 'rev1', |
| 139 'commit_position': '1', |
| 140 'review_url': 'url_1', |
| 141 'repo_name': 'chromium' |
| 142 } |
| 143 } |
| 144 } |
| 145 |
| 146 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 147 analysis, result) |
| 148 |
| 149 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED) |
| 150 |
| 151 def testGetResultanalysisStatusWithTryJobCulpritNoHeuristicResult(self): |
| 152 # In this case, the try job found a result before the heuristic result is |
| 153 # available. This case should generally never happen, as heuristic analysis |
| 154 # is usually much faster than try jobs. |
| 155 analysis = WfAnalysis.Create('m', 'b', 1) |
| 156 analysis.put() |
| 157 |
| 158 result = { |
| 159 'culprit': { |
| 160 'compile': { |
| 161 'revision': 'rev1', |
| 162 'commit_position': '1', |
| 163 'review_url': 'url_1', |
| 164 'repo_name': 'chromium' |
| 165 } |
| 166 } |
| 167 } |
| 168 |
| 169 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 170 analysis, result) |
| 171 |
| 172 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED) |
| 173 |
| 174 def testGetResultanalysisStatusWithNoTryJobCulpritNoHeuristicResult(self): |
| 175 # In this case, the try job completed faster than heuristic analysis |
| 176 # (which should never happen) but no results were found. |
| 177 analysis = WfAnalysis.Create('m', 'b', 1) |
| 178 analysis.put() |
| 179 |
| 180 result = {} |
| 181 |
| 182 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 183 analysis, result) |
| 184 self.assertEqual(status, wf_analysis_result_status.NOT_FOUND_UNTRIAGED) |
| 185 |
| 186 def testGetResultanalysisStatusWithTryJobCulpritAndHeuristicResult(self): |
| 187 # In this case, heuristic analysis found the correct culprit. The try job |
| 188 # result should not overwrite it. |
| 189 analysis = WfAnalysis.Create('m', 'b', 1) |
| 190 analysis.result_status = wf_analysis_result_status.FOUND_CORRECT |
| 191 analysis.put() |
| 192 |
| 193 result = { |
| 194 'culprit': { |
| 195 'compile': { |
| 196 'revision': 'rev1', |
| 197 'commit_position': '1', |
| 198 'review_url': 'url_1', |
| 199 'repo_name': 'chromium' |
| 200 } |
| 201 } |
| 202 } |
| 203 |
| 204 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus( |
| 205 analysis, result) |
| 206 self.assertEqual(status, wf_analysis_result_status.FOUND_CORRECT) |
| 207 |
| 208 def testGetSuspectedCLsForCompileTryJob(self): |
| 209 heuristic_suspected_cl = { |
| 210 'revision': 'rev1', |
| 211 'commit_position': '1', |
| 212 'review_url': 'url_1', |
| 213 'repo_name': 'chromium' |
| 214 } |
| 215 |
| 216 compile_suspected_cl = { |
| 217 'revision': 'rev2', |
| 218 'commit_position': '2', |
| 219 'review_url': 'url_2', |
| 220 'repo_name': 'chromium' |
| 221 } |
| 222 |
| 223 analysis = WfAnalysis.Create('m', 'b', 1) |
| 224 analysis.suspected_cls = [heuristic_suspected_cl] |
| 225 analysis.put() |
| 226 |
| 227 result = { |
| 228 'culprit': { |
| 229 'compile': compile_suspected_cl |
| 230 } |
| 231 } |
| 232 |
| 233 self.assertEqual( |
| 234 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result), |
| 235 [heuristic_suspected_cl, compile_suspected_cl]) |
| 236 |
| 237 def testGetSuspectedCLsForTestTryJobAndHeuristicResultsSame(self): |
| 238 suspected_cl = { |
| 239 'revision': 'rev1', |
| 240 'commit_position': '1', |
| 241 'review_url': 'url_1', |
| 242 'repo_name': 'chromium' |
| 243 } |
| 244 |
| 245 analysis = WfAnalysis.Create('m', 'b', 1) |
| 246 analysis.suspected_cls = [suspected_cl] |
| 247 analysis.put() |
| 248 |
| 249 result = { |
| 250 'culprit': { |
| 251 'compile': suspected_cl |
| 252 } |
| 253 } |
| 254 |
| 255 self.assertEqual( |
| 256 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result), |
| 257 [suspected_cl]) |
| 258 |
| 259 def testGetSuspectedCLsForTestTryJob(self): |
| 260 suspected_cl1 = { |
| 261 'revision': 'rev1', |
| 262 'commit_position': '1', |
| 263 'review_url': 'url_1', |
| 264 'repo_name': 'chromium' |
| 265 } |
| 266 suspected_cl2 = { |
| 267 'revision': 'rev2', |
| 268 'commit_position': '2', |
| 269 'review_url': 'url_2', |
| 270 'repo_name': 'chromium' |
| 271 } |
| 272 suspected_cl3 = { |
| 273 'revision': 'rev3', |
| 274 'commit_position': '3', |
| 275 'review_url': 'url_3', |
| 276 'repo_name': 'chromium' |
| 277 } |
| 278 |
| 279 analysis = WfAnalysis.Create('m', 'b', 1) |
| 280 analysis.suspected_cls = [] |
| 281 analysis.put() |
| 282 |
| 283 result = { |
| 284 'culprit': { |
| 285 'a_test': { |
| 286 'tests': { |
| 287 'a_test1': suspected_cl1, |
| 288 'a_test2': suspected_cl1 |
| 289 } |
| 290 }, |
| 291 'b_test': { |
| 292 'tests': { |
| 293 'b_test1': suspected_cl2 |
| 294 } |
| 295 }, |
| 296 'c_test': { |
| 297 'revision': 'rev3', |
| 298 'commit_position': '3', |
| 299 'review_url': 'url_3', |
| 300 'repo_name': 'chromium', |
| 301 'tests': {} |
| 302 } |
| 303 } |
| 304 } |
| 305 |
| 306 self.assertEqual( |
| 307 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result), |
| 308 [suspected_cl3, suspected_cl2, suspected_cl1]) |
| 309 |
| 79 def testIdentifyCulpritForCompileTryJobNoCulprit(self): | 310 def testIdentifyCulpritForCompileTryJobNoCulprit(self): |
| 80 master_name = 'm' | 311 master_name = 'm' |
| 81 builder_name = 'b' | 312 builder_name = 'b' |
| 82 build_number = 1 | 313 build_number = 1 |
| 83 try_job_id = '1' | 314 try_job_id = '1' |
| 84 | 315 |
| 85 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 316 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 86 try_job.put() | 317 try_job.put() |
| 87 try_job_data = WfTryJobData.Create(try_job_id) | 318 try_job_data = WfTryJobData.Create(try_job_id) |
| 88 try_job_data.put() | 319 try_job_data.put() |
| 89 | 320 |
| 321 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 322 analysis.put() |
| 323 |
| 90 pipeline = IdentifyTryJobCulpritPipeline() | 324 pipeline = IdentifyTryJobCulpritPipeline() |
| 91 culprit = pipeline.run( | 325 culprit = pipeline.run( |
| 92 master_name, builder_name, build_number, ['rev1'], | 326 master_name, builder_name, build_number, ['rev1'], |
| 93 TryJobType.COMPILE, '1', None) | 327 TryJobType.COMPILE, '1', None) |
| 94 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 328 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 95 | 329 |
| 96 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 330 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 97 self.assertEqual([], try_job.compile_results) | 331 self.assertEqual([], try_job.compile_results) |
| 98 self.assertIsNone(culprit) | 332 self.assertIsNone(culprit) |
| 99 self.assertIsNone(try_job_data.culprits) | 333 self.assertIsNone(try_job_data.culprits) |
| 334 self.assertEqual(analysis.result_status, |
| 335 wf_analysis_result_status.NOT_FOUND_UNTRIAGED) |
| 336 self.assertEqual(analysis.suspected_cls, []) |
| 100 | 337 |
| 101 def testIdentifyCulpritForCompileTryJobSuccess(self): | 338 def testIdentifyCulpritForCompileTryJobSuccess(self): |
| 102 master_name = 'm' | 339 master_name = 'm' |
| 103 builder_name = 'b' | 340 builder_name = 'b' |
| 104 build_number = 1 | 341 build_number = 1 |
| 105 try_job_id = '1' | 342 try_job_id = '1' |
| 106 | 343 |
| 107 compile_result = { | 344 compile_result = { |
| 108 'report': { | 345 'report': { |
| 109 'result': { | 346 'result': { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 121 try_job.compile_results = [{ | 358 try_job.compile_results = [{ |
| 122 'report': { | 359 'report': { |
| 123 'result': { | 360 'result': { |
| 124 'rev1': 'passed', | 361 'rev1': 'passed', |
| 125 'rev2': 'failed' | 362 'rev2': 'failed' |
| 126 }, | 363 }, |
| 127 }, | 364 }, |
| 128 'try_job_id': try_job_id, | 365 'try_job_id': try_job_id, |
| 129 }] | 366 }] |
| 130 try_job.put() | 367 try_job.put() |
| 368 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 369 analysis.put() |
| 131 | 370 |
| 132 pipeline = IdentifyTryJobCulpritPipeline() | 371 pipeline = IdentifyTryJobCulpritPipeline() |
| 133 culprit = pipeline.run( | 372 culprit = pipeline.run( |
| 134 master_name, builder_name, build_number, ['rev1'], | 373 master_name, builder_name, build_number, ['rev1'], |
| 135 TryJobType.COMPILE, '1', compile_result) | 374 TryJobType.COMPILE, '1', compile_result) |
| 136 | 375 |
| 137 expected_culprit = 'rev2' | 376 expected_culprit = 'rev2' |
| 377 expected_suspected_cl = { |
| 378 'revision': 'rev2', |
| 379 'commit_position': '2', |
| 380 'review_url': 'url_2', |
| 381 'repo_name': 'chromium' |
| 382 } |
| 138 expected_compile_result = { | 383 expected_compile_result = { |
| 139 'report': { | 384 'report': { |
| 140 'result': { | 385 'result': { |
| 141 'rev1': 'passed', | 386 'rev1': 'passed', |
| 142 'rev2': 'failed' | 387 'rev2': 'failed' |
| 143 } | 388 } |
| 144 }, | 389 }, |
| 145 'try_job_id': try_job_id, | 390 'try_job_id': try_job_id, |
| 146 'culprit': { | 391 'culprit': { |
| 147 'compile': { | 392 'compile': expected_suspected_cl |
| 148 'revision': 'rev2', | |
| 149 'commit_position': '2', | |
| 150 'review_url': 'url_2' | |
| 151 } | |
| 152 } | 393 } |
| 153 } | 394 } |
| 154 | 395 |
| 155 self.assertEqual(expected_compile_result['culprit'], culprit) | 396 self.assertEqual(expected_compile_result['culprit'], culprit) |
| 156 | 397 |
| 157 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 398 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 158 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) | 399 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) |
| 159 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 400 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 160 | 401 |
| 161 try_job_data = WfTryJobData.Get(try_job_id) | 402 try_job_data = WfTryJobData.Get(try_job_id) |
| 162 self.assertEqual({'compile': expected_culprit}, try_job_data.culprits) | 403 self.assertEqual({'compile': expected_culprit}, try_job_data.culprits) |
| 404 self.assertEqual(analysis.result_status, |
| 405 wf_analysis_result_status.FOUND_UNTRIAGED) |
| 406 self.assertEqual(analysis.suspected_cls, |
| 407 [expected_suspected_cl]) |
| 163 | 408 |
| 164 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): | 409 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): |
| 165 master_name = 'm' | 410 master_name = 'm' |
| 166 builder_name = 'b' | 411 builder_name = 'b' |
| 167 build_number = 1 | 412 build_number = 1 |
| 168 try_job_id = '1' | 413 try_job_id = '1' |
| 169 | 414 |
| 170 compile_result = { | 415 compile_result = { |
| 171 'report': { | 416 'report': { |
| 172 'result': { | 417 'result': { |
| 173 'rev1': 'passed', | 418 'rev1': 'passed', |
| 174 'rev2': 'passed' | 419 'rev2': 'passed' |
| 175 } | 420 } |
| 176 }, | 421 }, |
| 177 'url': 'url', | 422 'url': 'url', |
| 178 'try_job_id': try_job_id, | 423 'try_job_id': try_job_id, |
| 179 } | 424 } |
| 180 | 425 |
| 181 WfTryJobData.Create(try_job_id).put() | 426 WfTryJobData.Create(try_job_id).put() |
| 182 WfTryJob.Create(master_name, builder_name, build_number).put() | 427 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 428 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 429 analysis.put() |
| 183 | 430 |
| 184 pipeline = IdentifyTryJobCulpritPipeline() | 431 pipeline = IdentifyTryJobCulpritPipeline() |
| 185 culprit = pipeline.run( | 432 culprit = pipeline.run( |
| 186 master_name, builder_name, build_number, ['rev1'], | 433 master_name, builder_name, build_number, ['rev1'], |
| 187 TryJobType.COMPILE, '1', compile_result) | 434 TryJobType.COMPILE, '1', compile_result) |
| 188 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 435 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 189 | 436 |
| 190 self.assertIsNone(culprit) | 437 self.assertIsNone(culprit) |
| 191 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 438 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 192 | 439 |
| 193 try_job_data = WfTryJobData.Get(try_job_id) | 440 try_job_data = WfTryJobData.Get(try_job_id) |
| 194 self.assertIsNone(try_job_data.culprits) | 441 self.assertIsNone(try_job_data.culprits) |
| 195 | 442 |
| 443 self.assertEqual(analysis.result_status, |
| 444 wf_analysis_result_status.NOT_FOUND_UNTRIAGED) |
| 445 self.assertEqual(analysis.suspected_cls, []) |
| 446 |
| 196 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self): | 447 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self): |
| 197 master_name = 'm' | 448 master_name = 'm' |
| 198 builder_name = 'b' | 449 builder_name = 'b' |
| 199 build_number = 1 | 450 build_number = 1 |
| 200 try_job_id = '1' | 451 try_job_id = '1' |
| 201 | 452 |
| 202 WfTryJobData.Create(try_job_id).put() | 453 WfTryJobData.Create(try_job_id).put() |
| 203 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 454 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 204 try_job.status = wf_analysis_status.ANALYZING | 455 try_job.status = wf_analysis_status.ANALYZING |
| 205 try_job.put() | 456 try_job.put() |
| 457 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 458 analysis.put() |
| 206 | 459 |
| 207 pipeline = IdentifyTryJobCulpritPipeline() | 460 pipeline = IdentifyTryJobCulpritPipeline() |
| 208 culprit = pipeline.run( | 461 culprit = pipeline.run( |
| 209 master_name, builder_name, build_number, ['rev1', 'rev2'], | 462 master_name, builder_name, build_number, ['rev1', 'rev2'], |
| 210 TryJobType.TEST, '1', None) | 463 TryJobType.TEST, '1', None) |
| 211 | 464 |
| 212 self.assertIsNone(culprit) | 465 self.assertIsNone(culprit) |
| 213 | 466 |
| 214 try_job_data = WfTryJobData.Get(try_job_id) | 467 try_job_data = WfTryJobData.Get(try_job_id) |
| 215 self.assertIsNone(try_job_data.culprits) | 468 self.assertIsNone(try_job_data.culprits) |
| 469 self.assertEqual(analysis.result_status, |
| 470 wf_analysis_result_status.NOT_FOUND_UNTRIAGED) |
| 471 self.assertEqual(analysis.suspected_cls, []) |
| 216 | 472 |
| 217 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self): | 473 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self): |
| 218 master_name = 'm' | 474 master_name = 'm' |
| 219 builder_name = 'b' | 475 builder_name = 'b' |
| 220 build_number = 1 | 476 build_number = 1 |
| 221 try_job_id = '1' | 477 try_job_id = '1' |
| 222 | 478 |
| 223 test_result = { | 479 test_result = { |
| 224 'report': { | 480 'report': { |
| 225 'result': { | 481 'result': { |
| 226 'rev1': { | 482 'rev1': { |
| 227 'a_test': { | 483 'a_test': { |
| 228 'status': 'failed', | 484 'status': 'failed', |
| 229 'valid': True, | 485 'valid': True, |
| 230 'failures': ['a_test1'] | 486 'failures': ['a_test1'] |
| 231 } | 487 } |
| 232 } | 488 } |
| 233 } | 489 } |
| 234 }, | 490 }, |
| 235 'url': 'url', | 491 'url': 'url', |
| 236 'try_job_id': try_job_id | 492 'try_job_id': try_job_id |
| 237 } | 493 } |
| 238 | 494 |
| 239 WfTryJobData.Create(try_job_id).put() | 495 WfTryJobData.Create(try_job_id).put() |
| 240 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 496 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 241 try_job.status = wf_analysis_status.ANALYZING | 497 try_job.status = wf_analysis_status.ANALYZING |
| 242 try_job.put() | 498 try_job.put() |
| 499 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 500 analysis.put() |
| 243 | 501 |
| 244 pipeline = IdentifyTryJobCulpritPipeline() | 502 pipeline = IdentifyTryJobCulpritPipeline() |
| 245 culprit = pipeline.run( | 503 culprit = pipeline.run( |
| 246 master_name, builder_name, build_number, [], TryJobType.TEST, '1', | 504 master_name, builder_name, build_number, [], TryJobType.TEST, '1', |
| 247 test_result) | 505 test_result) |
| 248 | 506 |
| 249 self.assertIsNone(culprit) | 507 self.assertIsNone(culprit) |
| 250 | 508 |
| 251 try_job_data = WfTryJobData.Get(try_job_id) | 509 try_job_data = WfTryJobData.Get(try_job_id) |
| 252 self.assertIsNone(try_job_data.culprits) | 510 self.assertIsNone(try_job_data.culprits) |
| 253 | 511 |
| 512 self.assertEqual(analysis.result_status, |
| 513 wf_analysis_result_status.NOT_FOUND_UNTRIAGED) |
| 514 self.assertEqual(analysis.suspected_cls, []) |
| 515 |
| 254 def testIdentifyCulpritForTestTryJobReturnRevisionIfNoCulpritInfo(self): | 516 def testIdentifyCulpritForTestTryJobReturnRevisionIfNoCulpritInfo(self): |
| 255 master_name = 'm' | 517 master_name = 'm' |
| 256 builder_name = 'b' | 518 builder_name = 'b' |
| 257 build_number = 1 | 519 build_number = 1 |
| 258 try_job_id = '1' | 520 try_job_id = '1' |
| 259 | 521 |
| 260 test_result = { | 522 test_result = { |
| 261 'report': { | 523 'report': { |
| 262 'result': { | 524 'result': { |
| 263 'rev3': { | 525 'rev3': { |
| 264 'a_test': { | 526 'a_test': { |
| 265 'status': 'failed', | 527 'status': 'failed', |
| 266 'valid': True, | 528 'valid': True, |
| 267 'failures': ['a_test1'] | 529 'failures': ['a_test1'] |
| 268 } | 530 } |
| 269 } | 531 } |
| 270 } | 532 } |
| 271 }, | 533 }, |
| 272 'url': 'url', | 534 'url': 'url', |
| 273 'try_job_id': try_job_id | 535 'try_job_id': try_job_id |
| 274 } | 536 } |
| 275 | 537 |
| 276 WfTryJobData.Create(try_job_id).put() | 538 WfTryJobData.Create(try_job_id).put() |
| 277 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 539 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 278 try_job.status = wf_analysis_status.ANALYZING | 540 try_job.status = wf_analysis_status.ANALYZING |
| 279 try_job.put() | 541 try_job.put() |
| 542 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 543 analysis.put() |
| 280 | 544 |
| 281 pipeline = IdentifyTryJobCulpritPipeline() | 545 pipeline = IdentifyTryJobCulpritPipeline() |
| 282 culprit = pipeline.run( | 546 culprit = pipeline.run( |
| 283 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST, | 547 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST, |
| 284 '1', test_result) | 548 '1', test_result) |
| 285 | 549 |
| 550 expected_suspected_cl = { |
| 551 'revision': 'rev3', |
| 552 'repo_name': 'chromium' |
| 553 } |
| 554 |
| 286 expected_culprit = { | 555 expected_culprit = { |
| 287 'a_test': { | 556 'a_test': { |
| 288 'tests': { | 557 'tests': { |
| 289 'a_test1': { | 558 'a_test1': expected_suspected_cl |
| 290 'revision': 'rev3' | |
| 291 } | |
| 292 } | 559 } |
| 293 } | 560 } |
| 294 } | 561 } |
| 295 self.assertEqual(expected_culprit, culprit) | 562 self.assertEqual(expected_culprit, culprit) |
| 296 | 563 |
| 297 try_job_data = WfTryJobData.Get(try_job_id) | 564 try_job_data = WfTryJobData.Get(try_job_id) |
| 298 expected_culprit_data = { | 565 expected_culprit_data = { |
| 299 'a_test': { | 566 'a_test': { |
| 300 'a_test1': 'rev3' | 567 'a_test1': 'rev3' |
| 301 } | 568 } |
| 302 } | 569 } |
| 303 self.assertEqual(expected_culprit_data, try_job_data.culprits) | 570 self.assertEqual(expected_culprit_data, try_job_data.culprits) |
| 571 self.assertEqual(analysis.result_status, |
| 572 wf_analysis_result_status.FOUND_UNTRIAGED) |
| 573 self.assertEqual(analysis.suspected_cls, [expected_suspected_cl]) |
| 304 | 574 |
| 305 def testIdentifyCulpritForTestTryJobSuccess(self): | 575 def testIdentifyCulpritForTestTryJobSuccess(self): |
| 306 master_name = 'm' | 576 master_name = 'm' |
| 307 builder_name = 'b' | 577 builder_name = 'b' |
| 308 build_number = 1 | 578 build_number = 1 |
| 309 try_job_id = '1' | 579 try_job_id = '1' |
| 310 | 580 |
| 311 test_result = { | 581 test_result = { |
| 312 'report': { | 582 'report': { |
| 313 'result': { | 583 'result': { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 }, | 617 }, |
| 348 'url': 'url', | 618 'url': 'url', |
| 349 'try_job_id': try_job_id | 619 'try_job_id': try_job_id |
| 350 } | 620 } |
| 351 | 621 |
| 352 WfTryJobData.Create(try_job_id).put() | 622 WfTryJobData.Create(try_job_id).put() |
| 353 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 623 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 354 try_job.status = wf_analysis_status.ANALYZING | 624 try_job.status = wf_analysis_status.ANALYZING |
| 355 try_job.test_results = [test_result] | 625 try_job.test_results = [test_result] |
| 356 try_job.put() | 626 try_job.put() |
| 627 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 628 analysis.put() |
| 357 | 629 |
| 358 pipeline = IdentifyTryJobCulpritPipeline() | 630 pipeline = IdentifyTryJobCulpritPipeline() |
| 359 culprit = pipeline.run( | 631 culprit = pipeline.run( |
| 360 master_name, builder_name, build_number, ['rev1', 'rev2'], | 632 master_name, builder_name, build_number, ['rev1', 'rev2'], |
| 361 TryJobType.TEST, '1', test_result) | 633 TryJobType.TEST, '1', test_result) |
| 362 | 634 |
| 635 a_test1_suspected_cl = { |
| 636 'revision': 'rev1', |
| 637 'commit_position': '1', |
| 638 'review_url': 'url_1', |
| 639 'repo_name': 'chromium' |
| 640 } |
| 641 a_test2_suspected_cl = { |
| 642 'revision': 'rev2', |
| 643 'commit_position': '2', |
| 644 'review_url': 'url_2', |
| 645 'repo_name': 'chromium' |
| 646 } |
| 647 b_test1_suspected_cl = a_test1_suspected_cl |
| 648 |
| 363 expected_test_result = { | 649 expected_test_result = { |
| 364 'report': { | 650 'report': { |
| 365 'result': { | 651 'result': { |
| 366 'rev1': { | 652 'rev1': { |
| 367 'a_test': { | 653 'a_test': { |
| 368 'status': 'failed', | 654 'status': 'failed', |
| 369 'valid': True, | 655 'valid': True, |
| 370 'failures': ['a_test1'] | 656 'failures': ['a_test1'] |
| 371 }, | 657 }, |
| 372 'b_test': { | 658 'b_test': { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 395 'failures': [] | 681 'failures': [] |
| 396 } | 682 } |
| 397 } | 683 } |
| 398 } | 684 } |
| 399 }, | 685 }, |
| 400 'url': 'url', | 686 'url': 'url', |
| 401 'try_job_id': try_job_id, | 687 'try_job_id': try_job_id, |
| 402 'culprit': { | 688 'culprit': { |
| 403 'a_test': { | 689 'a_test': { |
| 404 'tests': { | 690 'tests': { |
| 405 'a_test1': { | 691 'a_test1': a_test1_suspected_cl, |
| 406 'revision': 'rev1', | 692 'a_test2': a_test2_suspected_cl |
| 407 'commit_position': '1', | |
| 408 'review_url': 'url_1' | |
| 409 }, | |
| 410 'a_test2': { | |
| 411 'revision': 'rev2', | |
| 412 'commit_position': '2', | |
| 413 'review_url': 'url_2' | |
| 414 } | |
| 415 } | 693 } |
| 416 }, | 694 }, |
| 417 'b_test': { | 695 'b_test': { |
| 418 'tests': { | 696 'tests': { |
| 419 'b_test1': { | 697 'b_test1': b_test1_suspected_cl |
| 420 'revision': 'rev1', | |
| 421 'commit_position': '1', | |
| 422 'review_url': 'url_1' | |
| 423 } | |
| 424 } | 698 } |
| 425 }, | 699 }, |
| 426 'c_test': { | 700 'c_test': { |
| 427 'revision': 'rev2', | 701 'revision': 'rev2', |
| 428 'commit_position': '2', | 702 'commit_position': '2', |
| 429 'review_url': 'url_2', | 703 'review_url': 'url_2', |
| 704 'repo_name': 'chromium', |
| 430 'tests': {} | 705 'tests': {} |
| 431 } | 706 } |
| 432 } | 707 } |
| 433 } | 708 } |
| 434 | 709 |
| 435 self.assertEqual(expected_test_result['culprit'], culprit) | 710 self.assertEqual(expected_test_result['culprit'], culprit) |
| 436 | 711 |
| 437 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 712 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 438 self.assertEqual(expected_test_result, try_job.test_results[-1]) | 713 self.assertEqual(expected_test_result, try_job.test_results[-1]) |
| 439 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 714 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 440 | 715 |
| 441 try_job_data = WfTryJobData.Get(try_job_id) | 716 try_job_data = WfTryJobData.Get(try_job_id) |
| 442 expected_culprit_data = { | 717 expected_culprit_data = { |
| 443 'a_test': { | 718 'a_test': { |
| 444 'a_test1': 'rev1', | 719 'a_test1': 'rev1', |
| 445 'a_test2': 'rev2', | 720 'a_test2': 'rev2', |
| 446 }, | 721 }, |
| 447 'b_test': { | 722 'b_test': { |
| 448 'b_test1': 'rev1', | 723 'b_test1': 'rev1', |
| 449 }, | 724 }, |
| 450 'c_test': 'rev2' | 725 'c_test': 'rev2' |
| 451 } | 726 } |
| 452 self.assertEqual(expected_culprit_data, try_job_data.culprits) | 727 self.assertEqual(expected_culprit_data, try_job_data.culprits) |
| 728 self.assertEqual(analysis.result_status, |
| 729 wf_analysis_result_status.FOUND_UNTRIAGED) |
| 730 self.assertEqual(analysis.suspected_cls, |
| 731 [a_test2_suspected_cl, a_test1_suspected_cl]) |
| OLD | NEW |