]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Python/Python-2.7.10/Lib/json/tests/test_recursion.py
AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 4/5.
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.10 / Lib / json / tests / test_recursion.py
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Lib/json/tests/test_recursion.py b/AppPkg/Applications/Python/Python-2.7.10/Lib/json/tests/test_recursion.py
new file mode 100644 (file)
index 0000000..016cd81
--- /dev/null
@@ -0,0 +1,108 @@
+from json.tests import PyTest, CTest\r
+\r
+\r
+class JSONTestObject:\r
+    pass\r
+\r
+\r
+class TestRecursion(object):\r
+    def test_listrecursion(self):\r
+        x = []\r
+        x.append(x)\r
+        try:\r
+            self.dumps(x)\r
+        except ValueError:\r
+            pass\r
+        else:\r
+            self.fail("didn't raise ValueError on list recursion")\r
+        x = []\r
+        y = [x]\r
+        x.append(y)\r
+        try:\r
+            self.dumps(x)\r
+        except ValueError:\r
+            pass\r
+        else:\r
+            self.fail("didn't raise ValueError on alternating list recursion")\r
+        y = []\r
+        x = [y, y]\r
+        # ensure that the marker is cleared\r
+        self.dumps(x)\r
+\r
+    def test_dictrecursion(self):\r
+        x = {}\r
+        x["test"] = x\r
+        try:\r
+            self.dumps(x)\r
+        except ValueError:\r
+            pass\r
+        else:\r
+            self.fail("didn't raise ValueError on dict recursion")\r
+        x = {}\r
+        y = {"a": x, "b": x}\r
+        # ensure that the marker is cleared\r
+        self.dumps(x)\r
+\r
+    def test_defaultrecursion(self):\r
+        class RecursiveJSONEncoder(self.json.JSONEncoder):\r
+            recurse = False\r
+            def default(self, o):\r
+                if o is JSONTestObject:\r
+                    if self.recurse:\r
+                        return [JSONTestObject]\r
+                    else:\r
+                        return 'JSONTestObject'\r
+                return pyjson.JSONEncoder.default(o)\r
+\r
+        enc = RecursiveJSONEncoder()\r
+        self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"')\r
+        enc.recurse = True\r
+        try:\r
+            enc.encode(JSONTestObject)\r
+        except ValueError:\r
+            pass\r
+        else:\r
+            self.fail("didn't raise ValueError on default recursion")\r
+\r
+\r
+    def test_highly_nested_objects_decoding(self):\r
+        # test that loading highly-nested objects doesn't segfault when C\r
+        # accelerations are used. See #12017\r
+        # str\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads('{"a":' * 100000 + '1' + '}' * 100000)\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads('{"a":' * 100000 + '[1]' + '}' * 100000)\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads('[' * 100000 + '1' + ']' * 100000)\r
+        # unicode\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads(u'{"a":' * 100000 + u'1' + u'}' * 100000)\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads(u'{"a":' * 100000 + u'[1]' + u'}' * 100000)\r
+        with self.assertRaises(RuntimeError):\r
+            self.loads(u'[' * 100000 + u'1' + u']' * 100000)\r
+\r
+    def test_highly_nested_objects_encoding(self):\r
+        # See #12051\r
+        l, d = [], {}\r
+        for x in xrange(100000):\r
+            l, d = [l], {'k':d}\r
+        with self.assertRaises(RuntimeError):\r
+            self.dumps(l)\r
+        with self.assertRaises(RuntimeError):\r
+            self.dumps(d)\r
+\r
+    def test_endless_recursion(self):\r
+        # See #12051\r
+        class EndlessJSONEncoder(self.json.JSONEncoder):\r
+            def default(self, o):\r
+                """If check_circular is False, this will keep adding another list."""\r
+                return [o]\r
+\r
+        with self.assertRaises(RuntimeError):\r
+            EndlessJSONEncoder(check_circular=False).encode(5j)\r
+\r
+\r
+class TestPyRecursion(TestRecursion, PyTest): pass\r
+class TestCRecursion(TestRecursion, CTest): pass\r