annotate Lib/test/json_tests/test_recursion.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 18a192ae6db9
children 7517add4aec9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
1 from test.json_tests import PyTest, CTest
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
3
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
4 class JSONTestObject:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
5 pass
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
6
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
7
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
8 class TestRecursion:
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
9 def test_listrecursion(self):
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
10 x = []
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
11 x.append(x)
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
12 try:
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
13 self.dumps(x)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
14 except ValueError:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
15 pass
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
16 else:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
17 self.fail("didn't raise ValueError on list recursion")
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
18 x = []
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
19 y = [x]
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
20 x.append(y)
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
21 try:
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
22 self.dumps(x)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
23 except ValueError:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
24 pass
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
25 else:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
26 self.fail("didn't raise ValueError on alternating list recursion")
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
27 y = []
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
28 x = [y, y]
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
29 # ensure that the marker is cleared
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
30 self.dumps(x)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
31
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
32 def test_dictrecursion(self):
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
33 x = {}
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
34 x["test"] = x
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
35 try:
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
36 self.dumps(x)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
37 except ValueError:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
38 pass
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
39 else:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
40 self.fail("didn't raise ValueError on dict recursion")
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
41 x = {}
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
42 y = {"a": x, "b": x}
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
43 # ensure that the marker is cleared
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
44 self.dumps(x)
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
45
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
46 def test_defaultrecursion(self):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
47 class RecursiveJSONEncoder(self.json.JSONEncoder):
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
48 recurse = False
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
49 def default(self, o):
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
50 if o is JSONTestObject:
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
51 if self.recurse:
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
52 return [JSONTestObject]
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
53 else:
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
54 return 'JSONTestObject'
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
55 return pyjson.JSONEncoder.default(o)
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
56
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
57 enc = RecursiveJSONEncoder()
66310
9fe76c26ea9f #9424: Replace deprecated assert* methods in the Python test suite.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 46737
diff changeset
58 self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"')
46737
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
59 enc.recurse = True
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
60 try:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
61 enc.encode(JSONTestObject)
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
62 except ValueError:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
63 pass
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
64 else:
9f45979558a9 Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
65 self.fail("didn't raise ValueError on default recursion")
69910
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
66
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
67
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
68 def test_highly_nested_objects_decoding(self):
69910
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
69 # test that loading highly-nested objects doesn't segfault when C
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
70 # accelerations are used. See #12017
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
71 with self.assertRaises(RuntimeError):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
72 self.loads('{"a":' * 100000 + '1' + '}' * 100000)
69910
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
73 with self.assertRaises(RuntimeError):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
74 self.loads('{"a":' * 100000 + '[1]' + '}' * 100000)
69910
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
75 with self.assertRaises(RuntimeError):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
76 self.loads('[' * 100000 + '1' + ']' * 100000)
69910
61164d09337e #12017: Fix segfault in json.loads() while decoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 66310
diff changeset
77
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
78 def test_highly_nested_objects_encoding(self):
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
79 # See #12051
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
80 l, d = [], {}
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
81 for x in range(100000):
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
82 l, d = [l], {'k':d}
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
83 with self.assertRaises(RuntimeError):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
84 self.dumps(l)
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
85 with self.assertRaises(RuntimeError):
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
86 self.dumps(d)
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
87
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
88 def test_endless_recursion(self):
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
89 # See #12051
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
90 class EndlessJSONEncoder(self.json.JSONEncoder):
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
91 def default(self, o):
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
92 """If check_circular is False, this will keep adding another list."""
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
93 return [o]
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
94
70021
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
95 with self.assertRaises(RuntimeError):
9557e4eeb291 #12051: Fix segfault in json.dumps() while encoding highly-nested objects using the C accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69910
diff changeset
96 EndlessJSONEncoder(check_circular=False).encode(5j)
70086
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
97
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
98
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
99 class TestPyRecursion(TestRecursion, PyTest): pass
63fb2b811c9d #5723: merge with 3.1.
Ezio Melotti
parents: 70022
diff changeset
100 class TestCRecursion(TestRecursion, CTest): pass