blob: 8cc6ca58cd04b43f793793054d99a2b87db4aafd [file] [log] [blame]
Christian Heimes126d29a2008-02-11 22:57:17 +00001import pickle
Tim Peters8ecfc8e2003-01-27 18:51:48 +00002import pickletools
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
Christian Heimes126d29a2008-02-11 22:57:17 +00004from test.pickletester import AbstractPickleTests
Martin Panter19e69c52015-11-14 12:46:42 +00005import unittest
Christian Heimes126d29a2008-02-11 22:57:17 +00006
Serhiy Storchaka65452562017-11-15 14:01:08 +02007class OptimizedPickleTests(AbstractPickleTests):
Christian Heimes126d29a2008-02-11 22:57:17 +00008
Antoine Pitrou91f43802019-05-26 17:10:09 +02009 def dumps(self, arg, proto=None, **kwargs):
10 return pickletools.optimize(pickle.dumps(arg, proto, **kwargs))
Christian Heimes126d29a2008-02-11 22:57:17 +000011
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000012 def loads(self, buf, **kwds):
13 return pickle.loads(buf, **kwds)
Christian Heimes126d29a2008-02-11 22:57:17 +000014
Antoine Pitroud9dfaa92009-06-04 20:32:06 +000015 # Test relies on precise output of dumps()
16 test_pickle_to_2x = None
17
Olivier Grisel3cd7c6e2018-01-06 16:18:54 +010018 # Test relies on writing by chunks into a file object.
19 test_framed_write_sizes_with_delayed_writer = None
20
Serhiy Storchaka05dadcf2014-12-16 18:00:56 +020021 def test_optimize_long_binget(self):
22 data = [str(i) for i in range(257)]
23 data.append(data[-1])
24 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
25 pickled = pickle.dumps(data, proto)
26 unpickled = pickle.loads(pickled)
27 self.assertEqual(unpickled, data)
28 self.assertIs(unpickled[-1], unpickled[-2])
29
30 pickled2 = pickletools.optimize(pickled)
31 unpickled2 = pickle.loads(pickled2)
32 self.assertEqual(unpickled2, data)
33 self.assertIs(unpickled2[-1], unpickled2[-2])
34 self.assertNotIn(pickle.LONG_BINGET, pickled2)
35 self.assertNotIn(pickle.LONG_BINPUT, pickled2)
36
37 def test_optimize_binput_and_memoize(self):
38 pickled = (b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00'
39 b']\x94(\x8c\x04spamq\x01\x8c\x03ham\x94h\x02e.')
40 # 0: \x80 PROTO 4
41 # 2: \x95 FRAME 21
42 # 11: ] EMPTY_LIST
43 # 12: \x94 MEMOIZE
44 # 13: ( MARK
45 # 14: \x8c SHORT_BINUNICODE 'spam'
46 # 20: q BINPUT 1
47 # 22: \x8c SHORT_BINUNICODE 'ham'
48 # 27: \x94 MEMOIZE
49 # 28: h BINGET 2
50 # 30: e APPENDS (MARK at 13)
51 # 31: . STOP
52 self.assertIn(pickle.BINPUT, pickled)
53 unpickled = pickle.loads(pickled)
54 self.assertEqual(unpickled, ['spam', 'ham', 'ham'])
55 self.assertIs(unpickled[1], unpickled[2])
56
57 pickled2 = pickletools.optimize(pickled)
58 unpickled2 = pickle.loads(pickled2)
59 self.assertEqual(unpickled2, ['spam', 'ham', 'ham'])
60 self.assertIs(unpickled2[1], unpickled2[2])
61 self.assertNotIn(pickle.BINPUT, pickled2)
62
Christian Heimes126d29a2008-02-11 22:57:17 +000063
Martin Panter19e69c52015-11-14 12:46:42 +000064class MiscTestCase(unittest.TestCase):
65 def test__all__(self):
66 blacklist = {'bytes_types',
67 'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
68 'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
69 'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
70 'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
71 'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
72 'read_stringnl_noescape_pair', 'read_string1',
73 'read_string4', 'read_bytes1', 'read_bytes4',
Antoine Pitrou91f43802019-05-26 17:10:09 +020074 'read_bytes8', 'read_bytearray8', 'read_unicodestringnl',
Martin Panter19e69c52015-11-14 12:46:42 +000075 'read_unicodestring1', 'read_unicodestring4',
76 'read_unicodestring8', 'read_decimalnl_short',
77 'read_decimalnl_long', 'read_floatnl', 'read_float8',
78 'read_long1', 'read_long4',
79 'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
80 'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
Antoine Pitrou91f43802019-05-26 17:10:09 +020081 'string4', 'bytes1', 'bytes4', 'bytes8', 'bytearray8',
Martin Panter19e69c52015-11-14 12:46:42 +000082 'unicodestringnl', 'unicodestring1', 'unicodestring4',
83 'unicodestring8', 'decimalnl_short', 'decimalnl_long',
84 'floatnl', 'float8', 'long1', 'long4',
85 'StackObject',
86 'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
Antoine Pitrou91f43802019-05-26 17:10:09 +020087 'pybytes_or_str', 'pystring', 'pybytes', 'pybytearray',
88 'pyunicode', 'pynone', 'pytuple', 'pylist', 'pydict',
89 'pyset', 'pyfrozenset', 'pybuffer', 'anyobject',
90 'markobject', 'stackslice', 'OpcodeInfo', 'opcodes',
91 'code2op',
Martin Panter19e69c52015-11-14 12:46:42 +000092 }
93 support.check__all__(self, pickletools, blacklist=blacklist)
94
95
Christian Heimes126d29a2008-02-11 22:57:17 +000096def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +000097 support.run_unittest(OptimizedPickleTests)
Martin Panter19e69c52015-11-14 12:46:42 +000098 support.run_unittest(MiscTestCase)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000099 support.run_doctest(pickletools)
Christian Heimes126d29a2008-02-11 22:57:17 +0000100
101
102if __name__ == "__main__":
103 test_main()