@@ -6577,6 +6577,129 @@ def test(current, expected):
6577
6577
6578
6578
fh .close ()
6579
6579
6580
+ # Run with US-style DST rules: DST begins 2 a.m. on second Sunday in
6581
+ # March (M3.2.0) and ends 2 a.m. on first Sunday in November (M11.1.0).
6582
+ @support .run_with_tz ('EST+05EDT,M3.2.0,M11.1.0' )
6583
+ def test_compute_rollover_MIDNIGHT_local_interval (self ):
6584
+ # DST begins at 2012-3-11T02:00:00 and ends at 2012-11-4T02:00:00.
6585
+ DT = datetime .datetime
6586
+ def test (current , expected ):
6587
+ actual = fh .computeRollover (current .timestamp ())
6588
+ diff = actual - expected .timestamp ()
6589
+ if diff :
6590
+ self .assertEqual (diff , 0 , datetime .timedelta (seconds = diff ))
6591
+
6592
+ fh = logging .handlers .TimedRotatingFileHandler (
6593
+ self .fn , encoding = "utf-8" , when = 'MIDNIGHT' , utc = False , interval = 3 )
6594
+
6595
+ test (DT (2012 , 3 , 8 , 23 , 59 , 59 ), DT (2012 , 3 , 11 , 0 , 0 ))
6596
+ test (DT (2012 , 3 , 9 , 0 , 0 ), DT (2012 , 3 , 12 , 0 , 0 ))
6597
+ test (DT (2012 , 3 , 9 , 1 , 0 ), DT (2012 , 3 , 12 , 0 , 0 ))
6598
+ test (DT (2012 , 3 , 10 , 23 , 59 , 59 ), DT (2012 , 3 , 13 , 0 , 0 ))
6599
+ test (DT (2012 , 3 , 11 , 0 , 0 ), DT (2012 , 3 , 14 , 0 , 0 ))
6600
+ test (DT (2012 , 3 , 11 , 1 , 0 ), DT (2012 , 3 , 14 , 0 , 0 ))
6601
+
6602
+ test (DT (2012 , 11 , 1 , 23 , 59 , 59 ), DT (2012 , 11 , 4 , 0 , 0 ))
6603
+ test (DT (2012 , 11 , 2 , 0 , 0 ), DT (2012 , 11 , 5 , 0 , 0 ))
6604
+ test (DT (2012 , 11 , 2 , 1 , 0 ), DT (2012 , 11 , 5 , 0 , 0 ))
6605
+ test (DT (2012 , 11 , 3 , 23 , 59 , 59 ), DT (2012 , 11 , 6 , 0 , 0 ))
6606
+ test (DT (2012 , 11 , 4 , 0 , 0 ), DT (2012 , 11 , 7 , 0 , 0 ))
6607
+ test (DT (2012 , 11 , 4 , 1 , 0 ), DT (2012 , 11 , 7 , 0 , 0 ))
6608
+
6609
+ fh .close ()
6610
+
6611
+ fh = logging .handlers .TimedRotatingFileHandler (
6612
+ self .fn , encoding = "utf-8" , when = 'MIDNIGHT' , utc = False , interval = 3 ,
6613
+ atTime = datetime .time (12 , 0 , 0 ))
6614
+
6615
+ test (DT (2012 , 3 , 8 , 11 , 59 , 59 ), DT (2012 , 3 , 10 , 12 , 0 ))
6616
+ test (DT (2012 , 3 , 8 , 12 , 0 ), DT (2012 , 3 , 11 , 12 , 0 ))
6617
+ test (DT (2012 , 3 , 8 , 13 , 0 ), DT (2012 , 3 , 11 , 12 , 0 ))
6618
+ test (DT (2012 , 3 , 10 , 11 , 59 , 59 ), DT (2012 , 3 , 12 , 12 , 0 ))
6619
+ test (DT (2012 , 3 , 10 , 12 , 0 ), DT (2012 , 3 , 13 , 12 , 0 ))
6620
+ test (DT (2012 , 3 , 10 , 13 , 0 ), DT (2012 , 3 , 13 , 12 , 0 ))
6621
+
6622
+ test (DT (2012 , 11 , 1 , 11 , 59 , 59 ), DT (2012 , 11 , 3 , 12 , 0 ))
6623
+ test (DT (2012 , 11 , 1 , 12 , 0 ), DT (2012 , 11 , 4 , 12 , 0 ))
6624
+ test (DT (2012 , 11 , 1 , 13 , 0 ), DT (2012 , 11 , 4 , 12 , 0 ))
6625
+ test (DT (2012 , 11 , 3 , 11 , 59 , 59 ), DT (2012 , 11 , 5 , 12 , 0 ))
6626
+ test (DT (2012 , 11 , 3 , 12 , 0 ), DT (2012 , 11 , 6 , 12 , 0 ))
6627
+ test (DT (2012 , 11 , 3 , 13 , 0 ), DT (2012 , 11 , 6 , 12 , 0 ))
6628
+
6629
+ fh .close ()
6630
+
6631
+ # Run with US-style DST rules: DST begins 2 a.m. on second Sunday in
6632
+ # March (M3.2.0) and ends 2 a.m. on first Sunday in November (M11.1.0).
6633
+ @support .run_with_tz ('EST+05EDT,M3.2.0,M11.1.0' )
6634
+ def test_compute_rollover_W6_local_interval (self ):
6635
+ # DST begins at 2012-3-11T02:00:00 and ends at 2012-11-4T02:00:00.
6636
+ DT = datetime .datetime
6637
+ def test (current , expected ):
6638
+ actual = fh .computeRollover (current .timestamp ())
6639
+ diff = actual - expected .timestamp ()
6640
+ if diff :
6641
+ self .assertEqual (diff , 0 , datetime .timedelta (seconds = diff ))
6642
+
6643
+ fh = logging .handlers .TimedRotatingFileHandler (
6644
+ self .fn , encoding = "utf-8" , when = 'W6' , utc = False , interval = 3 )
6645
+
6646
+ test (DT (2012 , 2 , 19 , 23 , 59 , 59 ), DT (2012 , 3 , 5 , 0 , 0 ))
6647
+ test (DT (2012 , 2 , 20 , 0 , 0 ), DT (2012 , 3 , 12 , 0 , 0 ))
6648
+ test (DT (2012 , 2 , 20 , 1 , 0 ), DT (2012 , 3 , 12 , 0 , 0 ))
6649
+ test (DT (2012 , 3 , 4 , 23 , 59 , 59 ), DT (2012 , 3 , 19 , 0 , 0 ))
6650
+ test (DT (2012 , 3 , 5 , 0 , 0 ), DT (2012 , 3 , 26 , 0 , 0 ))
6651
+ test (DT (2012 , 3 , 5 , 1 , 0 ), DT (2012 , 3 , 26 , 0 , 0 ))
6652
+
6653
+ test (DT (2012 , 10 , 14 , 23 , 59 , 59 ), DT (2012 , 10 , 29 , 0 , 0 ))
6654
+ test (DT (2012 , 10 , 15 , 0 , 0 ), DT (2012 , 11 , 5 , 0 , 0 ))
6655
+ test (DT (2012 , 10 , 15 , 1 , 0 ), DT (2012 , 11 , 5 , 0 , 0 ))
6656
+ test (DT (2012 , 10 , 28 , 23 , 59 , 59 ), DT (2012 , 11 , 12 , 0 , 0 ))
6657
+ test (DT (2012 , 10 , 29 , 0 , 0 ), DT (2012 , 11 , 19 , 0 , 0 ))
6658
+ test (DT (2012 , 10 , 29 , 1 , 0 ), DT (2012 , 11 , 19 , 0 , 0 ))
6659
+
6660
+ fh .close ()
6661
+
6662
+ fh = logging .handlers .TimedRotatingFileHandler (
6663
+ self .fn , encoding = "utf-8" , when = 'W6' , utc = False , interval = 3 ,
6664
+ atTime = datetime .time (0 , 0 , 0 ))
6665
+
6666
+ test (DT (2012 , 2 , 25 , 23 , 59 , 59 ), DT (2012 , 3 , 11 , 0 , 0 ))
6667
+ test (DT (2012 , 2 , 26 , 0 , 0 ), DT (2012 , 3 , 18 , 0 , 0 ))
6668
+ test (DT (2012 , 2 , 26 , 1 , 0 ), DT (2012 , 3 , 18 , 0 , 0 ))
6669
+ test (DT (2012 , 3 , 10 , 23 , 59 , 59 ), DT (2012 , 3 , 25 , 0 , 0 ))
6670
+ test (DT (2012 , 3 , 11 , 0 , 0 ), DT (2012 , 4 , 1 , 0 , 0 ))
6671
+ test (DT (2012 , 3 , 11 , 1 , 0 ), DT (2012 , 4 , 1 , 0 , 0 ))
6672
+
6673
+ test (DT (2012 , 10 , 20 , 23 , 59 , 59 ), DT (2012 , 11 , 4 , 0 , 0 ))
6674
+ test (DT (2012 , 10 , 21 , 0 , 0 ), DT (2012 , 11 , 11 , 0 , 0 ))
6675
+ test (DT (2012 , 10 , 21 , 1 , 0 ), DT (2012 , 11 , 11 , 0 , 0 ))
6676
+ test (DT (2012 , 11 , 3 , 23 , 59 , 59 ), DT (2012 , 11 , 18 , 0 , 0 ))
6677
+ test (DT (2012 , 11 , 4 , 0 , 0 ), DT (2012 , 11 , 25 , 0 , 0 ))
6678
+ test (DT (2012 , 11 , 4 , 1 , 0 ), DT (2012 , 11 , 25 , 0 , 0 ))
6679
+
6680
+ fh .close ()
6681
+
6682
+ fh = logging .handlers .TimedRotatingFileHandler (
6683
+ self .fn , encoding = "utf-8" , when = 'W6' , utc = False , interval = 3 ,
6684
+ atTime = datetime .time (12 , 0 , 0 ))
6685
+
6686
+ test (DT (2012 , 2 , 18 , 11 , 59 , 59 ), DT (2012 , 3 , 4 , 12 , 0 ))
6687
+ test (DT (2012 , 2 , 19 , 12 , 0 ), DT (2012 , 3 , 11 , 12 , 0 ))
6688
+ test (DT (2012 , 2 , 19 , 13 , 0 ), DT (2012 , 3 , 11 , 12 , 0 ))
6689
+ test (DT (2012 , 3 , 4 , 11 , 59 , 59 ), DT (2012 , 3 , 18 , 12 , 0 ))
6690
+ test (DT (2012 , 3 , 4 , 12 , 0 ), DT (2012 , 3 , 25 , 12 , 0 ))
6691
+ test (DT (2012 , 3 , 4 , 13 , 0 ), DT (2012 , 3 , 25 , 12 , 0 ))
6692
+
6693
+ test (DT (2012 , 10 , 14 , 11 , 59 , 59 ), DT (2012 , 10 , 28 , 12 , 0 ))
6694
+ test (DT (2012 , 10 , 14 , 12 , 0 ), DT (2012 , 11 , 4 , 12 , 0 ))
6695
+ test (DT (2012 , 10 , 14 , 13 , 0 ), DT (2012 , 11 , 4 , 12 , 0 ))
6696
+ test (DT (2012 , 10 , 28 , 11 , 59 , 59 ), DT (2012 , 11 , 11 , 12 , 0 ))
6697
+ test (DT (2012 , 10 , 28 , 12 , 0 ), DT (2012 , 11 , 18 , 12 , 0 ))
6698
+ test (DT (2012 , 10 , 28 , 13 , 0 ), DT (2012 , 11 , 18 , 12 , 0 ))
6699
+
6700
+ fh .close ()
6701
+
6702
+
6580
6703
def secs (** kw ):
6581
6704
return datetime .timedelta (** kw ) // datetime .timedelta (seconds = 1 )
6582
6705
@@ -6588,40 +6711,49 @@ def secs(**kw):
6588
6711
# current time (epoch start) is a Thursday, W0 means Monday
6589
6712
('W0' , secs (days = 4 , hours = 24 )),
6590
6713
):
6591
- def test_compute_rollover (self , when = when , exp = exp ):
6592
- rh = logging .handlers .TimedRotatingFileHandler (
6593
- self .fn , encoding = "utf-8" , when = when , interval = 1 , backupCount = 0 , utc = True )
6594
- currentTime = 0.0
6595
- actual = rh .computeRollover (currentTime )
6596
- if exp != actual :
6597
- # Failures occur on some systems for MIDNIGHT and W0.
6598
- # Print detailed calculation for MIDNIGHT so we can try to see
6599
- # what's going on
6600
- if when == 'MIDNIGHT' :
6601
- try :
6602
- if rh .utc :
6603
- t = time .gmtime (currentTime )
6604
- else :
6605
- t = time .localtime (currentTime )
6606
- currentHour = t [3 ]
6607
- currentMinute = t [4 ]
6608
- currentSecond = t [5 ]
6609
- # r is the number of seconds left between now and midnight
6610
- r = logging .handlers ._MIDNIGHT - ((currentHour * 60 +
6611
- currentMinute ) * 60 +
6612
- currentSecond )
6613
- result = currentTime + r
6614
- print ('t: %s (%s)' % (t , rh .utc ), file = sys .stderr )
6615
- print ('currentHour: %s' % currentHour , file = sys .stderr )
6616
- print ('currentMinute: %s' % currentMinute , file = sys .stderr )
6617
- print ('currentSecond: %s' % currentSecond , file = sys .stderr )
6618
- print ('r: %s' % r , file = sys .stderr )
6619
- print ('result: %s' % result , file = sys .stderr )
6620
- except Exception as e :
6621
- print ('exception in diagnostic code: %s' % e , file = sys .stderr )
6622
- self .assertEqual (exp , actual )
6623
- rh .close ()
6624
- setattr (TimedRotatingFileHandlerTest , "test_compute_rollover_%s" % when , test_compute_rollover )
6714
+ for interval in 1 , 3 :
6715
+ def test_compute_rollover (self , when = when , interval = interval , exp = exp ):
6716
+ rh = logging .handlers .TimedRotatingFileHandler (
6717
+ self .fn , encoding = "utf-8" , when = when , interval = interval , backupCount = 0 , utc = True )
6718
+ currentTime = 0.0
6719
+ actual = rh .computeRollover (currentTime )
6720
+ if when .startswith ('W' ):
6721
+ exp += secs (days = 7 * (interval - 1 ))
6722
+ else :
6723
+ exp *= interval
6724
+ if exp != actual :
6725
+ # Failures occur on some systems for MIDNIGHT and W0.
6726
+ # Print detailed calculation for MIDNIGHT so we can try to see
6727
+ # what's going on
6728
+ if when == 'MIDNIGHT' :
6729
+ try :
6730
+ if rh .utc :
6731
+ t = time .gmtime (currentTime )
6732
+ else :
6733
+ t = time .localtime (currentTime )
6734
+ currentHour = t [3 ]
6735
+ currentMinute = t [4 ]
6736
+ currentSecond = t [5 ]
6737
+ # r is the number of seconds left between now and midnight
6738
+ r = logging .handlers ._MIDNIGHT - ((currentHour * 60 +
6739
+ currentMinute ) * 60 +
6740
+ currentSecond )
6741
+ result = currentTime + r
6742
+ print ('t: %s (%s)' % (t , rh .utc ), file = sys .stderr )
6743
+ print ('currentHour: %s' % currentHour , file = sys .stderr )
6744
+ print ('currentMinute: %s' % currentMinute , file = sys .stderr )
6745
+ print ('currentSecond: %s' % currentSecond , file = sys .stderr )
6746
+ print ('r: %s' % r , file = sys .stderr )
6747
+ print ('result: %s' % result , file = sys .stderr )
6748
+ except Exception as e :
6749
+ print ('exception in diagnostic code: %s' % e , file = sys .stderr )
6750
+ self .assertEqual (exp , actual )
6751
+ rh .close ()
6752
+ name = "test_compute_rollover_%s" % when
6753
+ if interval > 1 :
6754
+ name += "_interval"
6755
+ test_compute_rollover .__name__ = name
6756
+ setattr (TimedRotatingFileHandlerTest , name , test_compute_rollover )
6625
6757
6626
6758
6627
6759
@unittest .skipUnless (win32evtlog , 'win32evtlog/win32evtlogutil/pywintypes required for this test.' )
0 commit comments