Mercurial > cpython-lru_cache-weakref
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 |
| rev | line source |
|---|---|
| 70086 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 47 class RecursiveJSONEncoder(self.json.JSONEncoder): |
| 48 recurse = False | |
| 49 def default(self, o): | |
| 50 if o is JSONTestObject: | |
| 51 if self.recurse: | |
| 52 return [JSONTestObject] | |
| 53 else: | |
| 54 return 'JSONTestObject' | |
| 55 return pyjson.JSONEncoder.default(o) | |
| 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 | 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 | 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 | 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 | 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 | 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 | 90 class EndlessJSONEncoder(self.json.JSONEncoder): |
| 91 def default(self, o): | |
| 92 """If check_circular is False, this will keep adding another list.""" | |
| 93 return [o] | |
| 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 | 97 |
| 98 | |
| 99 class TestPyRecursion(TestRecursion, PyTest): pass | |
| 100 class TestCRecursion(TestRecursion, CTest): pass |
