diff options
author | Alexey Izbyshev <izbyshev@ispras.ru> | 2018-10-23 06:36:08 (GMT) |
---|---|---|
committer | Tal Einat <taleinat+github@gmail.com> | 2018-10-23 06:36:08 (GMT) |
commit | 3b0047d8e982b10b34ab05fd207b7d513cc1188a (patch) | |
tree | 1210f2857e7f9c16b9c0d64135ceb39e5adcc378 /Lib/test/datetimetester.py | |
parent | 83a07652e0033f0d9994ae7634b91d6581c56b00 (diff) | |
download | cpython-3b0047d8e982b10b34ab05fd207b7d513cc1188a.zip cpython-3b0047d8e982b10b34ab05fd207b7d513cc1188a.tar.gz cpython-3b0047d8e982b10b34ab05fd207b7d513cc1188a.tar.bz2 |
bpo-34482: test datetime classes' handling of non-UTF-8-encodable strings (GH-8878)
Diffstat (limited to 'Lib/test/datetimetester.py')
-rw-r--r-- | Lib/test/datetimetester.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 122f6b5..06fe647 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -303,6 +303,8 @@ class TestTimeZone(unittest.TestCase): self.assertEqual('UTC+09:30', timezone(9.5 * HOUR).tzname(None)) self.assertEqual('UTC-00:01', timezone(timedelta(minutes=-1)).tzname(None)) self.assertEqual('XYZ', timezone(-5 * HOUR, 'XYZ').tzname(None)) + # bpo-34482: Check that surrogates are handled properly. + self.assertEqual('\ud800', timezone(ZERO, '\ud800').tzname(None)) # Sub-minute offsets: self.assertEqual('UTC+01:06:40', timezone(timedelta(0, 4000)).tzname(None)) @@ -1308,6 +1310,12 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase): except ValueError: pass + # bpo-34482: Check that surrogates don't cause a crash. + try: + t.strftime('%y\ud800%m') + except UnicodeEncodeError: + pass + #check that this standard extension works t.strftime("%f") @@ -1747,6 +1755,9 @@ class TestDateTime(TestDate): self.assertEqual(t.isoformat('T'), "0001-02-03T04:05:01.000123") self.assertEqual(t.isoformat(' '), "0001-02-03 04:05:01.000123") self.assertEqual(t.isoformat('\x00'), "0001-02-03\x0004:05:01.000123") + # bpo-34482: Check that surrogates are handled properly. + self.assertEqual(t.isoformat('\ud800'), + "0001-02-03\ud80004:05:01.000123") self.assertEqual(t.isoformat(timespec='hours'), "0001-02-03T04") self.assertEqual(t.isoformat(timespec='minutes'), "0001-02-03T04:05") self.assertEqual(t.isoformat(timespec='seconds'), "0001-02-03T04:05:01") @@ -1755,6 +1766,8 @@ class TestDateTime(TestDate): self.assertEqual(t.isoformat(timespec='auto'), "0001-02-03T04:05:01.000123") self.assertEqual(t.isoformat(sep=' ', timespec='minutes'), "0001-02-03 04:05") self.assertRaises(ValueError, t.isoformat, timespec='foo') + # bpo-34482: Check that surrogates are handled properly. + self.assertRaises(ValueError, t.isoformat, timespec='\ud800') # str is ISO format with the separator forced to a blank. self.assertEqual(str(t), "0001-02-03 04:05:01.000123") @@ -2286,6 +2299,19 @@ class TestDateTime(TestDate): self.assertIs(type(expected), self.theclass) self.assertIs(type(got), self.theclass) + # bpo-34482: Check that surrogates are handled properly. + inputs = [ + ('2004-12-01\ud80013:02:47.197', '%Y-%m-%d\ud800%H:%M:%S.%f'), + ('2004\ud80012-01 13:02:47.197', '%Y\ud800%m-%d %H:%M:%S.%f'), + ('2004-12-01 13:02\ud80047.197', '%Y-%m-%d %H:%M\ud800%S.%f'), + ] + for string, format in inputs: + with self.subTest(string=string, format=format): + expected = _strptime._strptime_datetime(self.theclass, string, + format) + got = self.theclass.strptime(string, format) + self.assertEqual(expected, got) + strptime = self.theclass.strptime self.assertEqual(strptime("+0002", "%z").utcoffset(), 2 * MINUTE) self.assertEqual(strptime("-0002", "%z").utcoffset(), -2 * MINUTE) @@ -2353,6 +2379,12 @@ class TestDateTime(TestDate): t = t.replace(tzinfo=tz) self.assertEqual(t.strftime("%z"), "-0200" + z) + # bpo-34482: Check that surrogates don't cause a crash. + try: + t.strftime('%y\ud800%m %H\ud800%M') + except UnicodeEncodeError: + pass + def test_extract(self): dt = self.theclass(2002, 3, 4, 18, 45, 3, 1234) self.assertEqual(dt.date(), date(2002, 3, 4)) @@ -2878,6 +2910,8 @@ class TestTime(HarmlessMixedComparison, unittest.TestCase): self.assertEqual(t.isoformat(timespec='microseconds'), "12:34:56.123456") self.assertEqual(t.isoformat(timespec='auto'), "12:34:56.123456") self.assertRaises(ValueError, t.isoformat, timespec='monkey') + # bpo-34482: Check that surrogates are handled properly. + self.assertRaises(ValueError, t.isoformat, timespec='\ud800') t = self.theclass(hour=12, minute=34, second=56, microsecond=999500) self.assertEqual(t.isoformat(timespec='milliseconds'), "12:34:56.999") @@ -2928,6 +2962,12 @@ class TestTime(HarmlessMixedComparison, unittest.TestCase): # A naive object replaces %z and %Z with empty strings. self.assertEqual(t.strftime("'%z' '%Z'"), "'' ''") + # bpo-34482: Check that surrogates don't cause a crash. + try: + t.strftime('%H\ud800%M') + except UnicodeEncodeError: + pass + def test_format(self): t = self.theclass(1, 2, 3, 4) self.assertEqual(t.__format__(''), str(t)) |