Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2433)

Unified Diff: appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py

Issue 1870103003: [Findit] Adding Try Job suspected CLs and result status to analysis (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py
diff --git a/appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py b/appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py
index 421f0bd1edffa2e3e338931c484229060c8ed4fa..ecbd71940fd0ae777862a703ba619f6beb8bf96a 100644
--- a/appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py
+++ b/appengine/findit/waterfall/test/identify_try_job_culprit_pipeline_test.py
@@ -5,9 +5,12 @@
from testing_utils import testing
from common.git_repository import GitRepository
+from model import wf_analysis_result_status
from model import wf_analysis_status
+from model.wf_analysis import WfAnalysis
from model.wf_try_job import WfTryJob
from model.wf_try_job_data import WfTryJobData
+from waterfall import identify_try_job_culprit_pipeline
from waterfall.identify_try_job_culprit_pipeline import(
IdentifyTryJobCulpritPipeline)
from waterfall.try_job_type import TryJobType
@@ -76,6 +79,234 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
}
}))
+ def testGetResultanalysisStatusWithTryJobCulpritNotFoundUntriaged(self):
+ # Heuristic analysis provided no results, but the try job found a culprit.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.result_status = wf_analysis_result_status.NOT_FOUND_UNTRIAGED
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ }
+ }
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+
+ self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
+
+ def testGetResultanalysisStatusWithTryJobCulpritNotFoundCorrect(self):
+ # Heuristic analysis found no results, which was correct. In this case, the
+ # try job result is actually a false positive.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.result_status = wf_analysis_result_status.NOT_FOUND_CORRECT
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ }
+ }
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+
+ self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
+
+ def testGetResultanalysisStatusWithTryJobCulpritNotFoundIncorrect(self):
+ # Heuristic analysis found no results and was triaged to incorrect before a
+ # try job result was found. In this case the try job result should override
+ # the heuristic result.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.result_status = wf_analysis_result_status.NOT_FOUND_INCORRECT
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ }
+ }
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+
+ self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
+
+ def testGetResultanalysisStatusWithTryJobCulpritNoHeuristicResult(self):
+ # In this case, the try job found a result before the heuristic result is
+ # available. This case should generally never happen, as heuristic analysis
+ # is usually much faster than try jobs.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ }
+ }
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+
+ self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
+
+ def testGetResultanalysisStatusWithNoTryJobCulpritNoHeuristicResult(self):
+ # In this case, the try job completed faster than heuristic analysis
+ # (which should never happen) but no results were found.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.put()
+
+ result = {}
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+ self.assertEqual(status, wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
+
+ def testGetResultanalysisStatusWithTryJobCulpritAndHeuristicResult(self):
+ # In this case, heuristic analysis found the correct culprit. The try job
+ # result should not overwrite it.
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.result_status = wf_analysis_result_status.FOUND_CORRECT
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ }
+ }
+
+ status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
+ analysis, result)
+ self.assertEqual(status, wf_analysis_result_status.FOUND_CORRECT)
+
+ def testGetSuspectedCLsForCompileTryJob(self):
+ heuristic_suspected_cl = {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+
+ compile_suspected_cl = {
+ 'revision': 'rev2',
+ 'commit_position': '2',
+ 'review_url': 'url_2',
+ 'repo_name': 'chromium'
+ }
+
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.suspected_cls = [heuristic_suspected_cl]
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': compile_suspected_cl
+ }
+ }
+
+ self.assertEqual(
+ identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
+ [heuristic_suspected_cl, compile_suspected_cl])
+
+ def testGetSuspectedCLsForTestTryJobAndHeuristicResultsSame(self):
+ suspected_cl = {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.suspected_cls = [suspected_cl]
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'compile': suspected_cl
+ }
+ }
+
+ self.assertEqual(
+ identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
+ [suspected_cl])
+
+ def testGetSuspectedCLsForTestTryJob(self):
+ suspected_cl1 = {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ suspected_cl2 = {
+ 'revision': 'rev2',
+ 'commit_position': '2',
+ 'review_url': 'url_2',
+ 'repo_name': 'chromium'
+ }
+ suspected_cl3 = {
+ 'revision': 'rev3',
+ 'commit_position': '3',
+ 'review_url': 'url_3',
+ 'repo_name': 'chromium'
+ }
+
+ analysis = WfAnalysis.Create('m', 'b', 1)
+ analysis.suspected_cls = []
+ analysis.put()
+
+ result = {
+ 'culprit': {
+ 'a_test': {
+ 'tests': {
+ 'a_test1': suspected_cl1,
+ 'a_test2': suspected_cl1
+ }
+ },
+ 'b_test': {
+ 'tests': {
+ 'b_test1': suspected_cl2
+ }
+ },
+ 'c_test': {
+ 'revision': 'rev3',
+ 'commit_position': '3',
+ 'review_url': 'url_3',
+ 'repo_name': 'chromium',
+ 'tests': {}
+ }
+ }
+ }
+
+ self.assertEqual(
+ identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
+ [suspected_cl3, suspected_cl2, suspected_cl1])
+
def testIdentifyCulpritForCompileTryJobNoCulprit(self):
master_name = 'm'
builder_name = 'b'
@@ -87,6 +318,9 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job_data = WfTryJobData.Create(try_job_id)
try_job_data.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
+
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
master_name, builder_name, build_number, ['rev1'],
@@ -97,6 +331,9 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
self.assertEqual([], try_job.compile_results)
self.assertIsNone(culprit)
self.assertIsNone(try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls, [])
def testIdentifyCulpritForCompileTryJobSuccess(self):
master_name = 'm'
@@ -128,6 +365,8 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
'try_job_id': try_job_id,
}]
try_job.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
@@ -135,6 +374,12 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
TryJobType.COMPILE, '1', compile_result)
expected_culprit = 'rev2'
+ expected_suspected_cl = {
+ 'revision': 'rev2',
+ 'commit_position': '2',
+ 'review_url': 'url_2',
+ 'repo_name': 'chromium'
+ }
expected_compile_result = {
'report': {
'result': {
@@ -144,11 +389,7 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
},
'try_job_id': try_job_id,
'culprit': {
- 'compile': {
- 'revision': 'rev2',
- 'commit_position': '2',
- 'review_url': 'url_2'
- }
+ 'compile': expected_suspected_cl
}
}
@@ -160,6 +401,10 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job_data = WfTryJobData.Get(try_job_id)
self.assertEqual({'compile': expected_culprit}, try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls,
+ [expected_suspected_cl])
def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self):
master_name = 'm'
@@ -180,6 +425,8 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
WfTryJobData.Create(try_job_id).put()
WfTryJob.Create(master_name, builder_name, build_number).put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
@@ -193,6 +440,10 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job_data = WfTryJobData.Get(try_job_id)
self.assertIsNone(try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls, [])
+
def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self):
master_name = 'm'
builder_name = 'b'
@@ -203,6 +454,8 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job = WfTryJob.Create(master_name, builder_name, build_number)
try_job.status = wf_analysis_status.ANALYZING
try_job.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
@@ -213,6 +466,9 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job_data = WfTryJobData.Get(try_job_id)
self.assertIsNone(try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls, [])
def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self):
master_name = 'm'
@@ -240,6 +496,8 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job = WfTryJob.Create(master_name, builder_name, build_number)
try_job.status = wf_analysis_status.ANALYZING
try_job.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
@@ -251,6 +509,10 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job_data = WfTryJobData.Get(try_job_id)
self.assertIsNone(try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls, [])
+
def testIdentifyCulpritForTestTryJobReturnRevisionIfNoCulpritInfo(self):
master_name = 'm'
builder_name = 'b'
@@ -277,18 +539,23 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job = WfTryJob.Create(master_name, builder_name, build_number)
try_job.status = wf_analysis_status.ANALYZING
try_job.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
master_name, builder_name, build_number, ['rev3'], TryJobType.TEST,
'1', test_result)
+ expected_suspected_cl = {
+ 'revision': 'rev3',
+ 'repo_name': 'chromium'
+ }
+
expected_culprit = {
'a_test': {
'tests': {
- 'a_test1': {
- 'revision': 'rev3'
- }
+ 'a_test1': expected_suspected_cl
}
}
}
@@ -301,6 +568,9 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
}
}
self.assertEqual(expected_culprit_data, try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls, [expected_suspected_cl])
def testIdentifyCulpritForTestTryJobSuccess(self):
master_name = 'm'
@@ -354,12 +624,28 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
try_job.status = wf_analysis_status.ANALYZING
try_job.test_results = [test_result]
try_job.put()
+ analysis = WfAnalysis.Create(master_name, builder_name, build_number)
+ analysis.put()
pipeline = IdentifyTryJobCulpritPipeline()
culprit = pipeline.run(
master_name, builder_name, build_number, ['rev1', 'rev2'],
TryJobType.TEST, '1', test_result)
+ a_test1_suspected_cl = {
+ 'revision': 'rev1',
+ 'commit_position': '1',
+ 'review_url': 'url_1',
+ 'repo_name': 'chromium'
+ }
+ a_test2_suspected_cl = {
+ 'revision': 'rev2',
+ 'commit_position': '2',
+ 'review_url': 'url_2',
+ 'repo_name': 'chromium'
+ }
+ b_test1_suspected_cl = a_test1_suspected_cl
+
expected_test_result = {
'report': {
'result': {
@@ -402,31 +688,20 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
'culprit': {
'a_test': {
'tests': {
- 'a_test1': {
- 'revision': 'rev1',
- 'commit_position': '1',
- 'review_url': 'url_1'
- },
- 'a_test2': {
- 'revision': 'rev2',
- 'commit_position': '2',
- 'review_url': 'url_2'
- }
+ 'a_test1': a_test1_suspected_cl,
+ 'a_test2': a_test2_suspected_cl
}
},
'b_test': {
'tests': {
- 'b_test1': {
- 'revision': 'rev1',
- 'commit_position': '1',
- 'review_url': 'url_1'
- }
+ 'b_test1': b_test1_suspected_cl
}
},
'c_test': {
'revision': 'rev2',
'commit_position': '2',
'review_url': 'url_2',
+ 'repo_name': 'chromium',
'tests': {}
}
}
@@ -450,3 +725,7 @@ class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
'c_test': 'rev2'
}
self.assertEqual(expected_culprit_data, try_job_data.culprits)
+ self.assertEqual(analysis.result_status,
+ wf_analysis_result_status.FOUND_UNTRIAGED)
+ self.assertEqual(analysis.suspected_cls,
+ [a_test2_suspected_cl, a_test1_suspected_cl])

Powered by Google App Engine
This is Rietveld 408576698