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

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

Issue 2369333002: [Findit] Capture versionized metadata for master_flake_analysis (Closed)
Patch Set: Fixing passing version through pipelines 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 common import constants 5 from common import constants
6 from common.pipeline_wrapper import pipeline_handlers 6 from common.pipeline_wrapper import pipeline_handlers
7 from model import analysis_status 7 from model import analysis_status
8 from model.flake.flake_swarming_task import FlakeSwarmingTask
8 from model.flake.master_flake_analysis import MasterFlakeAnalysis 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis
9 from model.flake.flake_swarming_task import FlakeSwarmingTask
10 from waterfall.flake import recursive_flake_pipeline 10 from waterfall.flake import recursive_flake_pipeline
11 from waterfall.flake.recursive_flake_pipeline import get_next_run 11 from waterfall.flake.recursive_flake_pipeline import get_next_run
12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline 12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline
13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline 13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline
14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run 14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run
15 from waterfall.test import wf_testcase 15 from waterfall.test import wf_testcase
16 16
17 17
18 class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase): 18 class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase):
19 app_module = pipeline_handlers._APP 19 app_module = pipeline_handlers._APP
20 20
21 def _CreateAndSaveMasterFlakeAnalysis( 21 def _CreateAndSaveMasterFlakeAnalysis(
22 self, master_name, builder_name, build_number, 22 self, master_name, builder_name, build_number, step_name,
23 step_name, test_name, status): 23 test_name, status):
24 analysis = MasterFlakeAnalysis.Create( 24 analysis = MasterFlakeAnalysis.Create(
25 master_name, builder_name, build_number, step_name, test_name) 25 master_name, builder_name, build_number, step_name, test_name)
26 analysis.status = status 26 analysis.status = status
27 analysis.put() 27 analysis.Save()
28 28
29 def _CreateAndSaveFlakeSwarmingTask( 29 def _CreateAndSaveFlakeSwarmingTask(
30 self, master_name, builder_name, build_number, 30 self, master_name, builder_name, build_number,
31 step_name, test_name, status): 31 step_name, test_name, status):
32 flake_swarming_task = FlakeSwarmingTask.Create( 32 flake_swarming_task = FlakeSwarmingTask.Create(
33 master_name, builder_name, build_number, step_name, test_name) 33 master_name, builder_name, build_number, step_name, test_name)
34 flake_swarming_task.status = status 34 flake_swarming_task.status = status
35 flake_swarming_task.put() 35 flake_swarming_task.put()
36 36
37 def testRecursiveFlakePipeline(self): 37 def testRecursiveFlakePipeline(self):
(...skipping 14 matching lines...) Expand all
52 'stabled_out': False, 52 'stabled_out': False,
53 'flaked_out': False, 53 'flaked_out': False,
54 'last_build_number': 0, 54 'last_build_number': 0,
55 'lower_boundary': None, 55 'lower_boundary': None,
56 'upper_boundary': None, 56 'upper_boundary': None,
57 'lower_boundary_result': None, 57 'lower_boundary_result': None,
58 'sequential_run_index': 0 58 'sequential_run_index': 0
59 59
60 } 60 }
61 61
62 self._CreateAndSaveMasterFlakeAnalysis( 62 analysis = MasterFlakeAnalysis.Create(
63 master_name, builder_name, master_build_number, step_name, 63 master_name, builder_name, master_build_number, step_name, test_name)
64 test_name, status=analysis_status.PENDING 64 analysis.status = analysis_status.PENDING
65 ) 65 analysis.Save()
66 66
67 self.MockPipeline( 67 self.MockPipeline(
68 recursive_flake_pipeline.TriggerFlakeSwarmingTaskPipeline, 68 recursive_flake_pipeline.TriggerFlakeSwarmingTaskPipeline,
69 'task_id', 69 'task_id',
70 expected_args=[master_name, builder_name, 70 expected_args=[master_name, builder_name,
71 run_build_number, step_name, [test_name]], 71 run_build_number, step_name, [test_name]],
72 expected_kwargs={}) 72 expected_kwargs={})
73 73
74 self.MockPipeline( 74 self.MockPipeline(
75 recursive_flake_pipeline.ProcessFlakeSwarmingTaskResultPipeline, 75 recursive_flake_pipeline.ProcessFlakeSwarmingTaskResultPipeline,
76 'test_result_future', 76 'test_result_future',
77 expected_args=[master_name, builder_name, 77 expected_args=[master_name, builder_name,
78 run_build_number, step_name, task_id, 78 run_build_number, step_name, task_id,
79 master_build_number, test_name], 79 master_build_number, test_name,
80 analysis.version_number],
80 expected_kwargs={}) 81 expected_kwargs={})
81 82
82 self.MockPipeline( 83 self.MockPipeline(
83 recursive_flake_pipeline.NextBuildNumberPipeline, 84 recursive_flake_pipeline.NextBuildNumberPipeline,
84 '', 85 '',
85 expected_args=[master_name, builder_name, master_build_number, 86 expected_args=[master_name, builder_name, master_build_number,
86 build_number, step_name, test_name, 87 build_number, step_name, test_name,
88 analysis.version_number,
87 test_result_future, queue_name, 89 test_result_future, queue_name,
88 flakiness_algorithm_results_dict], 90 flakiness_algorithm_results_dict],
89 expected_kwargs={}) 91 expected_kwargs={})
90 92
91 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, 93 rfp = RecursiveFlakePipeline(
92 step_name, test_name, master_build_number, 94 master_name, builder_name, build_number, step_name, test_name,
93 flakiness_algorithm_results_dict= 95 analysis.version_number, master_build_number,
94 flakiness_algorithm_results_dict, 96 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict,
95 queue_name=queue_name) 97 queue_name=queue_name)
96 98
97 rfp.start(queue_name=queue_name) 99 rfp.start(queue_name=queue_name)
98 self.execute_queued_tasks() 100 self.execute_queued_tasks()
99 101
100 def testNextBuildPipelineForNewRecursionFirstFlake(self): 102 def testNextBuildPipelineForNewRecursionFirstFlake(self):
101 master_name = 'm' 103 master_name = 'm'
102 builder_name = 'b' 104 builder_name = 'b'
103 master_build_number = 100 105 master_build_number = 100
104 build_number = 100 106 build_number = 100
105 step_name = 's' 107 step_name = 's'
(...skipping 13 matching lines...) Expand all
119 121
120 } 122 }
121 self._CreateAndSaveMasterFlakeAnalysis( 123 self._CreateAndSaveMasterFlakeAnalysis(
122 master_name, builder_name, build_number, step_name, 124 master_name, builder_name, build_number, step_name,
123 test_name, status=analysis_status.PENDING 125 test_name, status=analysis_status.PENDING
124 ) 126 )
125 self._CreateAndSaveFlakeSwarmingTask( 127 self._CreateAndSaveFlakeSwarmingTask(
126 master_name, builder_name, build_number, step_name, 128 master_name, builder_name, build_number, step_name,
127 test_name, status=analysis_status.COMPLETED 129 test_name, status=analysis_status.COMPLETED
128 ) 130 )
129 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 131 analysis = MasterFlakeAnalysis.GetVersion(
130 build_number, step_name, test_name) 132 master_name, builder_name, build_number, step_name, test_name)
131 analysis.success_rates.append(.08) 133 analysis.pass_rates.append(.08)
132 analysis.build_numbers.append(100) 134 analysis.build_numbers.append(100)
133 analysis.put() 135 analysis.put()
134 136
135 NextBuildNumberPipeline.run( 137 NextBuildNumberPipeline.run(
136 NextBuildNumberPipeline(), master_name, builder_name, 138 NextBuildNumberPipeline(), master_name, builder_name,
137 master_build_number, build_number, step_name, test_name, 139 master_build_number, build_number, step_name, test_name,
138 test_result_future, queue_name, flakiness_algorithm_results_dict) 140 analysis.version_number, test_result_future, queue_name,
141 flakiness_algorithm_results_dict)
139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) 142 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1)
140 143
141 def testNextBuildPipelineForNewRecursionFirstStable(self): 144 def testNextBuildPipelineForNewRecursionFirstStable(self):
142 master_name = 'm' 145 master_name = 'm'
143 builder_name = 'b' 146 builder_name = 'b'
144 master_build_number = 100 147 master_build_number = 100
145 build_number = 100 148 build_number = 100
146 step_name = 's' 149 step_name = 's'
147 test_name = 't' 150 test_name = 't'
148 test_result_future = 'trf' 151 test_result_future = 'trf'
(...skipping 11 matching lines...) Expand all
160 163
161 } 164 }
162 self._CreateAndSaveMasterFlakeAnalysis( 165 self._CreateAndSaveMasterFlakeAnalysis(
163 master_name, builder_name, build_number, step_name, 166 master_name, builder_name, build_number, step_name,
164 test_name, status=analysis_status.PENDING 167 test_name, status=analysis_status.PENDING
165 ) 168 )
166 self._CreateAndSaveFlakeSwarmingTask( 169 self._CreateAndSaveFlakeSwarmingTask(
167 master_name, builder_name, build_number, step_name, 170 master_name, builder_name, build_number, step_name,
168 test_name, status=analysis_status.COMPLETED 171 test_name, status=analysis_status.COMPLETED
169 ) 172 )
170 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 173 analysis = MasterFlakeAnalysis.GetVersion(
171 build_number, step_name, test_name) 174 master_name, builder_name, build_number, step_name, test_name)
172 analysis.success_rates.append(0) 175 analysis.pass_rates.append(0)
173 analysis.build_numbers.append(100) 176 analysis.build_numbers.append(100)
174 analysis.put() 177 analysis.put()
175 178
176 NextBuildNumberPipeline.run( 179 NextBuildNumberPipeline.run(
177 NextBuildNumberPipeline(), master_name, builder_name, 180 NextBuildNumberPipeline(), master_name, builder_name,
178 master_build_number, build_number, step_name, 181 master_build_number, build_number, step_name,
179 test_name, test_result_future, queue_name, 182 test_name, analysis.version_number, test_result_future, queue_name,
180 flakiness_algorithm_results_dict) 183 flakiness_algorithm_results_dict)
181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) 184 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1)
182 185
183 def testNextBuildPipelineForNewRecursionFlakeInARow(self): 186 def testNextBuildPipelineForNewRecursionFlakeInARow(self):
184 master_name = 'm' 187 master_name = 'm'
185 builder_name = 'b' 188 builder_name = 'b'
186 master_build_number = 100 189 master_build_number = 100
187 build_number = 100 190 build_number = 100
188 step_name = 's' 191 step_name = 's'
189 test_name = 't' 192 test_name = 't'
(...skipping 12 matching lines...) Expand all
202 205
203 } 206 }
204 self._CreateAndSaveMasterFlakeAnalysis( 207 self._CreateAndSaveMasterFlakeAnalysis(
205 master_name, builder_name, build_number, step_name, 208 master_name, builder_name, build_number, step_name,
206 test_name, status=analysis_status.PENDING 209 test_name, status=analysis_status.PENDING
207 ) 210 )
208 self._CreateAndSaveFlakeSwarmingTask( 211 self._CreateAndSaveFlakeSwarmingTask(
209 master_name, builder_name, build_number, step_name, 212 master_name, builder_name, build_number, step_name,
210 test_name, status=analysis_status.COMPLETED 213 test_name, status=analysis_status.COMPLETED
211 ) 214 )
212 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 215 analysis = MasterFlakeAnalysis.GetVersion(
213 build_number, step_name, test_name) 216 master_name, builder_name, build_number, step_name, test_name)
214 analysis.success_rates.append(0) 217 analysis.pass_rates.append(0)
215 analysis.build_numbers.append(100) 218 analysis.build_numbers.append(100)
216 analysis.put() 219 analysis.put()
217 220
218 NextBuildNumberPipeline.run( 221 NextBuildNumberPipeline.run(
219 NextBuildNumberPipeline(), master_name, builder_name, 222 NextBuildNumberPipeline(), master_name, builder_name,
220 master_build_number, build_number, step_name, 223 master_build_number, build_number, step_name,
221 test_name, test_result_future, queue_name, 224 test_name, analysis.version_number, test_result_future, queue_name,
222 flakiness_algorithm_results_dict) 225 flakiness_algorithm_results_dict)
223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) 226 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True)
224 227
225 def testNextBuildPipelineForNewRecursionStableInARow(self): 228 def testNextBuildPipelineForNewRecursionStableInARow(self):
226 master_name = 'm' 229 master_name = 'm'
227 builder_name = 'b' 230 builder_name = 'b'
228 master_build_number = 100 231 master_build_number = 100
229 build_number = 100 232 build_number = 100
230 step_name = 's' 233 step_name = 's'
231 test_name = 't' 234 test_name = 't'
(...skipping 12 matching lines...) Expand all
244 247
245 } 248 }
246 self._CreateAndSaveMasterFlakeAnalysis( 249 self._CreateAndSaveMasterFlakeAnalysis(
247 master_name, builder_name, build_number, step_name, 250 master_name, builder_name, build_number, step_name,
248 test_name, status=analysis_status.PENDING 251 test_name, status=analysis_status.PENDING
249 ) 252 )
250 self._CreateAndSaveFlakeSwarmingTask( 253 self._CreateAndSaveFlakeSwarmingTask(
251 master_name, builder_name, build_number, step_name, 254 master_name, builder_name, build_number, step_name,
252 test_name, status=analysis_status.COMPLETED 255 test_name, status=analysis_status.COMPLETED
253 ) 256 )
254 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 257 analysis = MasterFlakeAnalysis.GetVersion(
255 build_number, step_name, test_name) 258 master_name, builder_name, build_number, step_name, test_name)
256 analysis.success_rates.append(.50) 259 analysis.pass_rates.append(.50)
257 analysis.build_numbers.append(100) 260 analysis.build_numbers.append(100)
258 analysis.put() 261 analysis.put()
259 262
260 NextBuildNumberPipeline.run( 263 NextBuildNumberPipeline.run(
261 NextBuildNumberPipeline(), master_name, builder_name, 264 NextBuildNumberPipeline(), master_name, builder_name,
262 master_build_number, build_number, step_name, 265 master_build_number, build_number, step_name,
263 test_name, test_result_future, queue_name, 266 test_name, analysis.version_number, test_result_future, queue_name,
264 flakiness_algorithm_results_dict) 267 flakiness_algorithm_results_dict)
265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) 268 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True)
266 269
267
268 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): 270 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self):
269 master_name = 'm' 271 master_name = 'm'
270 builder_name = 'b' 272 builder_name = 'b'
271 master_build_number = 100 273 master_build_number = 100
272 build_number = 100 274 build_number = 100
273 step_name = 's' 275 step_name = 's'
274 test_name = 't' 276 test_name = 't'
275 test_result_future = 'trf' 277 test_result_future = 'trf'
276 queue_name = constants.DEFAULT_QUEUE 278 queue_name = constants.DEFAULT_QUEUE
277 flakiness_algorithm_results_dict = { 279 flakiness_algorithm_results_dict = {
278 'flakes_in_a_row': 0, 280 'flakes_in_a_row': 0,
279 'stable_in_a_row': 0, 281 'stable_in_a_row': 0,
280 'stabled_out': False, 282 'stabled_out': False,
281 'flaked_out': False, 283 'flaked_out': False,
282 'last_build_number': 200, 284 'last_build_number': 200,
283 'lower_boundary': None, 285 'lower_boundary': None,
284 'upper_boundary': None, 286 'upper_boundary': None,
285 'lower_boundary_result': None, 287 'lower_boundary_result': None,
286 'sequential_run_index': 0 288 'sequential_run_index': 0
287 } 289 }
288 self._CreateAndSaveMasterFlakeAnalysis( 290 self._CreateAndSaveMasterFlakeAnalysis(
289 master_name, builder_name, build_number, step_name, 291 master_name, builder_name, build_number, step_name,
290 test_name, status=analysis_status.PENDING 292 test_name, status=analysis_status.PENDING
291 ) 293 )
292 self._CreateAndSaveFlakeSwarmingTask( 294 self._CreateAndSaveFlakeSwarmingTask(
293 master_name, builder_name, build_number, step_name, 295 master_name, builder_name, build_number, step_name,
294 test_name, status=analysis_status.COMPLETED 296 test_name, status=analysis_status.COMPLETED
295 ) 297 )
296 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 298 analysis = MasterFlakeAnalysis.GetVersion(
297 build_number, step_name, test_name) 299 master_name, builder_name, build_number, step_name, test_name)
298 analysis.success_rates.append(.50) 300 analysis.pass_rates.append(.50)
299 analysis.build_numbers.append(100) 301 analysis.build_numbers.append(100)
300 analysis.put() 302 analysis.put()
301 303
302 queue_name = {'x': False} 304 queue_name = {'x': False}
303 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 305 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument
304 queue_name['x'] = True # pragma: no cover 306 queue_name['x'] = True # pragma: no cover
305 307
306 self.mock( 308 self.mock(
307 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 309 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
308 NextBuildNumberPipeline.run( 310 NextBuildNumberPipeline.run(
309 NextBuildNumberPipeline(), master_name, builder_name, 311 NextBuildNumberPipeline(), master_name, builder_name,
310 master_build_number, build_number, step_name, test_name, 312 master_build_number, build_number, step_name, test_name,
311 test_result_future, queue_name, flakiness_algorithm_results_dict) 313 analysis.version_number, test_result_future, queue_name,
314 flakiness_algorithm_results_dict)
312 self.assertFalse(queue_name['x']) 315 self.assertFalse(queue_name['x'])
313 316
314 def testNextBuildPipelineForFailedSwarmingTask(self): 317 def testNextBuildPipelineForFailedSwarmingTask(self):
315 master_name = 'm' 318 master_name = 'm'
316 builder_name = 'b' 319 builder_name = 'b'
317 master_build_number = 100 320 master_build_number = 100
318 build_number = 100 321 build_number = 100
319 step_name = 's' 322 step_name = 's'
320 test_name = 't' 323 test_name = 't'
321 test_result_future = 'trf' 324 test_result_future = 'trf'
(...skipping 11 matching lines...) Expand all
333 336
334 } 337 }
335 self._CreateAndSaveMasterFlakeAnalysis( 338 self._CreateAndSaveMasterFlakeAnalysis(
336 master_name, builder_name, build_number, step_name, 339 master_name, builder_name, build_number, step_name,
337 test_name, status=analysis_status.PENDING 340 test_name, status=analysis_status.PENDING
338 ) 341 )
339 self._CreateAndSaveFlakeSwarmingTask( 342 self._CreateAndSaveFlakeSwarmingTask(
340 master_name, builder_name, build_number, step_name, 343 master_name, builder_name, build_number, step_name,
341 test_name, status=analysis_status.ERROR 344 test_name, status=analysis_status.ERROR
342 ) 345 )
343 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 346 analysis = MasterFlakeAnalysis.GetVersion(
344 build_number, step_name, test_name) 347 master_name, builder_name, build_number, step_name, test_name)
345 analysis.success_rates.append(.50) 348 analysis.pass_rates.append(.50)
346 analysis.build_numbers.append(100) 349 analysis.build_numbers.append(100)
347 analysis.put() 350 analysis.put()
348 351
349 queue_name = {'x': False} 352 queue_name = {'x': False}
350 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 353 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument
351 queue_name['x'] = True # pragma: no cover 354 queue_name['x'] = True # pragma: no cover
352 355
353 self.mock( 356 self.mock(
354 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 357 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
355 NextBuildNumberPipeline.run( 358 NextBuildNumberPipeline.run(
356 NextBuildNumberPipeline(), master_name, builder_name, 359 NextBuildNumberPipeline(), master_name, builder_name,
357 master_build_number, build_number, step_name, test_name, 360 master_build_number, build_number, step_name, test_name, 1,
358 test_result_future, queue_name, flakiness_algorithm_results_dict) 361 test_result_future, queue_name, flakiness_algorithm_results_dict)
359 self.assertFalse(queue_name['x']) 362 self.assertFalse(queue_name['x'])
360 363
361 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): 364 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self):
362 master_name = 'm' 365 master_name = 'm'
363 builder_name = 'b' 366 builder_name = 'b'
364 master_build_number = 100 367 master_build_number = 100
365 build_number = 100 368 build_number = 100
366 step_name = 's' 369 step_name = 's'
367 test_name = 't' 370 test_name = 't'
(...skipping 11 matching lines...) Expand all
379 'sequential_run_index': 0 382 'sequential_run_index': 0
380 } 383 }
381 self._CreateAndSaveMasterFlakeAnalysis( 384 self._CreateAndSaveMasterFlakeAnalysis(
382 master_name, builder_name, build_number, step_name, 385 master_name, builder_name, build_number, step_name,
383 test_name, status=analysis_status.PENDING 386 test_name, status=analysis_status.PENDING
384 ) 387 )
385 self._CreateAndSaveFlakeSwarmingTask( 388 self._CreateAndSaveFlakeSwarmingTask(
386 master_name, builder_name, build_number, step_name, 389 master_name, builder_name, build_number, step_name,
387 test_name, status=analysis_status.COMPLETED 390 test_name, status=analysis_status.COMPLETED
388 ) 391 )
389 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 392 analysis = MasterFlakeAnalysis.GetVersion(
390 build_number, step_name, test_name) 393 master_name, builder_name, build_number, step_name, test_name)
391 analysis.success_rates.append(.50) 394 analysis.pass_rates.append(.50)
392 analysis.build_numbers.append(100) 395 analysis.build_numbers.append(100)
393 analysis.put() 396 analysis.put()
394 397
395 queue_name = {'x': False} 398 queue_name = {'x': False}
396 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument 399 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument
397 queue_name['x'] = True # pragma: no cover 400 queue_name['x'] = True # pragma: no cover
398 401
399 self.mock( 402 self.mock(
400 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 403 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
401 NextBuildNumberPipeline.run( 404 NextBuildNumberPipeline.run(
402 NextBuildNumberPipeline(), master_name, builder_name, 405 NextBuildNumberPipeline(), master_name, builder_name,
403 master_build_number, build_number, step_name, test_name, 406 master_build_number, build_number, step_name, test_name,
404 test_result_future, queue_name, flakiness_algorithm_results_dict) 407 analysis.version_number, test_result_future, queue_name,
408 flakiness_algorithm_results_dict)
405 self.assertTrue(queue_name['x']) 409 self.assertTrue(queue_name['x'])
406 410
407 def testGetNextRunSetStableLowerBoundary(self): 411 def testGetNextRunSetStableLowerBoundary(self):
408 master_name = 'm' 412 master_name = 'm'
409 builder_name = 'b' 413 builder_name = 'b'
410 build_number = 100 414 build_number = 100
411 step_name = 's' 415 step_name = 's'
412 test_name = 't' 416 test_name = 't'
413 self._CreateAndSaveMasterFlakeAnalysis( 417 self._CreateAndSaveMasterFlakeAnalysis(
414 master_name, builder_name, build_number, step_name, 418 master_name, builder_name, build_number, step_name,
415 test_name, status=analysis_status.PENDING 419 test_name, status=analysis_status.PENDING
416 ) 420 )
417 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 421 analysis = MasterFlakeAnalysis.GetVersion(
418 build_number, step_name, test_name) 422 master_name, builder_name, build_number, step_name, test_name)
419 analysis.success_rates.append(1) 423 analysis.pass_rates.append(1)
420 analysis.build_numbers.append(100) 424 analysis.build_numbers.append(100)
421 analysis.put() 425 analysis.put()
422 426
423 flakiness_algorithm_results_dict = { 427 flakiness_algorithm_results_dict = {
424 'flakes_in_a_row': 4, 428 'flakes_in_a_row': 4,
425 'stable_in_a_row': 0, 429 'stable_in_a_row': 0,
426 'stabled_out': False, 430 'stabled_out': False,
427 'flaked_out': True, 431 'flaked_out': True,
428 'last_build_number': 0, 432 'last_build_number': 0,
429 'lower_boundary': None, 433 'lower_boundary': None,
(...skipping 10 matching lines...) Expand all
440 def testGetNextRunSetFlakeLowerBoundary(self): 444 def testGetNextRunSetFlakeLowerBoundary(self):
441 master_name = 'm' 445 master_name = 'm'
442 builder_name = 'b' 446 builder_name = 'b'
443 build_number = 100 447 build_number = 100
444 step_name = 's' 448 step_name = 's'
445 test_name = 't' 449 test_name = 't'
446 self._CreateAndSaveMasterFlakeAnalysis( 450 self._CreateAndSaveMasterFlakeAnalysis(
447 master_name, builder_name, build_number, step_name, 451 master_name, builder_name, build_number, step_name,
448 test_name, status=analysis_status.PENDING 452 test_name, status=analysis_status.PENDING
449 ) 453 )
450 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 454 analysis = MasterFlakeAnalysis.GetVersion(
451 build_number, step_name, test_name) 455 master_name, builder_name, build_number, step_name, test_name)
452 analysis.success_rates.append(.5) 456 analysis.pass_rates.append(.5)
453 analysis.build_numbers.append(100) 457 analysis.build_numbers.append(100)
454 analysis.put() 458 analysis.put()
455 459
456 flakiness_algorithm_results_dict = { 460 flakiness_algorithm_results_dict = {
457 'flakes_in_a_row': 0, 461 'flakes_in_a_row': 0,
458 'stable_in_a_row': 0, 462 'stable_in_a_row': 0,
459 'stabled_out': True, 463 'stabled_out': True,
460 'flaked_out': False, 464 'flaked_out': False,
461 'last_build_number': 0, 465 'last_build_number': 0,
462 'lower_boundary': None, 466 'lower_boundary': None,
(...skipping 10 matching lines...) Expand all
473 def testSequentialNextRunFirstTime(self): 477 def testSequentialNextRunFirstTime(self):
474 master_name = 'm' 478 master_name = 'm'
475 builder_name = 'b' 479 builder_name = 'b'
476 build_number = 100 480 build_number = 100
477 step_name = 's' 481 step_name = 's'
478 test_name = 't' 482 test_name = 't'
479 self._CreateAndSaveMasterFlakeAnalysis( 483 self._CreateAndSaveMasterFlakeAnalysis(
480 master_name, builder_name, build_number, step_name, 484 master_name, builder_name, build_number, step_name,
481 test_name, status=analysis_status.PENDING 485 test_name, status=analysis_status.PENDING
482 ) 486 )
483 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 487 analysis = MasterFlakeAnalysis.GetVersion(
484 build_number, step_name, test_name) 488 master_name, builder_name, build_number, step_name, test_name)
485 analysis.success_rates.append(.5) 489 analysis.pass_rates.append(.5)
486 analysis.build_numbers.append(100) 490 analysis.build_numbers.append(100)
487 analysis.put() 491 analysis.put()
488 492
489 flakiness_algorithm_results_dict = { 493 flakiness_algorithm_results_dict = {
490 'flakes_in_a_row': 0, 494 'flakes_in_a_row': 0,
491 'stable_in_a_row': 0, 495 'stable_in_a_row': 0,
492 'stabled_out': True, 496 'stabled_out': True,
493 'flaked_out': True, 497 'flaked_out': True,
494 'last_build_number': 0, 498 'last_build_number': 0,
495 'lower_boundary': 100, 499 'lower_boundary': 100,
496 'upper_boundary': 110, 500 'upper_boundary': 110,
497 'lower_boundary_result': 'STABLE', 501 'lower_boundary_result': 'STABLE',
498 'sequential_run_index': 0 502 'sequential_run_index': 0
499 } 503 }
500 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) 504 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict)
501 self.assertEqual(next_run, 101) 505 self.assertEqual(next_run, 101)
502 506
503 def testSequentialFoundBorderFlake(self): 507 def testSequentialFoundBorderFlake(self):
504 master_name = 'm' 508 master_name = 'm'
505 builder_name = 'b' 509 builder_name = 'b'
506 build_number = 100 510 build_number = 100
507 step_name = 's' 511 step_name = 's'
508 test_name = 't' 512 test_name = 't'
509 self._CreateAndSaveMasterFlakeAnalysis( 513 self._CreateAndSaveMasterFlakeAnalysis(
510 master_name, builder_name, build_number, step_name, 514 master_name, builder_name, build_number, step_name,
511 test_name, status=analysis_status.PENDING 515 test_name, status=analysis_status.PENDING
512 ) 516 )
513 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 517 analysis = MasterFlakeAnalysis.GetVersion(
514 build_number, step_name, test_name) 518 master_name, builder_name, build_number, step_name, test_name)
515 analysis.success_rates.append(.5) 519 analysis.pass_rates.append(.5)
516 analysis.build_numbers.append(100) 520 analysis.build_numbers.append(100)
517 analysis.put() 521 analysis.put()
518 522
519 flakiness_algorithm_results_dict = { 523 flakiness_algorithm_results_dict = {
520 'flakes_in_a_row': 0, 524 'flakes_in_a_row': 0,
521 'stable_in_a_row': 0, 525 'stable_in_a_row': 0,
522 'stabled_out': True, 526 'stabled_out': True,
523 'flaked_out': True, 527 'flaked_out': True,
524 'last_build_number': 0, 528 'last_build_number': 0,
525 'lower_boundary': 100, 529 'lower_boundary': 100,
526 'upper_boundary': 110, 530 'upper_boundary': 110,
527 'lower_boundary_result': 'STABLE', 531 'lower_boundary_result': 'STABLE',
528 'sequential_run_index': 1 532 'sequential_run_index': 1
529 } 533 }
530 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) 534 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict)
531 self.assertEqual(next_run, False) 535 self.assertEqual(next_run, False)
532 self.assertEqual(analysis.suspected_flake_build_number, 101) 536 self.assertEqual(analysis.suspected_flake_build_number, 101)
533 537
534 def testSequentialFoundBorderStable(self): 538 def testSequentialFoundBorderStable(self):
535 master_name = 'm' 539 master_name = 'm'
536 builder_name = 'b' 540 builder_name = 'b'
537 build_number = 100 541 build_number = 100
538 step_name = 's' 542 step_name = 's'
539 test_name = 't' 543 test_name = 't'
540 self._CreateAndSaveMasterFlakeAnalysis( 544 self._CreateAndSaveMasterFlakeAnalysis(
541 master_name, builder_name, build_number, step_name, 545 master_name, builder_name, build_number, step_name,
542 test_name, status=analysis_status.PENDING 546 test_name, status=analysis_status.PENDING
543 ) 547 )
544 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 548 analysis = MasterFlakeAnalysis.GetVersion(
545 build_number, step_name, test_name) 549 master_name, builder_name, build_number, step_name, test_name)
546 analysis.success_rates.append(1) 550 analysis.pass_rates.append(1)
547 analysis.build_numbers.append(100) 551 analysis.build_numbers.append(100)
548 analysis.put() 552 analysis.put()
549 553
550 flakiness_algorithm_results_dict = { 554 flakiness_algorithm_results_dict = {
551 'flakes_in_a_row': 0, 555 'flakes_in_a_row': 0,
552 'stable_in_a_row': 0, 556 'stable_in_a_row': 0,
553 'stabled_out': True, 557 'stabled_out': True,
554 'flaked_out': True, 558 'flaked_out': True,
555 'last_build_number': 0, 559 'last_build_number': 0,
556 'lower_boundary': 100, 560 'lower_boundary': 100,
557 'upper_boundary': 110, 561 'upper_boundary': 110,
558 'lower_boundary_result': 'FLAKE', 562 'lower_boundary_result': 'FLAKE',
559 'sequential_run_index': 1 563 'sequential_run_index': 1
560 } 564 }
561 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) 565 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict)
562 self.assertEqual(next_run, False) 566 self.assertEqual(next_run, False)
563 self.assertEqual(analysis.suspected_flake_build_number, 101) 567 self.assertEqual(analysis.suspected_flake_build_number, 101)
564 568
565
566 def testSequentialDidntFindBorderStable(self): 569 def testSequentialDidntFindBorderStable(self):
567 master_name = 'm' 570 master_name = 'm'
568 builder_name = 'b' 571 builder_name = 'b'
569 build_number = 100 572 build_number = 100
570 step_name = 's' 573 step_name = 's'
571 test_name = 't' 574 test_name = 't'
572 self._CreateAndSaveMasterFlakeAnalysis( 575 self._CreateAndSaveMasterFlakeAnalysis(
573 master_name, builder_name, build_number, step_name, 576 master_name, builder_name, build_number, step_name,
574 test_name, status=analysis_status.PENDING 577 test_name, status=analysis_status.PENDING
575 ) 578 )
576 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 579 analysis = MasterFlakeAnalysis.GetVersion(
577 build_number, step_name, test_name) 580 master_name, builder_name, build_number, step_name, test_name)
578 analysis.success_rates.append(1) 581 analysis.pass_rates.append(1)
579 analysis.build_numbers.append(100) 582 analysis.build_numbers.append(100)
580 analysis.put() 583 analysis.put()
581 584
582 flakiness_algorithm_results_dict = { 585 flakiness_algorithm_results_dict = {
583 'flakes_in_a_row': 0, 586 'flakes_in_a_row': 0,
584 'stable_in_a_row': 0, 587 'stable_in_a_row': 0,
585 'stabled_out': True, 588 'stabled_out': True,
586 'flaked_out': True, 589 'flaked_out': True,
587 'last_build_number': 0, 590 'last_build_number': 0,
588 'lower_boundary': 100, 591 'lower_boundary': 100,
(...skipping 27 matching lines...) Expand all
616 619
617 } 620 }
618 self._CreateAndSaveMasterFlakeAnalysis( 621 self._CreateAndSaveMasterFlakeAnalysis(
619 master_name, builder_name, build_number, step_name, 622 master_name, builder_name, build_number, step_name,
620 test_name, status=analysis_status.PENDING 623 test_name, status=analysis_status.PENDING
621 ) 624 )
622 self._CreateAndSaveFlakeSwarmingTask( 625 self._CreateAndSaveFlakeSwarmingTask(
623 master_name, builder_name, build_number, step_name, 626 master_name, builder_name, build_number, step_name,
624 test_name, status=analysis_status.COMPLETED 627 test_name, status=analysis_status.COMPLETED
625 ) 628 )
626 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, 629 analysis = MasterFlakeAnalysis.GetVersion(
627 build_number, step_name, test_name) 630 master_name, builder_name, build_number, step_name, test_name)
628 analysis.success_rates.append(1) 631 analysis.pass_rates.append(1)
629 analysis.build_numbers.append(50) 632 analysis.build_numbers.append(50)
630 analysis.put() 633 analysis.put()
631 634
632 NextBuildNumberPipeline.run( 635 NextBuildNumberPipeline.run(
633 NextBuildNumberPipeline(), master_name, builder_name, 636 NextBuildNumberPipeline(), master_name, builder_name,
634 master_build_number, build_number, step_name, test_name, 637 master_build_number, build_number, step_name, test_name,
635 test_result_future, queue_name, flakiness_algorithm_results_dict) 638 analysis.version_number, test_result_future, queue_name,
639 flakiness_algorithm_results_dict)
636 self.assertEquals( 640 self.assertEquals(
637 flakiness_algorithm_results_dict['sequential_run_index'], 1) 641 flakiness_algorithm_results_dict['sequential_run_index'], 1)
638 642
639 def testNextBuildWhenTestNotExistingAfterStableInARow(self): 643 def testNextBuildWhenTestNotExistingAfterStableInARow(self):
640 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') 644 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't')
641 master.success_rates = [0.8, 1.0, 1.0, -1] 645 master.pass_rates = [0.8, 1.0, 1.0, -1]
642 master.build_numbers = [100, 80, 70, 60] 646 master.build_numbers = [100, 80, 70, 60]
643 flakiness_algorithm_results_dict = { 647 flakiness_algorithm_results_dict = {
644 'flakes_in_a_row': 0, 648 'flakes_in_a_row': 0,
645 'stable_in_a_row': 2, 649 'stable_in_a_row': 2,
646 'stabled_out': False, 650 'stabled_out': False,
647 'flaked_out': False, 651 'flaked_out': False,
648 'last_build_number': 0, 652 'last_build_number': 0,
649 'lower_boundary': None, 653 'lower_boundary': None,
650 'upper_boundary': None, 654 'upper_boundary': None,
651 'lower_boundary_result': None, 655 'lower_boundary_result': None,
652 'sequential_run_index': 0, 656 'sequential_run_index': 0,
653 } 657 }
654 658
655 next_run = get_next_run(master, flakiness_algorithm_results_dict) 659 next_run = get_next_run(master, flakiness_algorithm_results_dict)
656 self.assertEqual(81, next_run) 660 self.assertEqual(81, next_run)
657 self.assertTrue(flakiness_algorithm_results_dict['stabled_out']) 661 self.assertTrue(flakiness_algorithm_results_dict['stabled_out'])
658 self.assertTrue(flakiness_algorithm_results_dict['flaked_out']) 662 self.assertTrue(flakiness_algorithm_results_dict['flaked_out'])
659 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary']) 663 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary'])
660 self.assertEqual('STABLE', 664 self.assertEqual('STABLE',
661 flakiness_algorithm_results_dict['lower_boundary_result']) 665 flakiness_algorithm_results_dict['lower_boundary_result'])
662 666
663 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self): 667 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self):
664 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') 668 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't')
665 master.success_rates = [0.8, 0.7, 0.75, -1] 669 master.pass_rates = [0.8, 0.7, 0.75, -1]
666 master.build_numbers = [100, 80, 70, 60] 670 master.build_numbers = [100, 80, 70, 60]
667 flakiness_algorithm_results_dict = { 671 flakiness_algorithm_results_dict = {
668 'flakes_in_a_row': 3, 672 'flakes_in_a_row': 3,
669 'stable_in_a_row': 0, 673 'stable_in_a_row': 0,
670 'stabled_out': False, 674 'stabled_out': False,
671 'flaked_out': False, 675 'flaked_out': False,
672 'last_build_number': 0, 676 'last_build_number': 0,
673 'lower_boundary': None, 677 'lower_boundary': None,
674 'upper_boundary': None, 678 'upper_boundary': None,
675 'lower_boundary_result': None, 679 'lower_boundary_result': None,
(...skipping 23 matching lines...) Expand all
699 'stabled_out': False, 703 'stabled_out': False,
700 'flaked_out': False, 704 'flaked_out': False,
701 'last_build_number': 0, 705 'last_build_number': 0,
702 'lower_boundary': None, 706 'lower_boundary': None,
703 'upper_boundary': None, 707 'upper_boundary': None,
704 'lower_boundary_result': None, 708 'lower_boundary_result': None,
705 'sequential_run_index': 0 709 'sequential_run_index': 0
706 } 710 }
707 self._CreateAndSaveMasterFlakeAnalysis( 711 self._CreateAndSaveMasterFlakeAnalysis(
708 master_name, builder_name, master_build_number, step_name, 712 master_name, builder_name, master_build_number, step_name,
709 test_name, status=analysis_status.RUNNING 713 test_name, status=analysis_status.RUNNING)
710 )
711 self._CreateAndSaveFlakeSwarmingTask( 714 self._CreateAndSaveFlakeSwarmingTask(
712 master_name, builder_name, build_number, step_name, 715 master_name, builder_name, build_number, step_name,
713 test_name, status=analysis_status.COMPLETED 716 test_name, status=analysis_status.COMPLETED)
714 ) 717
715 analysis = MasterFlakeAnalysis.Get( 718 analysis = MasterFlakeAnalysis.GetVersion(
716 master_name, builder_name, 719 master_name, builder_name, master_build_number, step_name, test_name)
717 master_build_number, step_name, test_name) 720 analysis.pass_rates = [1.0, 1.0, 1.0, -1]
718 analysis.success_rates = [1.0, 1.0, 1.0, -1]
719 analysis.build_numbers = [100, 80, 70, 60] 721 analysis.build_numbers = [100, 80, 70, 60]
720 analysis.put() 722 analysis.put()
721 723
722 pipeline = NextBuildNumberPipeline() 724 pipeline = NextBuildNumberPipeline()
723 pipeline.run( 725 pipeline.run(
724 master_name, builder_name, 726 master_name, builder_name,
725 master_build_number, build_number, step_name, test_name, 727 master_build_number, build_number, step_name, test_name,
726 test_result_future, queue_name, flakiness_algorithm_results_dict) 728 analysis.version_number, test_result_future, queue_name,
729 flakiness_algorithm_results_dict)
727 730
728 analysis = MasterFlakeAnalysis.Get( 731 analysis = MasterFlakeAnalysis.GetVersion(
729 master_name, builder_name, 732 master_name, builder_name, master_build_number, step_name, test_name)
730 master_build_number, step_name, test_name)
731 self.assertEqual(analysis_status.COMPLETED, analysis.status) 733 self.assertEqual(analysis_status.COMPLETED, analysis.status)
732 734
733 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): 735 def testNextBuildNumberIsSmallerThanLastBuildNumber(self):
734 master_name = 'm' 736 master_name = 'm'
735 builder_name = 'b' 737 builder_name = 'b'
736 master_build_number = 100 738 master_build_number = 100
737 build_number = 60 739 build_number = 60
738 step_name = 's' 740 step_name = 's'
739 test_name = 't' 741 test_name = 't'
740 test_result_future = 'trf' 742 test_result_future = 'trf'
741 queue_name = constants.DEFAULT_QUEUE 743 queue_name = constants.DEFAULT_QUEUE
742 flakiness_algorithm_results_dict = { 744 flakiness_algorithm_results_dict = {
743 'flakes_in_a_row': 0, 745 'flakes_in_a_row': 0,
744 'stable_in_a_row': 3, 746 'stable_in_a_row': 3,
745 'stabled_out': False, 747 'stabled_out': False,
746 'flaked_out': False, 748 'flaked_out': False,
747 'last_build_number': 59, 749 'last_build_number': 59,
748 'lower_boundary': None, 750 'lower_boundary': None,
749 'upper_boundary': None, 751 'upper_boundary': None,
750 'lower_boundary_result': None, 752 'lower_boundary_result': None,
751 'sequential_run_index': 0 753 'sequential_run_index': 0
752 } 754 }
753 self._CreateAndSaveMasterFlakeAnalysis( 755 analysis = MasterFlakeAnalysis.Create(
754 master_name, builder_name, master_build_number, step_name, 756 master_name, builder_name, master_build_number, step_name, test_name)
755 test_name, status=analysis_status.RUNNING 757 analysis.pass_rates = [1.0, 1.0, 1.0, 1.0]
756 ) 758 analysis.build_numbers = [100, 80, 70, 60]
759 analysis.status = analysis_status.RUNNING
760 analysis.Save()
761
757 self._CreateAndSaveFlakeSwarmingTask( 762 self._CreateAndSaveFlakeSwarmingTask(
758 master_name, builder_name, build_number, step_name, 763 master_name, builder_name, build_number, step_name,
759 test_name, status=analysis_status.COMPLETED 764 test_name, status=analysis_status.COMPLETED)
760 )
761 analysis = MasterFlakeAnalysis.Get(
762 master_name, builder_name,
763 master_build_number, step_name, test_name)
764 analysis.success_rates = [1.0, 1.0, 1.0, 1.0]
765 analysis.build_numbers = [100, 80, 70, 60]
766 analysis.put()
767 765
768 pipeline = NextBuildNumberPipeline() 766 pipeline = NextBuildNumberPipeline()
769 pipeline.run( 767 pipeline.run(
770 master_name, builder_name, 768 master_name, builder_name,
771 master_build_number, build_number, step_name, test_name, 769 master_build_number, build_number, step_name, test_name,
772 test_result_future, queue_name, flakiness_algorithm_results_dict) 770 analysis.version_number, test_result_future, queue_name,
771 flakiness_algorithm_results_dict)
773 772
774 analysis = MasterFlakeAnalysis.Get( 773 analysis = MasterFlakeAnalysis.GetVersion(
775 master_name, builder_name, 774 master_name, builder_name, master_build_number, step_name, test_name)
776 master_build_number, step_name, test_name)
777 self.assertEqual(analysis_status.COMPLETED, analysis.status) 775 self.assertEqual(analysis_status.COMPLETED, analysis.status)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698