test_pickletools.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import pickle
  2. import pickletools
  3. from test import support
  4. from test.pickletester import AbstractPickleTests
  5. import doctest
  6. import unittest
  7. class OptimizedPickleTests(AbstractPickleTests, unittest.TestCase):
  8. def dumps(self, arg, proto=None, **kwargs):
  9. return pickletools.optimize(pickle.dumps(arg, proto, **kwargs))
  10. def loads(self, buf, **kwds):
  11. return pickle.loads(buf, **kwds)
  12. # Test relies on precise output of dumps()
  13. test_pickle_to_2x = None
  14. # Test relies on writing by chunks into a file object.
  15. test_framed_write_sizes_with_delayed_writer = None
  16. def test_optimize_long_binget(self):
  17. data = [str(i) for i in range(257)]
  18. data.append(data[-1])
  19. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  20. pickled = pickle.dumps(data, proto)
  21. unpickled = pickle.loads(pickled)
  22. self.assertEqual(unpickled, data)
  23. self.assertIs(unpickled[-1], unpickled[-2])
  24. pickled2 = pickletools.optimize(pickled)
  25. unpickled2 = pickle.loads(pickled2)
  26. self.assertEqual(unpickled2, data)
  27. self.assertIs(unpickled2[-1], unpickled2[-2])
  28. self.assertNotIn(pickle.LONG_BINGET, pickled2)
  29. self.assertNotIn(pickle.LONG_BINPUT, pickled2)
  30. def test_optimize_binput_and_memoize(self):
  31. pickled = (b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00'
  32. b']\x94(\x8c\x04spamq\x01\x8c\x03ham\x94h\x02e.')
  33. # 0: \x80 PROTO 4
  34. # 2: \x95 FRAME 21
  35. # 11: ] EMPTY_LIST
  36. # 12: \x94 MEMOIZE
  37. # 13: ( MARK
  38. # 14: \x8c SHORT_BINUNICODE 'spam'
  39. # 20: q BINPUT 1
  40. # 22: \x8c SHORT_BINUNICODE 'ham'
  41. # 27: \x94 MEMOIZE
  42. # 28: h BINGET 2
  43. # 30: e APPENDS (MARK at 13)
  44. # 31: . STOP
  45. self.assertIn(pickle.BINPUT, pickled)
  46. unpickled = pickle.loads(pickled)
  47. self.assertEqual(unpickled, ['spam', 'ham', 'ham'])
  48. self.assertIs(unpickled[1], unpickled[2])
  49. pickled2 = pickletools.optimize(pickled)
  50. unpickled2 = pickle.loads(pickled2)
  51. self.assertEqual(unpickled2, ['spam', 'ham', 'ham'])
  52. self.assertIs(unpickled2[1], unpickled2[2])
  53. self.assertNotIn(pickle.BINPUT, pickled2)
  54. class MiscTestCase(unittest.TestCase):
  55. def test__all__(self):
  56. not_exported = {
  57. 'bytes_types',
  58. 'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
  59. 'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
  60. 'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
  61. 'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
  62. 'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
  63. 'read_stringnl_noescape_pair', 'read_string1',
  64. 'read_string4', 'read_bytes1', 'read_bytes4',
  65. 'read_bytes8', 'read_bytearray8', 'read_unicodestringnl',
  66. 'read_unicodestring1', 'read_unicodestring4',
  67. 'read_unicodestring8', 'read_decimalnl_short',
  68. 'read_decimalnl_long', 'read_floatnl', 'read_float8',
  69. 'read_long1', 'read_long4',
  70. 'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
  71. 'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
  72. 'string4', 'bytes1', 'bytes4', 'bytes8', 'bytearray8',
  73. 'unicodestringnl', 'unicodestring1', 'unicodestring4',
  74. 'unicodestring8', 'decimalnl_short', 'decimalnl_long',
  75. 'floatnl', 'float8', 'long1', 'long4',
  76. 'StackObject',
  77. 'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
  78. 'pybytes_or_str', 'pystring', 'pybytes', 'pybytearray',
  79. 'pyunicode', 'pynone', 'pytuple', 'pylist', 'pydict',
  80. 'pyset', 'pyfrozenset', 'pybuffer', 'anyobject',
  81. 'markobject', 'stackslice', 'OpcodeInfo', 'opcodes',
  82. 'code2op',
  83. }
  84. support.check__all__(self, pickletools, not_exported=not_exported)
  85. def load_tests(loader, tests, pattern):
  86. tests.addTest(doctest.DocTestSuite(pickletools))
  87. return tests
  88. if __name__ == "__main__":
  89. unittest.main()