blob: bbe6875545a7c2b4940e93add1c1929caf6937c1 [file] [log] [blame]
Serhiy Storchaka05dadcf2014-12-16 18:00:56 +02001import struct
Christian Heimes126d29a2008-02-11 22:57:17 +00002import pickle
Tim Peters8ecfc8e2003-01-27 18:51:48 +00003import pickletools
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Christian Heimes126d29a2008-02-11 22:57:17 +00005from test.pickletester import AbstractPickleTests
6from test.pickletester import AbstractPickleModuleTests
7
8class OptimizedPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
9
Guido van Rossumf4169812008-03-17 22:56:06 +000010 def dumps(self, arg, proto=None):
Christian Heimes126d29a2008-02-11 22:57:17 +000011 return pickletools.optimize(pickle.dumps(arg, proto))
12
Alexander Belopolsky1ce92dc2011-02-24 19:40:09 +000013 def loads(self, buf, **kwds):
14 return pickle.loads(buf, **kwds)
Christian Heimes126d29a2008-02-11 22:57:17 +000015
Antoine Pitroud9dfaa92009-06-04 20:32:06 +000016 # Test relies on precise output of dumps()
17 test_pickle_to_2x = None
18
Serhiy Storchaka05dadcf2014-12-16 18:00:56 +020019 def test_optimize_long_binget(self):
20 data = [str(i) for i in range(257)]
21 data.append(data[-1])
22 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
23 pickled = pickle.dumps(data, proto)
24 unpickled = pickle.loads(pickled)
25 self.assertEqual(unpickled, data)
26 self.assertIs(unpickled[-1], unpickled[-2])
27
28 pickled2 = pickletools.optimize(pickled)
29 unpickled2 = pickle.loads(pickled2)
30 self.assertEqual(unpickled2, data)
31 self.assertIs(unpickled2[-1], unpickled2[-2])
32 self.assertNotIn(pickle.LONG_BINGET, pickled2)
33 self.assertNotIn(pickle.LONG_BINPUT, pickled2)
34
35 def test_optimize_binput_and_memoize(self):
36 pickled = (b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00'
37 b']\x94(\x8c\x04spamq\x01\x8c\x03ham\x94h\x02e.')
38 # 0: \x80 PROTO 4
39 # 2: \x95 FRAME 21
40 # 11: ] EMPTY_LIST
41 # 12: \x94 MEMOIZE
42 # 13: ( MARK
43 # 14: \x8c SHORT_BINUNICODE 'spam'
44 # 20: q BINPUT 1
45 # 22: \x8c SHORT_BINUNICODE 'ham'
46 # 27: \x94 MEMOIZE
47 # 28: h BINGET 2
48 # 30: e APPENDS (MARK at 13)
49 # 31: . STOP
50 self.assertIn(pickle.BINPUT, pickled)
51 unpickled = pickle.loads(pickled)
52 self.assertEqual(unpickled, ['spam', 'ham', 'ham'])
53 self.assertIs(unpickled[1], unpickled[2])
54
55 pickled2 = pickletools.optimize(pickled)
56 unpickled2 = pickle.loads(pickled2)
57 self.assertEqual(unpickled2, ['spam', 'ham', 'ham'])
58 self.assertIs(unpickled2[1], unpickled2[2])
59 self.assertNotIn(pickle.BINPUT, pickled2)
60
Christian Heimes126d29a2008-02-11 22:57:17 +000061
62def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +000063 support.run_unittest(OptimizedPickleTests)
64 support.run_doctest(pickletools)
Christian Heimes126d29a2008-02-11 22:57:17 +000065
66
67if __name__ == "__main__":
68 test_main()