[3.7] bpo-22005: Fixed unpickling instances of datetime classes pickl… · python/cpython@0d5730e (original) (raw)

`@@ -38,6 +38,7 @@

`

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

`