Commit 2420d831 authored by Alexander Belopolsky's avatar Alexander Belopolsky

Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near

the DST transition.  Patch by Joe Peterson.
parent ea7e9f9a
...@@ -22,7 +22,7 @@ Public functions: Internaldate2tuple ...@@ -22,7 +22,7 @@ Public functions: Internaldate2tuple
__version__ = "2.58" __version__ = "2.58"
import binascii, errno, random, re, socket, subprocess, sys, time import binascii, errno, random, re, socket, subprocess, sys, time, calendar
try: try:
import ssl import ssl
...@@ -1340,19 +1340,9 @@ def Internaldate2tuple(resp): ...@@ -1340,19 +1340,9 @@ def Internaldate2tuple(resp):
zone = -zone zone = -zone
tt = (year, mon, day, hour, min, sec, -1, -1, -1) tt = (year, mon, day, hour, min, sec, -1, -1, -1)
utc = calendar.timegm(tt) - zone
utc = time.mktime(tt) return time.localtime(utc)
# Following is necessary because the time module has no 'mkgmtime'.
# 'mktime' assumes arg in local timezone, so adds timezone/altzone.
lt = time.localtime(utc)
if time.daylight and lt[-1]:
zone = zone + time.altzone
else:
zone = zone + time.timezone
return time.localtime(utc - zone)
......
...@@ -53,7 +53,7 @@ __all__ = [ ...@@ -53,7 +53,7 @@ __all__ = [
"reap_children", "cpython_only", "check_impl_detail", "get_attribute", "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
"swap_item", "swap_attr", "requires_IEEE_754", "swap_item", "swap_attr", "requires_IEEE_754",
"TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
"import_fresh_module", "failfast", "import_fresh_module", "failfast", "run_with_tz"
] ]
class Error(Exception): class Error(Exception):
...@@ -1020,6 +1020,35 @@ def run_with_locale(catstr, *locales): ...@@ -1020,6 +1020,35 @@ def run_with_locale(catstr, *locales):
return inner return inner
return decorator return decorator
#=======================================================================
# Decorator for running a function in a specific timezone, correctly
# resetting it afterwards.
def run_with_tz(tz):
def decorator(func):
def inner(*args, **kwds):
if 'TZ' in os.environ:
orig_tz = os.environ['TZ']
else:
orig_tz = None
os.environ['TZ'] = tz
time.tzset()
# now run the function, resetting the tz on exceptions
try:
return func(*args, **kwds)
finally:
if orig_tz == None:
del os.environ['TZ']
else:
os.environ['TZ'] = orig_tz
time.tzset()
inner.__name__ = func.__name__
inner.__doc__ = func.__doc__
return inner
return decorator
#======================================================================= #=======================================================================
# Big-memory-test support. Separate from 'resources' because memory use # Big-memory-test support. Separate from 'resources' because memory use
# should be configurable. # should be configurable.
......
...@@ -11,7 +11,7 @@ import socketserver ...@@ -11,7 +11,7 @@ import socketserver
import time import time
import calendar import calendar
from test.support import reap_threads, verbose, transient_internet from test.support import reap_threads, verbose, transient_internet, run_with_tz
import unittest import unittest
try: try:
...@@ -36,6 +36,13 @@ class TestImaplib(unittest.TestCase): ...@@ -36,6 +36,13 @@ class TestImaplib(unittest.TestCase):
b'25 (INTERNALDATE "31-Dec-1999 12:30:00 -1130")') b'25 (INTERNALDATE "31-Dec-1999 12:30:00 -1130")')
self.assertEqual(time.mktime(tt), t0) self.assertEqual(time.mktime(tt), t0)
@run_with_tz('MST+07MDT,M4.1.0,M10.5.0')
def test_Internaldate2tuple_issue10941(self):
self.assertNotEqual(imaplib.Internaldate2tuple(
b'25 (INTERNALDATE "02-Apr-2000 02:30:00 +0000")'),
imaplib.Internaldate2tuple(
b'25 (INTERNALDATE "02-Apr-2000 03:30:00 +0000")'))
def test_that_Time2Internaldate_returns_a_result(self): def test_that_Time2Internaldate_returns_a_result(self):
# We can check only that it successfully produces a result, # We can check only that it successfully produces a result,
# not the correctness of the result itself, since the result # not the correctness of the result itself, since the result
......
...@@ -702,6 +702,7 @@ Peter Parente ...@@ -702,6 +702,7 @@ Peter Parente
Alexandre Parenteau Alexandre Parenteau
Dan Parisien Dan Parisien
Harri Pasanen Harri Pasanen
Joe Peterson
Randy Pausch Randy Pausch
Samuele Pedroni Samuele Pedroni
Marcel van der Peijl Marcel van der Peijl
......
...@@ -56,6 +56,9 @@ Core and Builtins ...@@ -56,6 +56,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
the DST transition. Patch by Joe Peterson.
- Issue #9154: Fix parser module to understand function annotations. - Issue #9154: Fix parser module to understand function annotations.
- Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a - Issue #14664: It is now possible to use @unittest.skip{If,Unless} on a
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment