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

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

Issue 2376573004: [Findit] For automatic analyses of flaky tests, run the Swarming tasks off PST peak hours. (Closed)
Patch Set: 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 2016 The Chromium Authors. All rights reserved. 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 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 datetime import datetime
6
7 import pytz
8
5 from common import constants 9 from common import constants
6 from common.pipeline_wrapper import pipeline_handlers 10 from common.pipeline_wrapper import pipeline_handlers
7 from model import analysis_status 11 from model import analysis_status
8 from model.flake.master_flake_analysis import MasterFlakeAnalysis 12 from model.flake.master_flake_analysis import MasterFlakeAnalysis
9 from model.flake.flake_swarming_task import FlakeSwarmingTask 13 from model.flake.flake_swarming_task import FlakeSwarmingTask
10 from waterfall.flake import recursive_flake_pipeline 14 from waterfall.flake import recursive_flake_pipeline
11 from waterfall.flake.recursive_flake_pipeline import get_next_run 15 from waterfall.flake.recursive_flake_pipeline import get_next_run
12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline 16 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline
13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline 17 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline
14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run 18 from waterfall.flake.recursive_flake_pipeline import sequential_next_run
(...skipping 12 matching lines...) Expand all
27 analysis.put() 31 analysis.put()
28 32
29 def _CreateAndSaveFlakeSwarmingTask( 33 def _CreateAndSaveFlakeSwarmingTask(
30 self, master_name, builder_name, build_number, 34 self, master_name, builder_name, build_number,
31 step_name, test_name, status): 35 step_name, test_name, status):
32 flake_swarming_task = FlakeSwarmingTask.Create( 36 flake_swarming_task = FlakeSwarmingTask.Create(
33 master_name, builder_name, build_number, step_name, test_name) 37 master_name, builder_name, build_number, step_name, test_name)
34 flake_swarming_task.status = status 38 flake_swarming_task.status = status
35 flake_swarming_task.put() 39 flake_swarming_task.put()
36 40
41 def testGetETAToStartAnalysisWhenManuallyTriggered(self):
42 mocked_utcnow = datetime.utcnow()
43 self.MockUTCNow(mocked_utcnow)
44 self.assertEqual(mocked_utcnow,
45 recursive_flake_pipeline._GetETAToStartAnalysis(True))
46
47 def testGetETAToStartAnalysisWhenTriggeredOnPSTWeekend(self):
48 # Sunday 1pm in PST.
49 mocked_utcnow = datetime(2016, 9, 04, 20, 0, 0, 0, pytz.utc)
50 self.MockUTCNow(mocked_utcnow)
51 self.MockUTCNowWithTimezone(mocked_utcnow)
52 self.assertEqual(mocked_utcnow,
53 recursive_flake_pipeline._GetETAToStartAnalysis(False))
54
55 def testGetETAToStartAnalysisWhenTriggeredOffPeakHoursOnPSTWeekday(self):
56 # Tuesday 1am in PST.
57 mocked_utcnow = datetime(2016, 9, 20, 8, 0, 0, 0, pytz.utc)
58 self.MockUTCNow(mocked_utcnow)
59 self.MockUTCNowWithTimezone(mocked_utcnow)
60 self.assertEqual(mocked_utcnow,
61 recursive_flake_pipeline._GetETAToStartAnalysis(False))
62
63 def testGetETAToStartAnalysisWhenTriggeredInPeakHoursOnPSTWeekday(self):
64 # Tuesday 1pm in PST.
65 mocked_utcnow = datetime(2016, 9, 20, 20, 0, 0, 0, pytz.utc)
66 self.MockUTCNow(mocked_utcnow)
67 self.MockUTCNowWithTimezone(mocked_utcnow)
68 eta = recursive_flake_pipeline._GetETAToStartAnalysis(False)
69 self.assertEqual(2016, eta.year)
70 self.assertEqual(9, eta.month)
71 self.assertEqual(21, eta.day)
72 self.assertEqual(1, eta.hour)
73 seconds = eta.minute * 60 + eta.second
74 self.assertTrue(seconds >= 0 and seconds <= 30 * 60)
75
37 def testRecursiveFlakePipeline(self): 76 def testRecursiveFlakePipeline(self):
38 master_name = 'm' 77 master_name = 'm'
39 builder_name = 'b' 78 builder_name = 'b'
40 master_build_number = 100 79 master_build_number = 100
41 build_number = 100 80 build_number = 100
42 run_build_number = 100 81 run_build_number = 100
43 step_name = 's' 82 step_name = 's'
44 test_name = 't' 83 test_name = 't'
45 test_result_future = 'test_result_future' 84 test_result_future = 'test_result_future'
46 queue_name = constants.DEFAULT_QUEUE 85 queue_name = constants.DEFAULT_QUEUE
(...skipping 30 matching lines...) Expand all
77 expected_args=[master_name, builder_name, 116 expected_args=[master_name, builder_name,
78 run_build_number, step_name, task_id, 117 run_build_number, step_name, task_id,
79 master_build_number, test_name], 118 master_build_number, test_name],
80 expected_kwargs={}) 119 expected_kwargs={})
81 120
82 self.MockPipeline( 121 self.MockPipeline(
83 recursive_flake_pipeline.NextBuildNumberPipeline, 122 recursive_flake_pipeline.NextBuildNumberPipeline,
84 '', 123 '',
85 expected_args=[master_name, builder_name, master_build_number, 124 expected_args=[master_name, builder_name, master_build_number,
86 build_number, step_name, test_name, 125 build_number, step_name, test_name,
87 test_result_future, queue_name, 126 test_result_future, flakiness_algorithm_results_dict],
88 flakiness_algorithm_results_dict], 127 expected_kwargs={'manually_triggered': False})
89 expected_kwargs={})
90 128
91 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, 129 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number,
92 step_name, test_name, master_build_number, 130 step_name, test_name, master_build_number,
93 flakiness_algorithm_results_dict= 131 flakiness_algorithm_results_dict=
94 flakiness_algorithm_results_dict, 132 flakiness_algorithm_results_dict)
95 queue_name=queue_name)
96 133
97 rfp.start(queue_name=queue_name) 134 rfp.start(queue_name=queue_name)
98 self.execute_queued_tasks() 135 self.execute_queued_tasks()
99 136
100 def testNextBuildPipelineForNewRecursionFirstFlake(self): 137 def testNextBuildPipelineForNewRecursionFirstFlake(self):
101 master_name = 'm' 138 master_name = 'm'
102 builder_name = 'b' 139 builder_name = 'b'
103 master_build_number = 100 140 master_build_number = 100
104 build_number = 100 141 build_number = 100
105 step_name = 's' 142 step_name = 's'
106 test_name = 't' 143 test_name = 't'
107 test_result_future = 'trf' 144 test_result_future = 'trf'
108 queue_name = constants.DEFAULT_QUEUE
109 flakiness_algorithm_results_dict = { 145 flakiness_algorithm_results_dict = {
110 'flakes_in_a_row': 0, 146 'flakes_in_a_row': 0,
111 'stable_in_a_row': 0, 147 'stable_in_a_row': 0,
112 'stabled_out': False, 148 'stabled_out': False,
113 'flaked_out': False, 149 'flaked_out': False,
114 'last_build_number': 0, 150 'last_build_number': 0,
115 'lower_boundary': None, 151 'lower_boundary': None,
116 'upper_boundary': None, 152 'upper_boundary': None,
117 'lower_boundary_result': None, 153 'lower_boundary_result': None,
118 'sequential_run_index': 0 154 'sequential_run_index': 0
119 155
120 } 156 }
121 self._CreateAndSaveMasterFlakeAnalysis( 157 self._CreateAndSaveMasterFlakeAnalysis(
122 master_name, builder_name, build_number, step_name, 158 master_name, builder_name, build_number, step_name,
123 test_name, status=analysis_status.PENDING 159 test_name, status=analysis_status.PENDING
124 ) 160 )
125 self._CreateAndSaveFlakeSwarmingTask( 161 self._CreateAndSaveFlakeSwarmingTask(
126 master_name, builder_name, build_number, step_name, 162 master_name, builder_name, build_number, step_name,
127 test_name, status=analysis_status.COMPLETED 163 test_name, status=analysis_status.COMPLETED
128 ) 164 )
129 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 165 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
130 build_number, step_name, test_name) 166 build_number, step_name, test_name)
131 analysis.success_rates.append(.08) 167 analysis.success_rates.append(.08)
132 analysis.build_numbers.append(100) 168 analysis.build_numbers.append(100)
133 analysis.put() 169 analysis.put()
134 170
135 NextBuildNumberPipeline.run( 171 NextBuildNumberPipeline.run(
136 NextBuildNumberPipeline(), master_name, builder_name, 172 NextBuildNumberPipeline(), master_name, builder_name,
137 master_build_number, build_number, step_name, test_name, 173 master_build_number, build_number, step_name, test_name,
138 test_result_future, queue_name, flakiness_algorithm_results_dict) 174 test_result_future, flakiness_algorithm_results_dict)
139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) 175 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1)
140 176
141 def testNextBuildPipelineForNewRecursionFirstStable(self): 177 def testNextBuildPipelineForNewRecursionFirstStable(self):
142 master_name = 'm' 178 master_name = 'm'
143 builder_name = 'b' 179 builder_name = 'b'
144 master_build_number = 100 180 master_build_number = 100
145 build_number = 100 181 build_number = 100
146 step_name = 's' 182 step_name = 's'
147 test_name = 't' 183 test_name = 't'
148 test_result_future = 'trf' 184 test_result_future = 'trf'
149 queue_name = constants.DEFAULT_QUEUE
150 flakiness_algorithm_results_dict = { 185 flakiness_algorithm_results_dict = {
151 'flakes_in_a_row': 0, 186 'flakes_in_a_row': 0,
152 'stable_in_a_row': 0, 187 'stable_in_a_row': 0,
153 'stabled_out': False, 188 'stabled_out': False,
154 'flaked_out': False, 189 'flaked_out': False,
155 'last_build_number': 0, 190 'last_build_number': 0,
156 'lower_boundary': None, 191 'lower_boundary': None,
157 'upper_boundary': None, 192 'upper_boundary': None,
158 'lower_boundary_result': None, 193 'lower_boundary_result': None,
159 'sequential_run_index': 0 194 'sequential_run_index': 0
160
161 } 195 }
162 self._CreateAndSaveMasterFlakeAnalysis( 196 self._CreateAndSaveMasterFlakeAnalysis(
163 master_name, builder_name, build_number, step_name, 197 master_name, builder_name, build_number, step_name,
164 test_name, status=analysis_status.PENDING 198 test_name, status=analysis_status.PENDING
165 ) 199 )
166 self._CreateAndSaveFlakeSwarmingTask( 200 self._CreateAndSaveFlakeSwarmingTask(
167 master_name, builder_name, build_number, step_name, 201 master_name, builder_name, build_number, step_name,
168 test_name, status=analysis_status.COMPLETED 202 test_name, status=analysis_status.COMPLETED
169 ) 203 )
170 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 204 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
171 build_number, step_name, test_name) 205 build_number, step_name, test_name)
172 analysis.success_rates.append(0) 206 analysis.success_rates.append(0)
173 analysis.build_numbers.append(100) 207 analysis.build_numbers.append(100)
174 analysis.put() 208 analysis.put()
175 209
176 NextBuildNumberPipeline.run( 210 NextBuildNumberPipeline.run(
177 NextBuildNumberPipeline(), master_name, builder_name, 211 NextBuildNumberPipeline(), master_name, builder_name,
178 master_build_number, build_number, step_name, 212 master_build_number, build_number, step_name,
179 test_name, test_result_future, queue_name, 213 test_name, test_result_future,
180 flakiness_algorithm_results_dict) 214 flakiness_algorithm_results_dict)
181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) 215 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1)
182 216
183 def testNextBuildPipelineForNewRecursionFlakeInARow(self): 217 def testNextBuildPipelineForNewRecursionFlakeInARow(self):
184 master_name = 'm' 218 master_name = 'm'
185 builder_name = 'b' 219 builder_name = 'b'
186 master_build_number = 100 220 master_build_number = 100
187 build_number = 100 221 build_number = 100
188 step_name = 's' 222 step_name = 's'
189 test_name = 't' 223 test_name = 't'
190 test_result_future = 'trf' 224 test_result_future = 'trf'
191 queue_name = constants.DEFAULT_QUEUE
192 flakiness_algorithm_results_dict = { 225 flakiness_algorithm_results_dict = {
193 'flakes_in_a_row': 0, 226 'flakes_in_a_row': 0,
194 'stable_in_a_row': 4, 227 'stable_in_a_row': 4,
195 'stabled_out': False, 228 'stabled_out': False,
196 'flaked_out': False, 229 'flaked_out': False,
197 'last_build_number': 0, 230 'last_build_number': 0,
198 'lower_boundary': None, 231 'lower_boundary': None,
199 'upper_boundary': None, 232 'upper_boundary': None,
200 'lower_boundary_result': None, 233 'lower_boundary_result': None,
201 'sequential_run_index': 0 234 'sequential_run_index': 0
202 235
203 } 236 }
204 self._CreateAndSaveMasterFlakeAnalysis( 237 self._CreateAndSaveMasterFlakeAnalysis(
205 master_name, builder_name, build_number, step_name, 238 master_name, builder_name, build_number, step_name,
206 test_name, status=analysis_status.PENDING 239 test_name, status=analysis_status.PENDING
207 ) 240 )
208 self._CreateAndSaveFlakeSwarmingTask( 241 self._CreateAndSaveFlakeSwarmingTask(
209 master_name, builder_name, build_number, step_name, 242 master_name, builder_name, build_number, step_name,
210 test_name, status=analysis_status.COMPLETED 243 test_name, status=analysis_status.COMPLETED
211 ) 244 )
212 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 245 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
213 build_number, step_name, test_name) 246 build_number, step_name, test_name)
214 analysis.success_rates.append(0) 247 analysis.success_rates.append(0)
215 analysis.build_numbers.append(100) 248 analysis.build_numbers.append(100)
216 analysis.put() 249 analysis.put()
217 250
218 NextBuildNumberPipeline.run( 251 NextBuildNumberPipeline.run(
219 NextBuildNumberPipeline(), master_name, builder_name, 252 NextBuildNumberPipeline(), master_name, builder_name,
220 master_build_number, build_number, step_name, 253 master_build_number, build_number, step_name,
221 test_name, test_result_future, queue_name, 254 test_name, test_result_future,
222 flakiness_algorithm_results_dict) 255 flakiness_algorithm_results_dict)
223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) 256 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True)
224 257
225 def testNextBuildPipelineForNewRecursionStableInARow(self): 258 def testNextBuildPipelineForNewRecursionStableInARow(self):
226 master_name = 'm' 259 master_name = 'm'
227 builder_name = 'b' 260 builder_name = 'b'
228 master_build_number = 100 261 master_build_number = 100
229 build_number = 100 262 build_number = 100
230 step_name = 's' 263 step_name = 's'
231 test_name = 't' 264 test_name = 't'
232 test_result_future = 'trf' 265 test_result_future = 'trf'
233 queue_name = constants.DEFAULT_QUEUE
234 flakiness_algorithm_results_dict = { 266 flakiness_algorithm_results_dict = {
235 'flakes_in_a_row': 4, 267 'flakes_in_a_row': 4,
236 'stable_in_a_row': 0, 268 'stable_in_a_row': 0,
237 'stabled_out': False, 269 'stabled_out': False,
238 'flaked_out': False, 270 'flaked_out': False,
239 'last_build_number': 0, 271 'last_build_number': 0,
240 'lower_boundary': None, 272 'lower_boundary': None,
241 'upper_boundary': None, 273 'upper_boundary': None,
242 'lower_boundary_result': None, 274 'lower_boundary_result': None,
243 'sequential_run_index': 0 275 'sequential_run_index': 0
244 276
245 } 277 }
246 self._CreateAndSaveMasterFlakeAnalysis( 278 self._CreateAndSaveMasterFlakeAnalysis(
247 master_name, builder_name, build_number, step_name, 279 master_name, builder_name, build_number, step_name,
248 test_name, status=analysis_status.PENDING 280 test_name, status=analysis_status.PENDING
249 ) 281 )
250 self._CreateAndSaveFlakeSwarmingTask( 282 self._CreateAndSaveFlakeSwarmingTask(
251 master_name, builder_name, build_number, step_name, 283 master_name, builder_name, build_number, step_name,
252 test_name, status=analysis_status.COMPLETED 284 test_name, status=analysis_status.COMPLETED
253 ) 285 )
254 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 286 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
255 build_number, step_name, test_name) 287 build_number, step_name, test_name)
256 analysis.success_rates.append(.50) 288 analysis.success_rates.append(.50)
257 analysis.build_numbers.append(100) 289 analysis.build_numbers.append(100)
258 analysis.put() 290 analysis.put()
259 291
260 NextBuildNumberPipeline.run( 292 NextBuildNumberPipeline.run(
261 NextBuildNumberPipeline(), master_name, builder_name, 293 NextBuildNumberPipeline(), master_name, builder_name,
262 master_build_number, build_number, step_name, 294 master_build_number, build_number, step_name,
263 test_name, test_result_future, queue_name, 295 test_name, test_result_future,
264 flakiness_algorithm_results_dict) 296 flakiness_algorithm_results_dict)
265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) 297 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True)
266 298
267 299
268 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): 300 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self):
269 master_name = 'm' 301 master_name = 'm'
270 builder_name = 'b' 302 builder_name = 'b'
271 master_build_number = 100 303 master_build_number = 100
272 build_number = 100 304 build_number = 100
273 step_name = 's' 305 step_name = 's'
274 test_name = 't' 306 test_name = 't'
275 test_result_future = 'trf' 307 test_result_future = 'trf'
276 queue_name = constants.DEFAULT_QUEUE
277 flakiness_algorithm_results_dict = { 308 flakiness_algorithm_results_dict = {
278 'flakes_in_a_row': 0, 309 'flakes_in_a_row': 0,
279 'stable_in_a_row': 0, 310 'stable_in_a_row': 0,
280 'stabled_out': False, 311 'stabled_out': False,
281 'flaked_out': False, 312 'flaked_out': False,
282 'last_build_number': 200, 313 'last_build_number': 200,
283 'lower_boundary': None, 314 'lower_boundary': None,
284 'upper_boundary': None, 315 'upper_boundary': None,
285 'lower_boundary_result': None, 316 'lower_boundary_result': None,
286 'sequential_run_index': 0 317 'sequential_run_index': 0
287 } 318 }
288 self._CreateAndSaveMasterFlakeAnalysis( 319 self._CreateAndSaveMasterFlakeAnalysis(
289 master_name, builder_name, build_number, step_name, 320 master_name, builder_name, build_number, step_name,
290 test_name, status=analysis_status.PENDING 321 test_name, status=analysis_status.PENDING
291 ) 322 )
292 self._CreateAndSaveFlakeSwarmingTask( 323 self._CreateAndSaveFlakeSwarmingTask(
293 master_name, builder_name, build_number, step_name, 324 master_name, builder_name, build_number, step_name,
294 test_name, status=analysis_status.COMPLETED 325 test_name, status=analysis_status.COMPLETED
295 ) 326 )
296 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 327 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
297 build_number, step_name, test_name) 328 build_number, step_name, test_name)
298 analysis.success_rates.append(.50) 329 analysis.success_rates.append(.50)
299 analysis.build_numbers.append(100) 330 analysis.build_numbers.append(100)
300 analysis.put() 331 analysis.put()
301 332
302 queue_name = {'x': False} 333 queue_name = {'x': False}
303 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 334 def my_mocked_run(*_, **__):
304 queue_name['x'] = True # pragma: no cover 335 queue_name['x'] = True # pragma: no cover
305 336
306 self.mock( 337 self.mock(
307 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 338 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
308 NextBuildNumberPipeline.run( 339 NextBuildNumberPipeline.run(
309 NextBuildNumberPipeline(), master_name, builder_name, 340 NextBuildNumberPipeline(), master_name, builder_name,
310 master_build_number, build_number, step_name, test_name, 341 master_build_number, build_number, step_name, test_name,
311 test_result_future, queue_name, flakiness_algorithm_results_dict) 342 test_result_future, flakiness_algorithm_results_dict)
312 self.assertFalse(queue_name['x']) 343 self.assertFalse(queue_name['x'])
313 344
314 def testNextBuildPipelineForFailedSwarmingTask(self): 345 def testNextBuildPipelineForFailedSwarmingTask(self):
315 master_name = 'm' 346 master_name = 'm'
316 builder_name = 'b' 347 builder_name = 'b'
317 master_build_number = 100 348 master_build_number = 100
318 build_number = 100 349 build_number = 100
319 step_name = 's' 350 step_name = 's'
320 test_name = 't' 351 test_name = 't'
321 test_result_future = 'trf' 352 test_result_future = 'trf'
322 queue_name = constants.DEFAULT_QUEUE
323 flakiness_algorithm_results_dict = { 353 flakiness_algorithm_results_dict = {
324 'flakes_in_a_row': 0, 354 'flakes_in_a_row': 0,
325 'stable_in_a_row': 0, 355 'stable_in_a_row': 0,
326 'stabled_out': False, 356 'stabled_out': False,
327 'flaked_out': False, 357 'flaked_out': False,
328 'last_build_number': 0, 358 'last_build_number': 0,
329 'lower_boundary': None, 359 'lower_boundary': None,
330 'upper_boundary': None, 360 'upper_boundary': None,
331 'lower_boundary_result': None, 361 'lower_boundary_result': None,
332 'sequential_run_index': 0 362 'sequential_run_index': 0
333 363
334 } 364 }
335 self._CreateAndSaveMasterFlakeAnalysis( 365 self._CreateAndSaveMasterFlakeAnalysis(
336 master_name, builder_name, build_number, step_name, 366 master_name, builder_name, build_number, step_name,
337 test_name, status=analysis_status.PENDING 367 test_name, status=analysis_status.PENDING
338 ) 368 )
339 self._CreateAndSaveFlakeSwarmingTask( 369 self._CreateAndSaveFlakeSwarmingTask(
340 master_name, builder_name, build_number, step_name, 370 master_name, builder_name, build_number, step_name,
341 test_name, status=analysis_status.ERROR 371 test_name, status=analysis_status.ERROR
342 ) 372 )
343 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 373 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
344 build_number, step_name, test_name) 374 build_number, step_name, test_name)
345 analysis.success_rates.append(.50) 375 analysis.success_rates.append(.50)
346 analysis.build_numbers.append(100) 376 analysis.build_numbers.append(100)
347 analysis.put() 377 analysis.put()
348 378
349 queue_name = {'x': False} 379 queue_name = {'x': False}
350 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 380 def my_mocked_run(*_, **__):
351 queue_name['x'] = True # pragma: no cover 381 queue_name['x'] = True # pragma: no cover
352 382
353 self.mock( 383 self.mock(
354 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 384 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
355 NextBuildNumberPipeline.run( 385 NextBuildNumberPipeline.run(
356 NextBuildNumberPipeline(), master_name, builder_name, 386 NextBuildNumberPipeline(), master_name, builder_name,
357 master_build_number, build_number, step_name, test_name, 387 master_build_number, build_number, step_name, test_name,
358 test_result_future, queue_name, flakiness_algorithm_results_dict) 388 test_result_future, flakiness_algorithm_results_dict)
359 self.assertFalse(queue_name['x']) 389 self.assertFalse(queue_name['x'])
360 390
361 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): 391 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self):
362 master_name = 'm' 392 master_name = 'm'
363 builder_name = 'b' 393 builder_name = 'b'
364 master_build_number = 100 394 master_build_number = 100
365 build_number = 100 395 build_number = 100
366 step_name = 's' 396 step_name = 's'
367 test_name = 't' 397 test_name = 't'
368 test_result_future = 'trf' 398 test_result_future = 'trf'
(...skipping 17 matching lines...) Expand all
386 master_name, builder_name, build_number, step_name, 416 master_name, builder_name, build_number, step_name,
387 test_name, status=analysis_status.COMPLETED 417 test_name, status=analysis_status.COMPLETED
388 ) 418 )
389 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 419 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
390 build_number, step_name, test_name) 420 build_number, step_name, test_name)
391 analysis.success_rates.append(.50) 421 analysis.success_rates.append(.50)
392 analysis.build_numbers.append(100) 422 analysis.build_numbers.append(100)
393 analysis.put() 423 analysis.put()
394 424
395 queue_name = {'x': False} 425 queue_name = {'x': False}
396 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 426 def my_mocked_run(*_, **__):
397 queue_name['x'] = True # pragma: no cover 427 queue_name['x'] = True # pragma: no cover
398 428
399 self.mock( 429 self.mock(
400 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 430 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
401 NextBuildNumberPipeline.run( 431 NextBuildNumberPipeline.run(
402 NextBuildNumberPipeline(), master_name, builder_name, 432 NextBuildNumberPipeline(), master_name, builder_name,
403 master_build_number, build_number, step_name, test_name, 433 master_build_number, build_number, step_name, test_name,
404 test_result_future, queue_name, flakiness_algorithm_results_dict) 434 test_result_future, flakiness_algorithm_results_dict)
405 self.assertTrue(queue_name['x']) 435 self.assertTrue(queue_name['x'])
406 436
407 def testGetNextRunSetStableLowerBoundary(self): 437 def testGetNextRunSetStableLowerBoundary(self):
408 master_name = 'm' 438 master_name = 'm'
409 builder_name = 'b' 439 builder_name = 'b'
410 build_number = 100 440 build_number = 100
411 step_name = 's' 441 step_name = 's'
412 test_name = 't' 442 test_name = 't'
413 self._CreateAndSaveMasterFlakeAnalysis( 443 self._CreateAndSaveMasterFlakeAnalysis(
414 master_name, builder_name, build_number, step_name, 444 master_name, builder_name, build_number, step_name,
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 self.assertEqual(analysis.suspected_flake_build_number, None) 625 self.assertEqual(analysis.suspected_flake_build_number, None)
596 626
597 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self): 627 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self):
598 master_name = 'm' 628 master_name = 'm'
599 builder_name = 'b' 629 builder_name = 'b'
600 master_build_number = 100 630 master_build_number = 100
601 build_number = 100 631 build_number = 100
602 step_name = 's' 632 step_name = 's'
603 test_name = 't' 633 test_name = 't'
604 test_result_future = 'trf' 634 test_result_future = 'trf'
605 queue_name = constants.DEFAULT_QUEUE
606 flakiness_algorithm_results_dict = { 635 flakiness_algorithm_results_dict = {
607 'flakes_in_a_row': 0, 636 'flakes_in_a_row': 0,
608 'stable_in_a_row': 0, 637 'stable_in_a_row': 0,
609 'stabled_out': True, 638 'stabled_out': True,
610 'flaked_out': True, 639 'flaked_out': True,
611 'last_build_number': 0, 640 'last_build_number': 0,
612 'lower_boundary': 100, 641 'lower_boundary': 100,
613 'upper_boundary': 110, 642 'upper_boundary': 110,
614 'lower_boundary_result': None, 643 'lower_boundary_result': None,
615 'sequential_run_index': 0 644 'sequential_run_index': 0
616 645
617 } 646 }
618 self._CreateAndSaveMasterFlakeAnalysis( 647 self._CreateAndSaveMasterFlakeAnalysis(
619 master_name, builder_name, build_number, step_name, 648 master_name, builder_name, build_number, step_name,
620 test_name, status=analysis_status.PENDING 649 test_name, status=analysis_status.PENDING
621 ) 650 )
622 self._CreateAndSaveFlakeSwarmingTask( 651 self._CreateAndSaveFlakeSwarmingTask(
623 master_name, builder_name, build_number, step_name, 652 master_name, builder_name, build_number, step_name,
624 test_name, status=analysis_status.COMPLETED 653 test_name, status=analysis_status.COMPLETED
625 ) 654 )
626 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 655 analysis = MasterFlakeAnalysis.Get(master_name, builder_name,
627 build_number, step_name, test_name) 656 build_number, step_name, test_name)
628 analysis.success_rates.append(1) 657 analysis.success_rates.append(1)
629 analysis.build_numbers.append(50) 658 analysis.build_numbers.append(50)
630 analysis.put() 659 analysis.put()
631 660
632 NextBuildNumberPipeline.run( 661 NextBuildNumberPipeline.run(
633 NextBuildNumberPipeline(), master_name, builder_name, 662 NextBuildNumberPipeline(), master_name, builder_name,
634 master_build_number, build_number, step_name, test_name, 663 master_build_number, build_number, step_name, test_name,
635 test_result_future, queue_name, flakiness_algorithm_results_dict) 664 test_result_future, flakiness_algorithm_results_dict)
636 self.assertEquals( 665 self.assertEquals(
637 flakiness_algorithm_results_dict['sequential_run_index'], 1) 666 flakiness_algorithm_results_dict['sequential_run_index'], 1)
638 667
639 def testNextBuildWhenTestNotExistingAfterStableInARow(self): 668 def testNextBuildWhenTestNotExistingAfterStableInARow(self):
640 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') 669 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't')
641 master.success_rates = [0.8, 1.0, 1.0, -1] 670 master.success_rates = [0.8, 1.0, 1.0, -1]
642 master.build_numbers = [100, 80, 70, 60] 671 master.build_numbers = [100, 80, 70, 60]
643 flakiness_algorithm_results_dict = { 672 flakiness_algorithm_results_dict = {
644 'flakes_in_a_row': 0, 673 'flakes_in_a_row': 0,
645 'stable_in_a_row': 2, 674 'stable_in_a_row': 2,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 flakiness_algorithm_results_dict['lower_boundary_result']) 714 flakiness_algorithm_results_dict['lower_boundary_result'])
686 715
687 def testNextBuildNumberIsLargerThanStartingBuildNumber(self): 716 def testNextBuildNumberIsLargerThanStartingBuildNumber(self):
688 master_name = 'm' 717 master_name = 'm'
689 builder_name = 'b' 718 builder_name = 'b'
690 master_build_number = 100 719 master_build_number = 100
691 build_number = 60 720 build_number = 60
692 step_name = 's' 721 step_name = 's'
693 test_name = 't' 722 test_name = 't'
694 test_result_future = 'trf' 723 test_result_future = 'trf'
695 queue_name = constants.DEFAULT_QUEUE
696 flakiness_algorithm_results_dict = { 724 flakiness_algorithm_results_dict = {
697 'flakes_in_a_row': 0, 725 'flakes_in_a_row': 0,
698 'stable_in_a_row': 3, 726 'stable_in_a_row': 3,
699 'stabled_out': False, 727 'stabled_out': False,
700 'flaked_out': False, 728 'flaked_out': False,
701 'last_build_number': 0, 729 'last_build_number': 0,
702 'lower_boundary': None, 730 'lower_boundary': None,
703 'upper_boundary': None, 731 'upper_boundary': None,
704 'lower_boundary_result': None, 732 'lower_boundary_result': None,
705 'sequential_run_index': 0 733 'sequential_run_index': 0
(...skipping 10 matching lines...) Expand all
716 master_name, builder_name, 744 master_name, builder_name,
717 master_build_number, step_name, test_name) 745 master_build_number, step_name, test_name)
718 analysis.success_rates = [1.0, 1.0, 1.0, -1] 746 analysis.success_rates = [1.0, 1.0, 1.0, -1]
719 analysis.build_numbers = [100, 80, 70, 60] 747 analysis.build_numbers = [100, 80, 70, 60]
720 analysis.put() 748 analysis.put()
721 749
722 pipeline = NextBuildNumberPipeline() 750 pipeline = NextBuildNumberPipeline()
723 pipeline.run( 751 pipeline.run(
724 master_name, builder_name, 752 master_name, builder_name,
725 master_build_number, build_number, step_name, test_name, 753 master_build_number, build_number, step_name, test_name,
726 test_result_future, queue_name, flakiness_algorithm_results_dict) 754 test_result_future, flakiness_algorithm_results_dict)
727 755
728 analysis = MasterFlakeAnalysis.Get( 756 analysis = MasterFlakeAnalysis.Get(
729 master_name, builder_name, 757 master_name, builder_name,
730 master_build_number, step_name, test_name) 758 master_build_number, step_name, test_name)
731 self.assertEqual(analysis_status.COMPLETED, analysis.status) 759 self.assertEqual(analysis_status.COMPLETED, analysis.status)
732 760
733 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): 761 def testNextBuildNumberIsSmallerThanLastBuildNumber(self):
734 master_name = 'm' 762 master_name = 'm'
735 builder_name = 'b' 763 builder_name = 'b'
736 master_build_number = 100 764 master_build_number = 100
737 build_number = 60 765 build_number = 60
738 step_name = 's' 766 step_name = 's'
739 test_name = 't' 767 test_name = 't'
740 test_result_future = 'trf' 768 test_result_future = 'trf'
741 queue_name = constants.DEFAULT_QUEUE
742 flakiness_algorithm_results_dict = { 769 flakiness_algorithm_results_dict = {
743 'flakes_in_a_row': 0, 770 'flakes_in_a_row': 0,
744 'stable_in_a_row': 3, 771 'stable_in_a_row': 3,
745 'stabled_out': False, 772 'stabled_out': False,
746 'flaked_out': False, 773 'flaked_out': False,
747 'last_build_number': 59, 774 'last_build_number': 59,
748 'lower_boundary': None, 775 'lower_boundary': None,
749 'upper_boundary': None, 776 'upper_boundary': None,
750 'lower_boundary_result': None, 777 'lower_boundary_result': None,
751 'sequential_run_index': 0 778 'sequential_run_index': 0
(...skipping 10 matching lines...) Expand all
762 master_name, builder_name, 789 master_name, builder_name,
763 master_build_number, step_name, test_name) 790 master_build_number, step_name, test_name)
764 analysis.success_rates = [1.0, 1.0, 1.0, 1.0] 791 analysis.success_rates = [1.0, 1.0, 1.0, 1.0]
765 analysis.build_numbers = [100, 80, 70, 60] 792 analysis.build_numbers = [100, 80, 70, 60]
766 analysis.put() 793 analysis.put()
767 794
768 pipeline = NextBuildNumberPipeline() 795 pipeline = NextBuildNumberPipeline()
769 pipeline.run( 796 pipeline.run(
770 master_name, builder_name, 797 master_name, builder_name,
771 master_build_number, build_number, step_name, test_name, 798 master_build_number, build_number, step_name, test_name,
772 test_result_future, queue_name, flakiness_algorithm_results_dict) 799 test_result_future, flakiness_algorithm_results_dict)
773 800
774 analysis = MasterFlakeAnalysis.Get( 801 analysis = MasterFlakeAnalysis.Get(
775 master_name, builder_name, 802 master_name, builder_name,
776 master_build_number, step_name, test_name) 803 master_build_number, step_name, test_name)
777 self.assertEqual(analysis_status.COMPLETED, analysis.status) 804 self.assertEqual(analysis_status.COMPLETED, analysis.status)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698