blob: c240669873a1a5734a00fcd78cf1151d249df0e2 [file] [log] [blame]
Facundo Batista9da18b32008-06-22 23:19:14 +00001import cPickle, unittest
Jeremy Hylton66426532001-10-15 21:38:56 +00002from cStringIO import StringIO
Neal Norwitzcdb79482006-03-24 08:58:38 +00003from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
Collin Winterf8089c72009-04-09 16:46:46 +00004from test.pickletester import AbstractPicklerUnpicklerObjectTests
Barry Warsaw04f357c2002-07-23 19:04:11 +00005from test import test_support
Jeremy Hylton66426532001-10-15 21:38:56 +00006
7class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
Tim Peterse0c446b2001-10-18 21:57:37 +00008
Jeremy Hylton66426532001-10-15 21:38:56 +00009 def setUp(self):
10 self.dumps = cPickle.dumps
11 self.loads = cPickle.loads
12
13 error = cPickle.BadPickleGet
14 module = cPickle
15
16class cPicklePicklerTests(AbstractPickleTests):
17
Tim Petersdcaa24e2003-01-28 22:26:28 +000018 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000019 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000020 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000021 p.dump(arg)
22 f.seek(0)
23 return f.read()
24
25 def loads(self, buf):
26 f = StringIO(buf)
27 p = cPickle.Unpickler(f)
28 return p.load()
29
30 error = cPickle.BadPickleGet
31
32class cPickleListPicklerTests(AbstractPickleTests):
33
Tim Petersdcaa24e2003-01-28 22:26:28 +000034 def dumps(self, arg, proto=0):
35 p = cPickle.Pickler(proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000036 p.dump(arg)
37 return p.getvalue()
38
39 def loads(self, *args):
40 f = StringIO(args[0])
41 p = cPickle.Unpickler(f)
42 return p.load()
43
44 error = cPickle.BadPickleGet
45
46class cPickleFastPicklerTests(AbstractPickleTests):
47
Tim Petersdcaa24e2003-01-28 22:26:28 +000048 def dumps(self, arg, proto=0):
Jeremy Hylton66426532001-10-15 21:38:56 +000049 f = StringIO()
Tim Petersdcaa24e2003-01-28 22:26:28 +000050 p = cPickle.Pickler(f, proto)
Jeremy Hylton66426532001-10-15 21:38:56 +000051 p.fast = 1
52 p.dump(arg)
53 f.seek(0)
54 return f.read()
55
56 def loads(self, *args):
57 f = StringIO(args[0])
58 p = cPickle.Unpickler(f)
59 return p.load()
60
61 error = cPickle.BadPickleGet
62
63 def test_recursive_list(self):
64 self.assertRaises(ValueError,
65 AbstractPickleTests.test_recursive_list,
66 self)
67
Collin Winter57bef682009-05-26 04:12:39 +000068 def test_recursive_tuple(self):
69 self.assertRaises(ValueError,
70 AbstractPickleTests.test_recursive_tuple,
71 self)
72
Jeremy Hylton66426532001-10-15 21:38:56 +000073 def test_recursive_inst(self):
74 self.assertRaises(ValueError,
75 AbstractPickleTests.test_recursive_inst,
76 self)
77
78 def test_recursive_dict(self):
79 self.assertRaises(ValueError,
80 AbstractPickleTests.test_recursive_dict,
81 self)
82
83 def test_recursive_multi(self):
84 self.assertRaises(ValueError,
85 AbstractPickleTests.test_recursive_multi,
86 self)
87
Barry Warsaw52acb492001-12-21 20:04:22 +000088 def test_nonrecursive_deep(self):
Tim Peters7107a7f2003-02-21 20:14:35 +000089 # If it's not cyclic, it should pickle OK even if the nesting
90 # depth exceeds PY_CPICKLE_FAST_LIMIT. That happens to be
91 # 50 today. Jack Jansen reported stack overflow on Mac OS 9
92 # at 64.
Barry Warsaw52acb492001-12-21 20:04:22 +000093 a = []
Tim Peters7107a7f2003-02-21 20:14:35 +000094 for i in range(60):
Barry Warsaw52acb492001-12-21 20:04:22 +000095 a = [a]
96 b = self.loads(self.dumps(a))
97 self.assertEqual(a, b)
98
Collin Winterf8089c72009-04-09 16:46:46 +000099class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
100
101 pickler_class = cPickle.Pickler
102 unpickler_class = cPickle.Unpickler
103
104
Facundo Batista9da18b32008-06-22 23:19:14 +0000105class Node(object):
106 pass
107
108class cPickleDeepRecursive(unittest.TestCase):
Facundo Batista763d3092008-06-30 01:10:55 +0000109 def test_issue2702(self):
110 # This should raise a RecursionLimit but in some
111 # platforms (FreeBSD, win32) sometimes raises KeyError instead,
112 # or just silently terminates the interpreter (=crashes).
113 nodes = [Node() for i in range(500)]
114 for n in nodes:
115 n.connections = list(nodes)
116 n.connections.remove(n)
Benjamin Peterson704dc262009-03-22 22:24:58 +0000117 self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
Facundo Batista68dc0522008-06-25 19:24:53 +0000118
119 def test_issue3179(self):
Facundo Batista763d3092008-06-30 01:10:55 +0000120 # Safe test, because I broke this case when fixing the
121 # behaviour for the previous test.
Facundo Batista68dc0522008-06-25 19:24:53 +0000122 res=[]
123 for x in range(1,2000):
124 res.append(dict(doc=x, similar=[]))
125 cPickle.dumps(res)
126
Facundo Batista9da18b32008-06-22 23:19:14 +0000127
Fred Drake694ed092001-12-19 16:42:15 +0000128def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000129 test_support.run_unittest(
130 cPickleTests,
131 cPicklePicklerTests,
132 cPickleListPicklerTests,
Facundo Batista9da18b32008-06-22 23:19:14 +0000133 cPickleFastPicklerTests,
134 cPickleDeepRecursive,
Collin Winterf8089c72009-04-09 16:46:46 +0000135 cPicklePicklerUnpicklerObjectTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000136 )
Fred Drake694ed092001-12-19 16:42:15 +0000137
Jeremy Hylton66426532001-10-15 21:38:56 +0000138if __name__ == "__main__":
Fred Drake694ed092001-12-19 16:42:15 +0000139 test_main()