|
35 | 35 | import _strptime
|
36 | 36 | #
|
37 | 37 |
|
| 38 | +pickle_loads = {pickle.loads, pickle._loads} |
38 | 39 |
|
39 | 40 | pickle_choices = [(pickle, pickle, proto)
|
40 | 41 | for proto in range(pickle.HIGHEST_PROTOCOL + 1)]
|
@@ -1404,6 +1405,19 @@ def test_pickling(self):
|
1404 | 1405 | self.assertEqual(orig, derived)
|
1405 | 1406 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
1406 | 1407 |
|
| 1408 | + def test_compat_unpickle(self): |
| 1409 | + tests = [ |
| 1410 | + b"cdatetime\ndate\n(S'\\x07\\xdf\\x0b\\x1b'\ntR.", |
| 1411 | + b'cdatetime\ndate\n(U\x04\x07\xdf\x0b\x1btR.', |
| 1412 | + b'\x80\x02cdatetime\ndate\nU\x04\x07\xdf\x0b\x1b\x85R.', |
| 1413 | + ] |
| 1414 | + args = 2015, 11, 27 |
| 1415 | + expected = self.theclass(*args) |
| 1416 | + for data in tests: |
| 1417 | + for loads in pickle_loads: |
| 1418 | + derived = loads(data, encoding='latin1') |
| 1419 | + self.assertEqual(derived, expected) |
| 1420 | + |
1407 | 1421 | def test_compare(self):
|
1408 | 1422 | t1 = self.theclass(2, 3, 4)
|
1409 | 1423 | t2 = self.theclass(2, 3, 4)
|
@@ -1930,6 +1944,24 @@ def test_pickling_subclass_datetime(self):
|
1930 | 1944 | derived = unpickler.loads(green)
|
1931 | 1945 | self.assertEqual(orig, derived)
|
1932 | 1946 |
|
| 1947 | + def test_compat_unpickle(self): |
| 1948 | + tests = [ |
| 1949 | + b'cdatetime\ndatetime\n(' |
| 1950 | + b"S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x00\\x10\\x00'\ntR.", |
| 1951 | + |
| 1952 | + b'cdatetime\ndatetime\n(' |
| 1953 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00tR.', |
| 1954 | + |
| 1955 | + b'\x80\x02cdatetime\ndatetime\n' |
| 1956 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x00\x10\x00\x85R.', |
| 1957 | + ] |
| 1958 | + args = 2015, 11, 27, 20, 59, 1, 64**2 |
| 1959 | + expected = self.theclass(*args) |
| 1960 | + for data in tests: |
| 1961 | + for loads in pickle_loads: |
| 1962 | + derived = loads(data, encoding='latin1') |
| 1963 | + self.assertEqual(derived, expected) |
| 1964 | + |
1933 | 1965 | def test_more_compare(self):
|
1934 | 1966 | # The test_compare() inherited from TestDate covers the error cases.
|
1935 | 1967 | # We just want to test lexicographic ordering on the members datetime
|
@@ -2609,6 +2641,19 @@ def test_pickling_subclass_time(self):
|
2609 | 2641 | derived = unpickler.loads(green)
|
2610 | 2642 | self.assertEqual(orig, derived)
|
2611 | 2643 |
|
| 2644 | + def test_compat_unpickle(self): |
| 2645 | + tests = [ |
| 2646 | + b"cdatetime\ntime\n(S'\\x14;\\x10\\x00\\x10\\x00'\ntR.", |
| 2647 | + b'cdatetime\ntime\n(U\x06\x14;\x10\x00\x10\x00tR.', |
| 2648 | + b'\x80\x02cdatetime\ntime\nU\x06\x14;\x10\x00\x10\x00\x85R.', |
| 2649 | + ] |
| 2650 | + args = 20, 59, 16, 64**2 |
| 2651 | + expected = self.theclass(*args) |
| 2652 | + for data in tests: |
| 2653 | + for loads in pickle_loads: |
| 2654 | + derived = loads(data, encoding='latin1') |
| 2655 | + self.assertEqual(derived, expected) |
| 2656 | + |
2612 | 2657 | def test_bool(self):
|
2613 | 2658 | # time is always True.
|
2614 | 2659 | cls = self.theclass
|
@@ -2981,6 +3026,40 @@ def test_pickling(self):
|
2981 | 3026 | self.assertEqual(derived.tzname(), 'cookie')
|
2982 | 3027 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
2983 | 3028 |
|
| 3029 | + def test_compat_unpickle(self): |
| 3030 | + tests = [ |
| 3031 | + b"cdatetime\ntime\n(S'\\x05\\x06\\x07\\x01\\xe2@'\n" |
| 3032 | + b"ctest.datetimetester\nPicklableFixedOffset\n(tR" |
| 3033 | + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" |
| 3034 | + b"(I-1\nI68400\nI0\ntRs" |
| 3035 | + b"S'_FixedOffset__dstoffset'\nNs" |
| 3036 | + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", |
| 3037 | + |
| 3038 | + b'cdatetime\ntime\n(U\x06\x05\x06\x07\x01\xe2@' |
| 3039 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3040 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3041 | + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' |
| 3042 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3043 | + b'U\x12_FixedOffset__nameU\x06cookieubtR.', |
| 3044 | + |
| 3045 | + b'\x80\x02cdatetime\ntime\nU\x06\x05\x06\x07\x01\xe2@' |
| 3046 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3047 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3048 | + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' |
| 3049 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3050 | + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', |
| 3051 | + ] |
| 3052 | + |
| 3053 | + tinfo = PicklableFixedOffset(-300, 'cookie') |
| 3054 | + expected = self.theclass(5, 6, 7, 123456, tzinfo=tinfo) |
| 3055 | + for data in tests: |
| 3056 | + for loads in pickle_loads: |
| 3057 | + derived = loads(data, encoding='latin1') |
| 3058 | + self.assertEqual(derived, expected, repr(data)) |
| 3059 | + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) |
| 3060 | + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) |
| 3061 | + self.assertEqual(derived.tzname(), 'cookie') |
| 3062 | + |
2984 | 3063 | def test_more_bool(self):
|
2985 | 3064 | # time is always True.
|
2986 | 3065 | cls = self.theclass
|
@@ -3198,6 +3277,43 @@ def test_pickling(self):
|
3198 | 3277 | self.assertEqual(derived.tzname(), 'cookie')
|
3199 | 3278 | self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
|
3200 | 3279 |
|
| 3280 | + def test_compat_unpickle(self): |
| 3281 | + tests = [ |
| 3282 | + b'cdatetime\ndatetime\n' |
| 3283 | + b"(S'\\x07\\xdf\\x0b\\x1b\\x14;\\x01\\x01\\xe2@'\n" |
| 3284 | + b'ctest.datetimetester\nPicklableFixedOffset\n(tR' |
| 3285 | + b"(dS'_FixedOffset__offset'\ncdatetime\ntimedelta\n" |
| 3286 | + b'(I-1\nI68400\nI0\ntRs' |
| 3287 | + b"S'_FixedOffset__dstoffset'\nNs" |
| 3288 | + b"S'_FixedOffset__name'\nS'cookie'\nsbtR.", |
| 3289 | + |
| 3290 | + b'cdatetime\ndatetime\n' |
| 3291 | + b'(U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' |
| 3292 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3293 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3294 | + b'(J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00tR' |
| 3295 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3296 | + b'U\x12_FixedOffset__nameU\x06cookieubtR.', |
| 3297 | + |
| 3298 | + b'\x80\x02cdatetime\ndatetime\n' |
| 3299 | + b'U\n\x07\xdf\x0b\x1b\x14;\x01\x01\xe2@' |
| 3300 | + b'ctest.datetimetester\nPicklableFixedOffset\n)R' |
| 3301 | + b'}(U\x14_FixedOffset__offsetcdatetime\ntimedelta\n' |
| 3302 | + b'J\xff\xff\xff\xffJ0\x0b\x01\x00K\x00\x87R' |
| 3303 | + b'U\x17_FixedOffset__dstoffsetN' |
| 3304 | + b'U\x12_FixedOffset__nameU\x06cookieub\x86R.', |
| 3305 | + ] |
| 3306 | + args = 2015, 11, 27, 20, 59, 1, 123456 |
| 3307 | + tinfo = PicklableFixedOffset(-300, 'cookie') |
| 3308 | + expected = self.theclass(*args, **{'tzinfo': tinfo}) |
| 3309 | + for data in tests: |
| 3310 | + for loads in pickle_loads: |
| 3311 | + derived = loads(data, encoding='latin1') |
| 3312 | + self.assertEqual(derived, expected) |
| 3313 | + self.assertIsInstance(derived.tzinfo, PicklableFixedOffset) |
| 3314 | + self.assertEqual(derived.utcoffset(), timedelta(minutes=-300)) |
| 3315 | + self.assertEqual(derived.tzname(), 'cookie') |
| 3316 | + |
3201 | 3317 | def test_extreme_hashes(self):
|
3202 | 3318 | # If an attempt is made to hash these via subtracting the offset
|
3203 | 3319 | # then hashing a datetime object, OverflowError results. The
|
|
0 commit comments