summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_zoneinfo
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-14 20:24:33 (GMT)
committerGitHub <noreply@github.com>2023-10-14 20:24:33 (GMT)
commitab08ff7882b6181fb785eed7410dbf8030aded70 (patch)
treea8012e6a72e4bcd41a07e591d41de37881cce93f /Lib/test/test_zoneinfo
parent12deda763359d46d4eccbb8991afed71fa31a68b (diff)
downloadcpython-ab08ff7882b6181fb785eed7410dbf8030aded70.zip
cpython-ab08ff7882b6181fb785eed7410dbf8030aded70.tar.gz
cpython-ab08ff7882b6181fb785eed7410dbf8030aded70.tar.bz2
bpo-42663: Fix parsing TZ strings in zoneinfo module (GH-23825)
zipinfo now supports the full range of values in the TZ string determined by RFC 8536 and detects all invalid formats. Both Python and C implementations now raise exceptions of the same type on invalid data.
Diffstat (limited to 'Lib/test/test_zoneinfo')
-rw-r--r--Lib/test/test_zoneinfo/test_zoneinfo.py125
1 files changed, 118 insertions, 7 deletions
diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py
index ae921f7..3766cea 100644
--- a/Lib/test/test_zoneinfo/test_zoneinfo.py
+++ b/Lib/test/test_zoneinfo/test_zoneinfo.py
@@ -1001,6 +1001,80 @@ class TZStrTest(ZoneInfoTestBase):
self.assertEqual(dt_act, dt_utc)
+ def test_extreme_tzstr(self):
+ tzstrs = [
+ # Extreme offset hour
+ "AAA24",
+ "AAA+24",
+ "AAA-24",
+ "AAA24BBB,J60/2,J300/2",
+ "AAA+24BBB,J60/2,J300/2",
+ "AAA-24BBB,J60/2,J300/2",
+ "AAA4BBB24,J60/2,J300/2",
+ "AAA4BBB+24,J60/2,J300/2",
+ "AAA4BBB-24,J60/2,J300/2",
+ # Extreme offset minutes
+ "AAA4:00BBB,J60/2,J300/2",
+ "AAA4:59BBB,J60/2,J300/2",
+ "AAA4BBB5:00,J60/2,J300/2",
+ "AAA4BBB5:59,J60/2,J300/2",
+ # Extreme offset seconds
+ "AAA4:00:00BBB,J60/2,J300/2",
+ "AAA4:00:59BBB,J60/2,J300/2",
+ "AAA4BBB5:00:00,J60/2,J300/2",
+ "AAA4BBB5:00:59,J60/2,J300/2",
+ # Extreme total offset
+ "AAA24:59:59BBB5,J60/2,J300/2",
+ "AAA-24:59:59BBB5,J60/2,J300/2",
+ "AAA4BBB24:59:59,J60/2,J300/2",
+ "AAA4BBB-24:59:59,J60/2,J300/2",
+ # Extreme months
+ "AAA4BBB,M12.1.1/2,M1.1.1/2",
+ "AAA4BBB,M1.1.1/2,M12.1.1/2",
+ # Extreme weeks
+ "AAA4BBB,M1.5.1/2,M1.1.1/2",
+ "AAA4BBB,M1.1.1/2,M1.5.1/2",
+ # Extreme weekday
+ "AAA4BBB,M1.1.6/2,M2.1.1/2",
+ "AAA4BBB,M1.1.1/2,M2.1.6/2",
+ # Extreme numeric offset
+ "AAA4BBB,0/2,20/2",
+ "AAA4BBB,0/2,0/14",
+ "AAA4BBB,20/2,365/2",
+ "AAA4BBB,365/2,365/14",
+ # Extreme julian offset
+ "AAA4BBB,J1/2,J20/2",
+ "AAA4BBB,J1/2,J1/14",
+ "AAA4BBB,J20/2,J365/2",
+ "AAA4BBB,J365/2,J365/14",
+ # Extreme transition hour
+ "AAA4BBB,J60/167,J300/2",
+ "AAA4BBB,J60/+167,J300/2",
+ "AAA4BBB,J60/-167,J300/2",
+ "AAA4BBB,J60/2,J300/167",
+ "AAA4BBB,J60/2,J300/+167",
+ "AAA4BBB,J60/2,J300/-167",
+ # Extreme transition minutes
+ "AAA4BBB,J60/2:00,J300/2",
+ "AAA4BBB,J60/2:59,J300/2",
+ "AAA4BBB,J60/2,J300/2:00",
+ "AAA4BBB,J60/2,J300/2:59",
+ # Extreme transition seconds
+ "AAA4BBB,J60/2:00:00,J300/2",
+ "AAA4BBB,J60/2:00:59,J300/2",
+ "AAA4BBB,J60/2,J300/2:00:00",
+ "AAA4BBB,J60/2,J300/2:00:59",
+ # Extreme total transition time
+ "AAA4BBB,J60/167:59:59,J300/2",
+ "AAA4BBB,J60/-167:59:59,J300/2",
+ "AAA4BBB,J60/2,J300/167:59:59",
+ "AAA4BBB,J60/2,J300/-167:59:59",
+ ]
+
+ for tzstr in tzstrs:
+ with self.subTest(tzstr=tzstr):
+ self.zone_from_tzstr(tzstr)
+
def test_invalid_tzstr(self):
invalid_tzstrs = [
"PST8PDT", # DST but no transition specified
@@ -1008,16 +1082,33 @@ class TZStrTest(ZoneInfoTestBase):
"GMT,M3.2.0/2,M11.1.0/3", # Transition rule but no DST
"GMT0+11,M3.2.0/2,M11.1.0/3", # Unquoted alphanumeric in DST
"PST8PDT,M3.2.0/2", # Only one transition rule
- # Invalid offsets
- "STD+25",
- "STD-25",
- "STD+374",
- "STD+374DST,M3.2.0/2,M11.1.0/3",
- "STD+23DST+25,M3.2.0/2,M11.1.0/3",
- "STD-23DST-25,M3.2.0/2,M11.1.0/3",
+ # Invalid offset hours
+ "AAA168",
+ "AAA+168",
+ "AAA-168",
+ "AAA168BBB,J60/2,J300/2",
+ "AAA+168BBB,J60/2,J300/2",
+ "AAA-168BBB,J60/2,J300/2",
+ "AAA4BBB168,J60/2,J300/2",
+ "AAA4BBB+168,J60/2,J300/2",
+ "AAA4BBB-168,J60/2,J300/2",
+ # Invalid offset minutes
+ "AAA4:0BBB,J60/2,J300/2",
+ "AAA4:100BBB,J60/2,J300/2",
+ "AAA4BBB5:0,J60/2,J300/2",
+ "AAA4BBB5:100,J60/2,J300/2",
+ # Invalid offset seconds
+ "AAA4:00:0BBB,J60/2,J300/2",
+ "AAA4:00:100BBB,J60/2,J300/2",
+ "AAA4BBB5:00:0,J60/2,J300/2",
+ "AAA4BBB5:00:100,J60/2,J300/2",
# Completely invalid dates
"AAA4BBB,M1443339,M11.1.0/3",
"AAA4BBB,M3.2.0/2,0349309483959c",
+ "AAA4BBB,,J300/2",
+ "AAA4BBB,z,J300/2",
+ "AAA4BBB,J60/2,",
+ "AAA4BBB,J60/2,z",
# Invalid months
"AAA4BBB,M13.1.1/2,M1.1.1/2",
"AAA4BBB,M1.1.1/2,M13.1.1/2",
@@ -1037,6 +1128,26 @@ class TZStrTest(ZoneInfoTestBase):
# Invalid julian offset
"AAA4BBB,J0/2,J20/2",
"AAA4BBB,J20/2,J366/2",
+ # Invalid transition time
+ "AAA4BBB,J60/2/3,J300/2",
+ "AAA4BBB,J60/2,J300/2/3",
+ # Invalid transition hour
+ "AAA4BBB,J60/168,J300/2",
+ "AAA4BBB,J60/+168,J300/2",
+ "AAA4BBB,J60/-168,J300/2",
+ "AAA4BBB,J60/2,J300/168",
+ "AAA4BBB,J60/2,J300/+168",
+ "AAA4BBB,J60/2,J300/-168",
+ # Invalid transition minutes
+ "AAA4BBB,J60/2:0,J300/2",
+ "AAA4BBB,J60/2:100,J300/2",
+ "AAA4BBB,J60/2,J300/2:0",
+ "AAA4BBB,J60/2,J300/2:100",
+ # Invalid transition seconds
+ "AAA4BBB,J60/2:00:0,J300/2",
+ "AAA4BBB,J60/2:00:100,J300/2",
+ "AAA4BBB,J60/2,J300/2:00:0",
+ "AAA4BBB,J60/2,J300/2:00:100",
]
for invalid_tzstr in invalid_tzstrs: