|
38 | 38 | import _strptime
|
39 | 39 | #
|
40 | 40 |
|
| 41 | +pickle_loads = {pickle.loads, pickle._loads} |
41 | 42 |
|
42 | 43 | pickle_choices = [(pickle, pickle, proto)
|
43 | 44 | for proto in range(pickle.HIGHEST_PROTOCOL + 1)]
|
@@ -1434,6 +1435,19 @@ def test_pickling(self):
|
1434 | 1435 | self.assertEqual(orig, derived)
|
1435 | 1436 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
1436 | 1437 |
|
| 1438 | + def test_compat_unpickle(self): |
| 1439 | + tests = [ |
| 1440 | + b"cdatetime\ndate\n(S'\\x07\\xdf\\x0b\\x1b'\ntR.", |
| 1441 | + b'cdatetime\ndate\n(U\x04\x07\xdf\x0b\x1btR.', |
| 1442 | + b'\x80\x02cdatetime\ndate\nU\x04\x07\xdf\x0b\x1b\x85R.', |
| 1443 | + ] |
| 1444 | + args = 2015, 11, 27 |
| 1445 | + expected = self.theclass(*args) |
| 1446 | + for data in tests: |
| 1447 | + for loads in pickle_loads: |
| 1448 | + derived = loads(data, encoding='latin1') |
| 1449 | + self.assertEqual(derived, expected) |
| 1450 | + |
1437 | 1451 | def test_compare(self):
|
1438 | 1452 | t1 = self.theclass(2, 3, 4)
|
1439 | 1453 | t2 = self.theclass(2, 3, 4)
|
@@ -2098,6 +2112,24 @@ def test_pickling_subclass_datetime(self):
|
2098 | 2112 | derived = unpickler.loads(green)
|
2099 | 2113 | self.assertEqual(orig, derived)
|
2100 | 2114 |
|
| 2115 | + def test_compat_unpickle(self): |
| 2116 | + tests = [ |
| 2117 | + b'cdatetime\ndatetime\n(' |
| 2118 | + b"S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x00\\x10\\x00'\ntR.", |
| 2119 | + |
| 2120 | + b'cdatetime\ndatetime\n(' |
| 2121 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00tR.', |
| 2122 | + |
| 2123 | + b'\x80\x02cdatetime\ndatetime\n' |
| 2124 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00\x85R.', |
| 2125 | + ] |
| 2126 | + args = 2015, 11, 27, 20, 59, 1, 64**2 |
| 2127 | + expected = self.theclass(*args) |
| 2128 | + for data in tests: |
| 2129 | + for loads in pickle_loads: |
| 2130 | + derived = loads(data, encoding='latin1') |
| 2131 | + self.assertEqual(derived, expected) |
| 2132 | + |
2101 | 2133 | def test_more_compare(self):
|
2102 | 2134 | # The test_compare() inherited from TestDate covers the error cases.
|
2103 | 2135 | # We just want to test lexicographic ordering on the members datetime
|
@@ -3069,6 +3101,19 @@ def test_pickling_subclass_time(self):
|
3069 | 3101 | derived = unpickler.loads(green)
|
3070 | 3102 | self.assertEqual(orig, derived)
|
3071 | 3103 |
|
| 3104 | + def test_compat_unpickle(self): |
| 3105 | + tests = [ |
| 3106 | + b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.", |
| 3107 | + b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.', |
| 3108 | + b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.', |
| 3109 | + ] |
| 3110 | + args = 20, 59, 16, 64**2 |
| 3111 | + expected = self.theclass(*args) |
| 3112 | + for data in tests: |
| 3113 | + for loads in pickle_loads: |
| 3114 | + derived = loads(data, encoding='latin1') |
| 3115 | + self.assertEqual(derived, expected) |
| 3116 | + |
3072 | 3117 | def test_bool(self):
|
3073 | 3118 | # time is always True.
|
3074 | 3119 | cls = self.theclass
|
@@ -3441,6 +3486,40 @@ def test_pickling(self):
|
3441 | 3486 | self.assertEqual(derived.tzname(), 'cookie')
|
3442 | 3487 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
3443 | 3488 |
|
| 3489 | + def test_compat_unpickle(self): |
| 3490 | + tests = [ |
| 3491 | + b"cdatetime\ntime\n(S'\\x05\\x06\\x07\\x01\\xe2@'\n" |
| 3492 | + b"ctest.datetimetester\nPicklableFixedOffset\n(tR" |
| 3493 | + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" |
| 3494 | + b"(I-1\nI68400\nI0\ntRs" |
| 3495 | + b"S'_FixedOffset__dstoffset'\nNs" |
| 3496 | + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", |
| 3497 | + |
| 3498 | + b'cdatetime\ntime\n(U\x06\x05\x06\x07\x01\xe2@' |
| 3499 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3500 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3501 | + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' |
| 3502 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3503 | + b'U\x12_FixedOffset__nameU\x06cookieubtR.', |
| 3504 | + |
| 3505 | + b'\x80\x02cdatetime\ntime\nU\x06\x05\x06\x07\x01\xe2@' |
| 3506 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3507 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3508 | + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' |
| 3509 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3510 | + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', |
| 3511 | + ] |
| 3512 | + |
| 3513 | + tinfo = PicklableFixedOffset(-300, 'cookie') |
| 3514 | + expected = self.theclass(5, 6, 7, 123456, tzinfo=tinfo) |
| 3515 | + for data in tests: |
| 3516 | + for loads in pickle_loads: |
| 3517 | + derived = loads(data, encoding='latin1') |
| 3518 | + self.assertEqual(derived, expected, repr(data)) |
| 3519 | + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) |
| 3520 | + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) |
| 3521 | + self.assertEqual(derived.tzname(), 'cookie') |
| 3522 | + |
3444 | 3523 | def test_more_bool(self):
|
3445 | 3524 | # time is always True.
|
3446 | 3525 | cls = self.theclass
|
@@ -3789,6 +3868,43 @@ def test_pickling(self):
|
3789 | 3868 | self.assertEqual(derived.tzname(), 'cookie')
|
3790 | 3869 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
3791 | 3870 |
|
| 3871 | + def test_compat_unpickle(self): |
| 3872 | + tests = [ |
| 3873 | + b'cdatetime\ndatetime\n' |
| 3874 | + b"(S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x01\\xe2@'\n" |
| 3875 | + b'ctest.datetimetester\nPicklableFixedOffset\n(tR' |
| 3876 | + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" |
| 3877 | + b'(I-1\nI68400\nI0\ntRs' |
| 3878 | + b"S'_FixedOffset__dstoffset'\nNs" |
| 3879 | + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", |
| 3880 | + |
| 3881 | + b'cdatetime\ndatetime\n' |
| 3882 | + b'(U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' |
| 3883 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3884 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3885 | + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' |
| 3886 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3887 | + b'U\x12_FixedOffset__nameU\x06cookieubtR.', |
| 3888 | + |
| 3889 | + b'\x80\x02cdatetime\ndatetime\n' |
| 3890 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' |
| 3891 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3892 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3893 | + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' |
| 3894 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3895 | + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', |
| 3896 | + ] |
| 3897 | + args = 2015, 11, 27, 20, 59, 1, 123456 |
| 3898 | + tinfo = PicklableFixedOffset(-300, 'cookie') |
| 3899 | + expected = self.theclass(*args, **{'tzinfo': tinfo}) |
| 3900 | + for data in tests: |
| 3901 | + for loads in pickle_loads: |
| 3902 | + derived = loads(data, encoding='latin1') |
| 3903 | + self.assertEqual(derived, expected) |
| 3904 | + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) |
| 3905 | + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) |
| 3906 | + self.assertEqual(derived.tzname(), 'cookie') |
| 3907 | + |
3792 | 3908 | def test_extreme_hashes(self):
|
3793 | 3909 | # If an attempt is made to hash these via subtracting the offset
|
3794 | 3910 | # then hashing a datetime object, OverflowError results. The
|
|
0 commit comments