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

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

Issue 2391063002: [Findit] Fix flaky tests due to importing pytz. (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
« no previous file with comments | « appengine/findit/waterfall/flake/recursive_flake_pipeline.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
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 5 from datetime import datetime
6 6 import mock
7 import pytz
8 7
9 from common import constants 8 from common import constants
10 from common.pipeline_wrapper import pipeline_handlers 9 from common.pipeline_wrapper import pipeline_handlers
11 from model import analysis_status 10 from model import analysis_status
12 from model.flake.flake_swarming_task import FlakeSwarmingTask 11 from model.flake.flake_swarming_task import FlakeSwarmingTask
13 from model.flake.master_flake_analysis import DataPoint 12 from model.flake.master_flake_analysis import DataPoint
14 from model.flake.master_flake_analysis import MasterFlakeAnalysis 13 from model.flake.master_flake_analysis import MasterFlakeAnalysis
15 from waterfall.flake import recursive_flake_pipeline 14 from waterfall.flake import recursive_flake_pipeline
16 from waterfall.flake.recursive_flake_pipeline import get_next_run 15 from waterfall.flake.recursive_flake_pipeline import get_next_run
17 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline 16 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline
(...skipping 30 matching lines...) Expand all
48 data_points.append(data_point) 47 data_points.append(data_point)
49 return data_points 48 return data_points
50 49
51 def testGetETAToStartAnalysisWhenManuallyTriggered(self): 50 def testGetETAToStartAnalysisWhenManuallyTriggered(self):
52 mocked_utcnow = datetime.utcnow() 51 mocked_utcnow = datetime.utcnow()
53 self.MockUTCNow(mocked_utcnow) 52 self.MockUTCNow(mocked_utcnow)
54 self.assertEqual(mocked_utcnow, 53 self.assertEqual(mocked_utcnow,
55 recursive_flake_pipeline._GetETAToStartAnalysis(True)) 54 recursive_flake_pipeline._GetETAToStartAnalysis(True))
56 55
57 def testGetETAToStartAnalysisWhenTriggeredOnPSTWeekend(self): 56 def testGetETAToStartAnalysisWhenTriggeredOnPSTWeekend(self):
58 # Sunday 1pm in PST. 57 # Sunday 1pm in PST, and Sunday 8pm in UTC.
59 mocked_utcnow = datetime(2016, 9, 04, 20, 0, 0, 0, pytz.utc) 58 mocked_pst_now = datetime(2016, 9, 04, 13, 0, 0, 0)
60 self.MockUTCNow(mocked_utcnow) 59 mocked_utc_now = datetime(2016, 9, 04, 20, 0, 0, 0)
61 self.MockUTCNowWithTimezone(mocked_utcnow) 60 self.MockUTCNow(mocked_utc_now)
62 self.assertEqual(mocked_utcnow, 61 self.MockUTCNowWithTimezone(mocked_utc_now)
63 recursive_flake_pipeline._GetETAToStartAnalysis(False)) 62 with mock.patch('common.time_util.GetDatetimeInTimezone') as timezone_func:
63 timezone_func.side_effect = [mocked_pst_now, None]
64 self.assertEqual(mocked_utc_now,
65 recursive_flake_pipeline._GetETAToStartAnalysis(False))
64 66
65 def testGetETAToStartAnalysisWhenTriggeredOffPeakHoursOnPSTWeekday(self): 67 def testGetETAToStartAnalysisWhenTriggeredOffPeakHoursOnPSTWeekday(self):
66 # Tuesday 1am in PST. 68 # Tuesday 1am in PST, and Tuesday 8am in UTC.
67 mocked_utcnow = datetime(2016, 9, 20, 8, 0, 0, 0, pytz.utc) 69 mocked_pst_now = datetime(2016, 9, 20, 1, 0, 0, 0)
68 self.MockUTCNow(mocked_utcnow) 70 mocked_utc_now = datetime(2016, 9, 20, 8, 0, 0, 0)
69 self.MockUTCNowWithTimezone(mocked_utcnow) 71 self.MockUTCNow(mocked_utc_now)
70 self.assertEqual(mocked_utcnow, 72 self.MockUTCNowWithTimezone(mocked_utc_now)
71 recursive_flake_pipeline._GetETAToStartAnalysis(False)) 73 with mock.patch('common.time_util.GetDatetimeInTimezone') as timezone_func:
74 timezone_func.side_effect = [mocked_pst_now, None]
75 self.assertEqual(mocked_utc_now,
76 recursive_flake_pipeline._GetETAToStartAnalysis(False))
72 77
73 def testGetETAToStartAnalysisWhenTriggeredInPeakHoursOnPSTWeekday(self): 78 def testGetETAToStartAnalysisWhenTriggeredInPeakHoursOnPSTWeekday(self):
74 # Tuesday 1pm in PST. 79 # Tuesday 1pm in PST, and Tuesday 8pm in UTC.
75 mocked_utcnow = datetime(2016, 9, 20, 20, 0, 0, 0, pytz.utc) 80 mocked_pst_now = datetime(2016, 9, 20, 13, 0, 0, 0)
76 self.MockUTCNow(mocked_utcnow) 81 mocked_utc_now = datetime(2016, 9, 20, 20, 0, 0, 0)
77 self.MockUTCNowWithTimezone(mocked_utcnow) 82 mocked_pst_eta = datetime(2016, 9, 20, 18, 0, 10, 0) # With random delay.
lijeffrey 2016/10/04 18:17:49 nit: instead of saying "random" delay which makes
stgao 2016/10/04 18:27:28 Done.
78 eta = recursive_flake_pipeline._GetETAToStartAnalysis(False) 83 mocked_utc_eta = datetime(2016, 9, 21, 1, 0, 0, 0) # Without random delay.
79 self.assertEqual(2016, eta.year) 84 self.MockUTCNow(mocked_utc_now)
80 self.assertEqual(9, eta.month) 85 self.MockUTCNowWithTimezone(mocked_utc_now)
81 self.assertEqual(21, eta.day) 86 with mock.patch('common.time_util.GetDatetimeInTimezone') as (
82 self.assertEqual(1, eta.hour) 87 timezone_func), mock.patch('random.randint') as random_func:
83 seconds = eta.minute * 60 + eta.second 88 timezone_func.side_effect = [mocked_pst_now, mocked_utc_eta]
84 self.assertTrue(seconds >= 0 and seconds <= 30 * 60) 89 random_func.side_effect = [10, None]
lijeffrey 2016/10/04 18:17:49 nit: is this 10 the same "random" delay as in 82?
stgao 2016/10/04 18:27:28 Done.
90 self.assertEqual(mocked_utc_eta,
91 recursive_flake_pipeline._GetETAToStartAnalysis(False))
92 self.assertEqual(2, timezone_func.call_count)
93 self.assertEqual(mock.call('US/Pacific', mocked_utc_now),
94 timezone_func.call_args_list[0])
95 self.assertEqual(mock.call('UTC', mocked_pst_eta),
96 timezone_func.call_args_list[1])
85 97
86 def testRecursiveFlakePipeline(self): 98 def testRecursiveFlakePipeline(self):
87 master_name = 'm' 99 master_name = 'm'
88 builder_name = 'b' 100 builder_name = 'b'
89 master_build_number = 100 101 master_build_number = 100
90 build_number = 100 102 build_number = 100
91 run_build_number = 100 103 run_build_number = 100
92 step_name = 's' 104 step_name = 's'
93 test_name = 't' 105 test_name = 't'
94 test_result_future = 'test_result_future' 106 test_result_future = 'test_result_future'
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 expected_kwargs={'manually_triggered': False}) 151 expected_kwargs={'manually_triggered': False})
140 152
141 rfp = RecursiveFlakePipeline( 153 rfp = RecursiveFlakePipeline(
142 master_name, builder_name, build_number, step_name, test_name, 154 master_name, builder_name, build_number, step_name, test_name,
143 analysis.version_number, master_build_number, 155 analysis.version_number, master_build_number,
144 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict) 156 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict)
145 157
146 rfp.start(queue_name=queue_name) 158 rfp.start(queue_name=queue_name)
147 self.execute_queued_tasks() 159 self.execute_queued_tasks()
148 160
149 def testNextBuildPipelineForNewRecursionFirstFlake(self): 161 @mock.patch.object(
162 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
163 def testNextBuildPipelineForNewRecursionFirstFlake(self, _mocked_eta_func):
150 master_name = 'm' 164 master_name = 'm'
151 builder_name = 'b' 165 builder_name = 'b'
152 master_build_number = 100 166 master_build_number = 100
153 build_number = 100 167 build_number = 100
154 step_name = 's' 168 step_name = 's'
155 test_name = 't' 169 test_name = 't'
156 test_result_future = 'trf' 170 test_result_future = 'trf'
157 flakiness_algorithm_results_dict = { 171 flakiness_algorithm_results_dict = {
158 'flakes_in_a_row': 0, 172 'flakes_in_a_row': 0,
159 'stable_in_a_row': 0, 173 'stable_in_a_row': 0,
(...skipping 23 matching lines...) Expand all
183 analysis.data_points.append(data_point) 197 analysis.data_points.append(data_point)
184 analysis.put() 198 analysis.put()
185 199
186 NextBuildNumberPipeline.run( 200 NextBuildNumberPipeline.run(
187 NextBuildNumberPipeline(), master_name, builder_name, 201 NextBuildNumberPipeline(), master_name, builder_name,
188 master_build_number, build_number, step_name, test_name, 202 master_build_number, build_number, step_name, test_name,
189 analysis.version_number, test_result_future, 203 analysis.version_number, test_result_future,
190 flakiness_algorithm_results_dict) 204 flakiness_algorithm_results_dict)
191 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) 205 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1)
192 206
193 def testNextBuildPipelineForNewRecursionFirstStable(self): 207 @mock.patch.object(
208 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
209 def testNextBuildPipelineForNewRecursionFirstStable(self, _mocked_eta_func):
194 master_name = 'm' 210 master_name = 'm'
195 builder_name = 'b' 211 builder_name = 'b'
196 master_build_number = 100 212 master_build_number = 100
197 build_number = 100 213 build_number = 100
198 step_name = 's' 214 step_name = 's'
199 test_name = 't' 215 test_name = 't'
200 test_result_future = 'trf' 216 test_result_future = 'trf'
201 flakiness_algorithm_results_dict = { 217 flakiness_algorithm_results_dict = {
202 'flakes_in_a_row': 0, 218 'flakes_in_a_row': 0,
203 'stable_in_a_row': 0, 219 'stable_in_a_row': 0,
(...skipping 21 matching lines...) Expand all
225 analysis.data_points.append(data_point) 241 analysis.data_points.append(data_point)
226 analysis.put() 242 analysis.put()
227 243
228 NextBuildNumberPipeline.run( 244 NextBuildNumberPipeline.run(
229 NextBuildNumberPipeline(), master_name, builder_name, 245 NextBuildNumberPipeline(), master_name, builder_name,
230 master_build_number, build_number, step_name, 246 master_build_number, build_number, step_name,
231 test_name, analysis.version_number, test_result_future, 247 test_name, analysis.version_number, test_result_future,
232 flakiness_algorithm_results_dict) 248 flakiness_algorithm_results_dict)
233 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) 249 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1)
234 250
235 def testNextBuildPipelineForNewRecursionFlakeInARow(self): 251 @mock.patch.object(
252 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
253 def testNextBuildPipelineForNewRecursionFlakeInARow(self, _mocked_eta_func):
236 master_name = 'm' 254 master_name = 'm'
237 builder_name = 'b' 255 builder_name = 'b'
238 master_build_number = 100 256 master_build_number = 100
239 build_number = 100 257 build_number = 100
240 step_name = 's' 258 step_name = 's'
241 test_name = 't' 259 test_name = 't'
242 test_result_future = 'trf' 260 test_result_future = 'trf'
243 flakiness_algorithm_results_dict = { 261 flakiness_algorithm_results_dict = {
244 'flakes_in_a_row': 0, 262 'flakes_in_a_row': 0,
245 'stable_in_a_row': 4, 263 'stable_in_a_row': 4,
(...skipping 22 matching lines...) Expand all
268 analysis.data_points.append(data_point) 286 analysis.data_points.append(data_point)
269 analysis.put() 287 analysis.put()
270 288
271 NextBuildNumberPipeline.run( 289 NextBuildNumberPipeline.run(
272 NextBuildNumberPipeline(), master_name, builder_name, 290 NextBuildNumberPipeline(), master_name, builder_name,
273 master_build_number, build_number, step_name, 291 master_build_number, build_number, step_name,
274 test_name, analysis.version_number, test_result_future, 292 test_name, analysis.version_number, test_result_future,
275 flakiness_algorithm_results_dict) 293 flakiness_algorithm_results_dict)
276 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) 294 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True)
277 295
278 def testNextBuildPipelineForNewRecursionStableInARow(self): 296 @mock.patch.object(
297 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
298 def testNextBuildPipelineForNewRecursionStableInARow(self, _mocked_eta_func):
279 master_name = 'm' 299 master_name = 'm'
280 builder_name = 'b' 300 builder_name = 'b'
281 master_build_number = 100 301 master_build_number = 100
282 build_number = 100 302 build_number = 100
283 step_name = 's' 303 step_name = 's'
284 test_name = 't' 304 test_name = 't'
285 test_result_future = 'trf' 305 test_result_future = 'trf'
286 flakiness_algorithm_results_dict = { 306 flakiness_algorithm_results_dict = {
287 'flakes_in_a_row': 4, 307 'flakes_in_a_row': 4,
288 'stable_in_a_row': 0, 308 'stable_in_a_row': 0,
(...skipping 22 matching lines...) Expand all
311 analysis.data_points.append(data_point) 331 analysis.data_points.append(data_point)
312 analysis.put() 332 analysis.put()
313 333
314 NextBuildNumberPipeline.run( 334 NextBuildNumberPipeline.run(
315 NextBuildNumberPipeline(), master_name, builder_name, 335 NextBuildNumberPipeline(), master_name, builder_name,
316 master_build_number, build_number, step_name, 336 master_build_number, build_number, step_name,
317 test_name, analysis.version_number, test_result_future, 337 test_name, analysis.version_number, test_result_future,
318 flakiness_algorithm_results_dict) 338 flakiness_algorithm_results_dict)
319 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) 339 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True)
320 340
321 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): 341 @mock.patch.object(
342 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
343 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(
344 self, _mocked_eta_func):
322 master_name = 'm' 345 master_name = 'm'
323 builder_name = 'b' 346 builder_name = 'b'
324 master_build_number = 100 347 master_build_number = 100
325 build_number = 100 348 build_number = 100
326 step_name = 's' 349 step_name = 's'
327 test_name = 't' 350 test_name = 't'
328 test_result_future = 'trf' 351 test_result_future = 'trf'
329 flakiness_algorithm_results_dict = { 352 flakiness_algorithm_results_dict = {
330 'flakes_in_a_row': 0, 353 'flakes_in_a_row': 0,
331 'stable_in_a_row': 0, 354 'stable_in_a_row': 0,
(...skipping 27 matching lines...) Expand all
359 382
360 self.mock( 383 self.mock(
361 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 384 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
362 NextBuildNumberPipeline.run( 385 NextBuildNumberPipeline.run(
363 NextBuildNumberPipeline(), master_name, builder_name, 386 NextBuildNumberPipeline(), master_name, builder_name,
364 master_build_number, build_number, step_name, test_name, 387 master_build_number, build_number, step_name, test_name,
365 analysis.version_number, test_result_future, 388 analysis.version_number, test_result_future,
366 flakiness_algorithm_results_dict) 389 flakiness_algorithm_results_dict)
367 self.assertFalse(queue_name['x']) 390 self.assertFalse(queue_name['x'])
368 391
369 def testNextBuildPipelineForFailedSwarmingTask(self): 392 @mock.patch.object(
393 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
394 def testNextBuildPipelineForFailedSwarmingTask(self, _mocked_eta_func):
370 master_name = 'm' 395 master_name = 'm'
371 builder_name = 'b' 396 builder_name = 'b'
372 master_build_number = 100 397 master_build_number = 100
373 build_number = 100 398 build_number = 100
374 step_name = 's' 399 step_name = 's'
375 test_name = 't' 400 test_name = 't'
376 test_result_future = 'trf' 401 test_result_future = 'trf'
377 flakiness_algorithm_results_dict = { 402 flakiness_algorithm_results_dict = {
378 'flakes_in_a_row': 0, 403 'flakes_in_a_row': 0,
379 'stable_in_a_row': 0, 404 'stable_in_a_row': 0,
(...skipping 27 matching lines...) Expand all
407 queue_name['x'] = True # pragma: no cover 432 queue_name['x'] = True # pragma: no cover
408 433
409 self.mock( 434 self.mock(
410 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) 435 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run)
411 NextBuildNumberPipeline.run( 436 NextBuildNumberPipeline.run(
412 NextBuildNumberPipeline(), master_name, builder_name, 437 NextBuildNumberPipeline(), master_name, builder_name,
413 master_build_number, build_number, step_name, test_name, 1, 438 master_build_number, build_number, step_name, test_name, 1,
414 test_result_future, flakiness_algorithm_results_dict) 439 test_result_future, flakiness_algorithm_results_dict)
415 self.assertFalse(queue_name['x']) 440 self.assertFalse(queue_name['x'])
416 441
417 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): 442 @mock.patch.object(
443 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
444 def testNextBuildPipelineForNewRecursionStabledFlakedOut(
445 self, _mocked_eta_func):
418 master_name = 'm' 446 master_name = 'm'
419 builder_name = 'b' 447 builder_name = 'b'
420 master_build_number = 100 448 master_build_number = 100
421 build_number = 100 449 build_number = 100
422 step_name = 's' 450 step_name = 's'
423 test_name = 't' 451 test_name = 't'
424 test_result_future = 'trf' 452 test_result_future = 'trf'
425 queue_name = constants.DEFAULT_QUEUE 453 queue_name = constants.DEFAULT_QUEUE
426 flakiness_algorithm_results_dict = { 454 flakiness_algorithm_results_dict = {
427 'flakes_in_a_row': 4, 455 'flakes_in_a_row': 4,
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 'last_build_number': 0, 686 'last_build_number': 0,
659 'lower_boundary': 100, 687 'lower_boundary': 100,
660 'upper_boundary': 110, 688 'upper_boundary': 110,
661 'lower_boundary_result': 'STABLE', 689 'lower_boundary_result': 'STABLE',
662 'sequential_run_index': 1 690 'sequential_run_index': 1
663 } 691 }
664 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) 692 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict)
665 self.assertEqual(next_run, 102) 693 self.assertEqual(next_run, 102)
666 self.assertEqual(analysis.suspected_flake_build_number, None) 694 self.assertEqual(analysis.suspected_flake_build_number, None)
667 695
668 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self): 696 @mock.patch.object(
697 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None)
698 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self, _mocked_eta_func):
669 master_name = 'm' 699 master_name = 'm'
670 builder_name = 'b' 700 builder_name = 'b'
671 master_build_number = 100 701 master_build_number = 100
672 build_number = 100 702 build_number = 100
673 step_name = 's' 703 step_name = 's'
674 test_name = 't' 704 test_name = 't'
675 test_result_future = 'trf' 705 test_result_future = 'trf'
676 flakiness_algorithm_results_dict = { 706 flakiness_algorithm_results_dict = {
677 'flakes_in_a_row': 0, 707 'flakes_in_a_row': 0,
678 'stable_in_a_row': 0, 708 'stable_in_a_row': 0,
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 pipeline = NextBuildNumberPipeline() 864 pipeline = NextBuildNumberPipeline()
835 pipeline.run( 865 pipeline.run(
836 master_name, builder_name, 866 master_name, builder_name,
837 master_build_number, build_number, step_name, test_name, 867 master_build_number, build_number, step_name, test_name,
838 analysis.version_number, test_result_future, 868 analysis.version_number, test_result_future,
839 flakiness_algorithm_results_dict) 869 flakiness_algorithm_results_dict)
840 870
841 analysis = MasterFlakeAnalysis.GetVersion( 871 analysis = MasterFlakeAnalysis.GetVersion(
842 master_name, builder_name, master_build_number, step_name, test_name) 872 master_name, builder_name, master_build_number, step_name, test_name)
843 self.assertEqual(analysis_status.COMPLETED, analysis.status) 873 self.assertEqual(analysis_status.COMPLETED, analysis.status)
OLDNEW
« no previous file with comments | « appengine/findit/waterfall/flake/recursive_flake_pipeline.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698