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

Side by Side Diff: appengine/findit/waterfall/test/identify_culprit_pipeline_test.py

Issue 2230103002: [Findit] Pipeline change to save suspected cls to data store. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@0808-resubmit-suspected_cl_model
Patch Set: rebase Created 4 years, 2 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 unified diff | Download patch
OLDNEW
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.pipeline_wrapper import pipeline_handlers 7 from common.pipeline_wrapper import pipeline_handlers
8 from common.waterfall import failure_type
8 from model import analysis_status 9 from model import analysis_status
9 from model import result_status 10 from model import result_status
10 from model.wf_analysis import WfAnalysis 11 from model.wf_analysis import WfAnalysis
12 from model.wf_suspected_cl import WfSuspectedCL
11 from waterfall import build_failure_analysis 13 from waterfall import build_failure_analysis
12 from waterfall import identify_culprit_pipeline 14 from waterfall import identify_culprit_pipeline
13 15
14 16
15 class IdentifyCulpritPipelineTest(testing.AppengineTestCase): 17 class IdentifyCulpritPipelineTest(testing.AppengineTestCase):
16 app_module = pipeline_handlers._APP 18 app_module = pipeline_handlers._APP
17 19
18 def testGetSuspectedCLs(self):
19 dummy_result = {
20 'failures': [
21 {
22 'step_name': 'a',
23 'first_failure': 98,
24 'last_pass': None,
25 'suspected_cls': [
26 {
27 'build_number': 99,
28 'repo_name': 'chromium',
29 'revision': 'r99_1',
30 'commit_position': None,
31 'url': None,
32 'score': 1,
33 'hints': {
34 'modified f99_2.cc (and it was in log)': 1,
35 },
36 }
37 ],
38 },
39 {
40 'step_name': 'b',
41 'first_failure': 98,
42 'last_pass': None,
43 'suspected_cls': [
44 {
45 'build_number': 99,
46 'repo_name': 'chromium',
47 'revision': 'r99_2',
48 'commit_position': None,
49 'url': None,
50 'score': 5,
51 'hints': {
52 'added x/y/f99_1.cc (and it was in log)': 5,
53 },
54 }
55 ],
56 }
57 ]
58 }
59
60 expected_suspected_cls = [
61 {
62 'repo_name': 'chromium',
63 'revision': 'r99_1',
64 'commit_position': None,
65 'url': None
66 },
67 {
68 'repo_name': 'chromium',
69 'revision': 'r99_2',
70 'commit_position': None,
71 'url': None
72 }
73 ]
74
75 self.assertEqual(expected_suspected_cls,
76 identify_culprit_pipeline._GetSuspectedCLs(dummy_result))
77
78 def testGetSuspectedCLsNoDuplicates(self):
79 dummy_result = {
80 'failures': [
81 {
82 'step_name': 'a',
83 'first_failure': 98,
84 'last_pass': None,
85 'suspected_cls': [
86 {
87 'build_number': 99,
88 'repo_name': 'chromium',
89 'revision': 'r99_1',
90 'commit_position': None,
91 'url': None,
92 'score': 1,
93 'hints': {
94 'modified f99_2.cc (and it was in log)': 1,
95 },
96 }
97 ],
98 },
99 {
100 'step_name': 'b',
101 'first_failure': 98,
102 'last_pass': None,
103 'suspected_cls': [
104 {
105 'build_number': 99,
106 'repo_name': 'chromium',
107 'revision': 'r99_1',
108 'commit_position': None,
109 'url': None,
110 'score': 5,
111 'hints': {
112 'added x/y/f99_1.cc (and it was in log)': 5,
113 },
114 }
115 ],
116 }
117 ]
118 }
119
120 expected_suspected_cls = [
121 {
122 'repo_name': 'chromium',
123 'revision': 'r99_1',
124 'commit_position': None,
125 'url': None
126 }
127 ]
128
129 self.assertEqual(expected_suspected_cls,
130 identify_culprit_pipeline._GetSuspectedCLs(dummy_result))
131
132 def testGetResultAnalysisStatusFoundUntriaged(self): 20 def testGetResultAnalysisStatusFoundUntriaged(self):
133 dummy_result = { 21 dummy_result = {
134 'failures': [ 22 'failures': [
135 { 23 {
136 'step_name': 'a', 24 'step_name': 'a',
137 'first_failure': 98, 25 'first_failure': 98,
138 'last_pass': None, 26 'last_pass': None,
139 'suspected_cls': [ 27 'suspected_cls': [
140 { 28 {
141 'build_number': 99, 29 'build_number': 99,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 92
205 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 93 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
206 analysis.result = None 94 analysis.result = None
207 analysis.status = analysis_status.RUNNING 95 analysis.status = analysis_status.RUNNING
208 analysis.put() 96 analysis.put()
209 97
210 failure_info = { 98 failure_info = {
211 'master_name': master_name, 99 'master_name': master_name,
212 'builder_name': builder_name, 100 'builder_name': builder_name,
213 'build_number': build_number, 101 'build_number': build_number,
102 'failure_type': failure_type.TEST
214 } 103 }
215 change_logs = {} 104 change_logs = {}
216 deps_info = {} 105 deps_info = {}
217 signals = {} 106 signals = {}
218 107
219 dummy_result = {'failures': []} 108 dummy_result = {'failures': []}
220 109
221 def MockAnalyzeBuildFailure(*_): 110 def MockAnalyzeBuildFailure(*_):
222 return dummy_result 111 return dummy_result, []
223 112
224 self.mock(build_failure_analysis, 113 self.mock(build_failure_analysis,
225 'AnalyzeBuildFailure', MockAnalyzeBuildFailure) 114 'AnalyzeBuildFailure', MockAnalyzeBuildFailure)
226 115
227 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline( 116 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline(
228 failure_info, change_logs, deps_info, signals, True) 117 failure_info, change_logs, deps_info, signals, True)
229 pipeline.start() 118 pipeline.start()
230 self.execute_queued_tasks() 119 self.execute_queued_tasks()
231 120
232 expected_suspected_cls = [] 121 expected_suspected_cls = []
233 122
234 analysis = WfAnalysis.Get(master_name, builder_name, build_number) 123 analysis = WfAnalysis.Get(master_name, builder_name, build_number)
235 self.assertTrue(analysis.build_completed) 124 self.assertTrue(analysis.build_completed)
236 self.assertIsNotNone(analysis) 125 self.assertIsNotNone(analysis)
237 self.assertEqual(dummy_result, analysis.result) 126 self.assertEqual(dummy_result, analysis.result)
238 self.assertEqual(analysis_status.COMPLETED, analysis.status) 127 self.assertEqual(analysis_status.COMPLETED, analysis.status)
239 self.assertIsNone(analysis.result_status) 128 self.assertIsNone(analysis.result_status)
240 self.assertEqual(expected_suspected_cls, analysis.suspected_cls) 129 self.assertEqual(expected_suspected_cls, analysis.suspected_cls)
130
131 def testSaveSuspectedCLs(self):
132 suspected_cls = [
133 {
134 'repo_name': 'chromium',
135 'revision': 'r98_1',
136 'commit_position': None,
137 'url': None,
138 'failures': {
139 'b': ['Unittest2.Subtest1', 'Unittest3.Subtest2']
140 },
141 'top_score': 4
142 }
143 ]
144 master_name = 'm'
145 builder_name = 'b'
146 build_number = 98
147 test_type = failure_type.TEST
148
149 identify_culprit_pipeline._SaveSuspectedCLs(
150 suspected_cls, master_name, builder_name, build_number, test_type)
151
152 suspected_cl = WfSuspectedCL.Get('chromium', 'r98_1')
153 self.assertIsNotNone(suspected_cl)
154
155 def testGetSuspectedCLsWithOnlyCLInfo(self):
156 suspected_cls = [
157 {
158 'repo_name': 'chromium',
159 'revision': 'r98_1',
160 'commit_position': None,
161 'url': None,
162 'failures': {
163 'b': ['Unittest2.Subtest1', 'Unittest3.Subtest2']
164 },
165 'top_score': 4
166 }
167 ]
168
169 expected_new_suspected_cls = [
170 {
171 'repo_name': 'chromium',
172 'revision': 'r98_1',
173 'commit_position': None,
174 'url': None
175 }
176 ]
177
178 self.assertEqual(
179 expected_new_suspected_cls,
180 identify_culprit_pipeline._GetSuspectedCLsWithOnlyCLInfo(suspected_cls))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698