/Lib/test/test_cpickle.py

http://unladen-swallow.googlecode.com/ · Python · 141 lines · 126 code · 13 blank · 2 comment · 0 complexity · 7b99ae1db4819f71b3e21b280581dda3 MD5 · raw file

  1. import cPickle, unittest
  2. from cStringIO import StringIO
  3. from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
  4. from test.pickletester import AbstractPicklerUnpicklerObjectTests
  5. from test import test_support
  6. class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
  7. def setUp(self):
  8. self.dumps = cPickle.dumps
  9. self.loads = cPickle.loads
  10. self.load = cPickle.load
  11. self.dump = cPickle.dump
  12. error = cPickle.BadPickleGet
  13. module = cPickle
  14. class cPickleAbstractPicklerTests(AbstractPickleTests):
  15. """Common methods for TestCase classes testing cPickle.Pickler variants."""
  16. error = cPickle.BadPickleGet
  17. def loads(self, buf):
  18. f = StringIO(buf)
  19. p = cPickle.Unpickler(f)
  20. return p.load()
  21. def load(self, buf):
  22. p = cPickle.Unpickler(buf)
  23. return p.load()
  24. class cPickleFilePicklerTests(cPickleAbstractPicklerTests):
  25. """Test pickling to a file"""
  26. def dumps(self, arg, proto=0):
  27. f = StringIO()
  28. p = cPickle.Pickler(f, proto)
  29. p.dump(arg)
  30. f.seek(0)
  31. return f.read()
  32. class cPickleInternalBufferPicklerTests(cPickleAbstractPicklerTests):
  33. """Test pickling to the Pickler's internal buffer."""
  34. def dumps(self, arg, proto=0):
  35. p = cPickle.Pickler(proto)
  36. p.dump(arg)
  37. return p.getvalue()
  38. class cPickleFastPicklerTests(cPickleAbstractPicklerTests):
  39. """Test pickling in fast mode (ie, no recursive data structures)."""
  40. def dumps(self, arg, proto=0):
  41. f = StringIO()
  42. p = cPickle.Pickler(f, proto)
  43. p.fast = True
  44. p.dump(arg)
  45. f.seek(0)
  46. return f.read()
  47. def test_recursive_list(self):
  48. self.assertRaises(ValueError,
  49. AbstractPickleTests.test_recursive_list,
  50. self)
  51. def test_recursive_tuple(self):
  52. self.assertRaises(ValueError,
  53. AbstractPickleTests.test_recursive_tuple,
  54. self)
  55. def test_recursive_inst(self):
  56. self.assertRaises(ValueError,
  57. AbstractPickleTests.test_recursive_inst,
  58. self)
  59. def test_recursive_dict(self):
  60. self.assertRaises(ValueError,
  61. AbstractPickleTests.test_recursive_dict,
  62. self)
  63. def test_recursive_multi(self):
  64. self.assertRaises(ValueError,
  65. AbstractPickleTests.test_recursive_multi,
  66. self)
  67. def test_nonrecursive_deep(self):
  68. # If it's not cyclic, it should pickle OK even if the nesting
  69. # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
  70. # 50 today. Jack Jansen reported stack overflow on Mac OS 9
  71. # at 64.
  72. a = []
  73. for i in range(60):
  74. a = [a]
  75. b = self.loads(self.dumps(a))
  76. self.assertEqual(a, b)
  77. class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
  78. pickler_class = cPickle.Pickler
  79. unpickler_class = cPickle.Unpickler
  80. class Node(object):
  81. pass
  82. class cPickleDeepRecursive(unittest.TestCase):
  83. def test_issue2702(self):
  84. # This should raise a RecursionLimit but in some
  85. # platforms (FreeBSD, win32) sometimes raises KeyError instead,
  86. # or just silently terminates the interpreter (=crashes).
  87. nodes = [Node() for i in range(500)]
  88. for n in nodes:
  89. n.connections = list(nodes)
  90. n.connections.remove(n)
  91. self.assertRaises(RuntimeError, cPickle.dumps, n)
  92. def test_issue3179(self):
  93. # Safe test, because I broke this case when fixing the
  94. # behaviour for the previous test.
  95. res=[]
  96. for x in range(1,2000):
  97. res.append(dict(doc=x, similar=[]))
  98. cPickle.dumps(res)
  99. def test_main():
  100. test_support.run_unittest(
  101. cPickleTests,
  102. cPickleFilePicklerTests,
  103. cPickleInternalBufferPicklerTests,
  104. cPickleFastPicklerTests,
  105. cPickleDeepRecursive,
  106. cPicklePicklerUnpicklerObjectTests,
  107. )
  108. if __name__ == "__main__":
  109. test_main()