annotate Lib/test/test_json/test_recursion.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 95cf8640b271
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
85064
95cf8640b271 #18273: move the tests in Lib/test/json_tests to Lib/test/test_json and make them discoverable by unittest. Patch by Zachary Ware.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70091
diff changeset
1 from test.test_json 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