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

Side by Side Diff: appengine/findit/waterfall/flake/test/flake_analysis_service_test.py

Issue 2396283002: [Findit] Hook up analysis for CQ flakes. (Closed)
Patch Set: Fix nit 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
« no previous file with comments | « appengine/findit/waterfall/flake/step_mapper.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 from datetime import datetime
6 import mock
7
8 from common import constants
9 from model.flake.flake_analysis_request import BuildStep
10 from model.flake.flake_analysis_request import FlakeAnalysisRequest
11 from waterfall.flake import flake_analysis_service
12 from waterfall.test import wf_testcase
13
14
15 class FlakeAnalysisServiceTest(wf_testcase.WaterfallTestCase):
16
17 def testCheckFlakeSwarmedAndSupportedWhenNotSupported(self):
18 request = FlakeAnalysisRequest.Create('flake', False, 123)
19 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01))
20 step1.swarmed = False
21 step1.supported = False
22 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01))
23 step2.swarmed = False
24 step2.supported = False
25 request.build_steps = [step1, step2]
26
27 self.assertEqual(
28 (False, False, None),
29 flake_analysis_service._CheckFlakeSwarmedAndSupported(request))
30
31
32 def testNeedNewAnalysisWhenNoPreviousOneAndNotStepLevelFlake(self):
33 request = FlakeAnalysisRequest.Create('flake', False, 123)
34 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01))
35 step1.swarmed = False
36 step1.supported = False
37 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01))
38 step2.swarmed = True
39 step2.supported = True
40 request.build_steps = [step1, step2]
41
42 version, step = flake_analysis_service._CheckForNewAnalysis(request)
43
44 self.assertEqual(1, version)
45 self.assertIsNotNone(step)
46 self.assertTrue(step.scheduled)
47
48 def testNeedNewAnalysisWhenPreviousOneWasForAnotherBug(self):
49 previous_request = FlakeAnalysisRequest.Create('flake', False, 123)
50 previous_request.Save()
51
52 request = FlakeAnalysisRequest.Create('flake', False, 456)
53 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01))
54 step1.swarmed = False
55 step1.supported = False
56 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01))
57 step2.swarmed = True
58 step2.supported = True
59 request.build_steps = [step1, step2]
60
61 version, step = flake_analysis_service._CheckForNewAnalysis(request)
62
63 self.assertEqual(2, version)
64 self.assertIsNotNone(step)
65 self.assertTrue(step.scheduled)
66 self.assertTrue(step.swarmed)
67 self.assertTrue(step.supported)
68
69 def testNotNeedNewAnalysisForStepLevelFlake(self):
70 request = FlakeAnalysisRequest.Create('flake', True, 123)
71 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01))
72 step1.swarmed = True
73 step1.supported = True
74 request.build_steps = [step1]
75
76 version, step = flake_analysis_service._CheckForNewAnalysis(request)
77
78 self.assertEqual(0, version)
79 self.assertIsNone(step)
80
81 def testNeedNewAnalysisWithADifferentNewStep(self):
82 previous_request = FlakeAnalysisRequest.Create('flake', False, 123)
83 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01))
84 step1.swarmed = True
85 step1.supported = True
86 step1.scheduled = True
87 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01))
88 step2.swarmed = True
89 step2.supported = True
90 step2.scheduled = False
91 previous_request.supported = True
92 previous_request.swarmed = True
93 previous_request.build_steps = [step1, step2]
94 previous_request.Save()
95
96 request = FlakeAnalysisRequest.Create('flake', False, 123)
97 step3 = BuildStep.Create('m', 'b3', 13, 's', datetime(2016, 10, 01))
98 step3.swarmed = True
99 step3.supported = True
100 request.build_steps = [step3]
101
102 version, step = flake_analysis_service._CheckForNewAnalysis(request)
103
104 self.assertEqual(1, version)
105 self.assertIsNotNone(step)
106 self.assertTrue(step.scheduled)
107 self.assertEqual('b3', step.builder_name)
108
109 def testNeedNewAnalysisWithADifferentFormerReportedStep(self):
110 previous_request = FlakeAnalysisRequest.Create('flake', False, 123)
111 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01))
112 step1.swarmed = True
113 step1.supported = True
114 step1.scheduled = True
115 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01))
116 step2.swarmed = True
117 step2.supported = True
118 step2.scheduled = False
119 previous_request.supported = True
120 previous_request.swarmed = True
121 previous_request.build_steps = [step1, step2]
122 previous_request.Save()
123
124 request = FlakeAnalysisRequest.Create('flake', False, 123)
125 step3 = BuildStep.Create('m', 'b3', 13, 's', datetime(2016, 10, 01))
126 step3.swarmed = False
127 step3.supported = False
128 request.build_steps = [step3]
129
130 version, step = flake_analysis_service._CheckForNewAnalysis(request)
131
132 self.assertEqual(1, version)
133 self.assertIsNotNone(step)
134 self.assertTrue(step.scheduled)
135 self.assertEqual('b2', step.builder_name)
136
137 def testNotNeedNewAnalysisWithFreshEnoughPreviousAnalysis(self):
138 previous_request = FlakeAnalysisRequest.Create('flake', False, 123)
139 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01))
140 step1.swarmed = True
141 step1.supported = True
142 step1.scheduled = True
143 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01))
144 step2.swarmed = True
145 step2.supported = True
146 step2.scheduled = True
147 previous_request.supported = True
148 previous_request.swarmed = True
149 previous_request.build_steps = [step1, step2]
150 previous_request.Save()
151
152 request = FlakeAnalysisRequest.Create('flake', False, 123)
153 step3 = BuildStep.Create('m', 'b2', 20, 's', datetime(2016, 10, 03))
154 step3.swarmed = True
155 step3.supported = True
156 request.build_steps = [step3]
157
158 version, step = flake_analysis_service._CheckForNewAnalysis(request)
159
160 self.assertEqual(0, version)
161 self.assertIsNone(step)
162
163 def testNeedNewAnalysisWithTooOldPreviousAnalysis(self):
164 previous_request = FlakeAnalysisRequest.Create('flake', False, None)
165 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01))
166 step1.swarmed = True
167 step1.supported = True
168 step1.scheduled = True
169 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01))
170 step2.swarmed = True
171 step2.supported = True
172 step2.scheduled = True
173 previous_request.supported = True
174 previous_request.swarmed = True
175 previous_request.build_steps = [step1, step2]
176 previous_request.Save()
177
178 request = FlakeAnalysisRequest.Create('flake', False, 123)
179 step3 = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20))
180 step3.swarmed = True
181 step3.supported = True
182 request.build_steps = [step3]
183
184 version, step = flake_analysis_service._CheckForNewAnalysis(request)
185
186 self.assertEqual(1, version)
187 self.assertIsNotNone(step)
188 self.assertEqual(80, step.build_number)
189
190 def testUnauthorizedAccess(self):
191 request = FlakeAnalysisRequest.Create('flake', False, 123)
192 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20))
193 request.build_steps = [step]
194
195 self.assertIsNone(flake_analysis_service.ScheduleAnalysisForFlake(
196 request, 'test@chromium.org', False))
197
198 @mock.patch.object(
199 flake_analysis_service, '_CheckForNewAnalysis', return_value= (0, None))
200 @mock.patch.object(
201 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep')
202 def testAuthorizedAccessButNoNewAnalysisNeeded(self, _mock1, _mock2):
203 request = FlakeAnalysisRequest.Create('flake', False, 123)
204 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20))
205 request.build_steps = [step]
206
207 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake(
208 request, 'test@chromium.org', True))
209
210 @mock.patch.object(
211 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep')
212 def testAuthorizedAccessAndNewAnalysisNeededAndTriggered(self, _mock):
213 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20))
214 request = FlakeAnalysisRequest.Create('flake', False, 123)
215 request.build_steps = [step]
216
217 def CheckForNewAnalysis(*_):
218 step.wf_master_name = 'wf_m'
219 step.wf_builder_name = 'wf_b'
220 step.wf_build_number = 100
221 step.wf_step_name = 'wf_s'
222 return 1, step
223
224 mocked_analysis = mock.Mock(key='key')
225 mocked_request = mock.Mock()
226
227 with mock.patch.object(
228 flake_analysis_service, '_CheckForNewAnalysis',
229 side_effect=CheckForNewAnalysis) as (
230 mocked_CheckForNewAnalysis), mock.patch.object(
231 flake_analysis_service.initialize_flake_pipeline,
232 'ScheduleAnalysisIfNeeded', return_value=mocked_analysis) as (
233 mocked_ScheduleAnalysisIfNeeded), mock.patch.object(
234 flake_analysis_service.FlakeAnalysisRequest,
235 'GetVersion', return_value=mocked_request) as mocked_GetVersion:
236 self.assertTrue(flake_analysis_service.ScheduleAnalysisForFlake(
237 request, 'test@chromium.org', True))
238 mocked_CheckForNewAnalysis.assert_called_once_with(request)
239 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with(
240 'wf_m', 'wf_b', 100, 'wf_s', 'flake',
241 allow_new_analysis=True, manually_triggered=False,
242 queue_name=constants.WATERFALL_ANALYSIS_QUEUE)
243 mocked_GetVersion.assert_called_once_with(key='flake', version=1)
244 mocked_request.assert_has_calls([
245 mock.call.analyses.append('key'),
246 mock.call.put(),
247 ])
248
249 @mock.patch.object(
250 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep')
251 def testAuthorizedAccessAndNewAnalysisNeededButNotTriggered(self, _mock):
252 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20))
253 request = FlakeAnalysisRequest.Create('flake', False, 123)
254 request.build_steps = [step]
255
256 def CheckForNewAnalysis(*_):
257 step.wf_master_name = 'wf_m'
258 step.wf_builder_name = 'wf_b'
259 step.wf_build_number = 100
260 step.wf_step_name = 'wf_s'
261 return 1, step
262
263 with mock.patch.object(
264 flake_analysis_service, '_CheckForNewAnalysis',
265 side_effect=CheckForNewAnalysis) as (
266 mocked_CheckForNewAnalysis), mock.patch.object(
267 flake_analysis_service.initialize_flake_pipeline,
268 'ScheduleAnalysisIfNeeded', return_value=None) as (
269 mocked_ScheduleAnalysisIfNeeded), mock.patch.object(
270 flake_analysis_service.FlakeAnalysisRequest,
271 'GetVersion', return_value=None) as mocked_GetVersion:
272 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake(
273 request, 'test@chromium.org', True))
274 mocked_CheckForNewAnalysis.assert_called_once_with(request)
275 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with(
276 'wf_m', 'wf_b', 100, 'wf_s', 'flake',
277 allow_new_analysis=True, manually_triggered=False,
278 queue_name=constants.WATERFALL_ANALYSIS_QUEUE)
279 mocked_GetVersion.assert_not_called()
OLDNEW
« no previous file with comments | « appengine/findit/waterfall/flake/step_mapper.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698