| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | from io import StringIO | 
					
						
							| 
									
										
										
										
											2013-08-08 15:03:45 +03:00
										 |  |  | from test.test_json import PyTest, CTest | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-04 10:39:54 +02:00
										 |  |  | from test.support import bigmemtest, _1G | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | class TestDump: | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  |     def test_dump(self): | 
					
						
							|  |  |  |         sio = StringIO() | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |         self.json.dump({}, sio) | 
					
						
							| 
									
										
										
										
											2010-11-20 19:04:17 +00:00
										 |  |  |         self.assertEqual(sio.getvalue(), '{}') | 
					
						
							| 
									
										
										
										
											2008-05-08 14:29:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_dumps(self): | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |         self.assertEqual(self.dumps({}), '{}') | 
					
						
							| 
									
										
										
										
											2009-05-02 12:36:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_encode_truefalse(self): | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |         self.assertEqual(self.dumps( | 
					
						
							| 
									
										
										
										
											2009-05-02 12:36:44 +00:00
										 |  |  |                  {True: False, False: True}, sort_keys=True), | 
					
						
							|  |  |  |                  '{"false": true, "true": false}') | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  |         self.assertEqual(self.dumps( | 
					
						
							| 
									
										
										
										
											2009-05-02 12:36:44 +00:00
										 |  |  |                 {2: 3.0, 4.0: 5, False: 1, 6: True}, sort_keys=True), | 
					
						
							|  |  |  |                 '{"false": 1, "2": 3.0, "4.0": 5, "6": true}') | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-01 19:52:06 +01:00
										 |  |  |     # Issue 16228: Crash on encoding resized list | 
					
						
							|  |  |  |     def test_encode_mutated(self): | 
					
						
							|  |  |  |         a = [object()] * 10 | 
					
						
							|  |  |  |         def crasher(obj): | 
					
						
							|  |  |  |             del a[-1] | 
					
						
							|  |  |  |         self.assertEqual(self.dumps(a, default=crasher), | 
					
						
							|  |  |  |                  '[null, null, null, null, null]') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 22:28:04 -04:00
										 |  |  |     # Issue 24094 | 
					
						
							|  |  |  |     def test_encode_evil_dict(self): | 
					
						
							|  |  |  |         class D(dict): | 
					
						
							|  |  |  |             def keys(self): | 
					
						
							|  |  |  |                 return L | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class X: | 
					
						
							|  |  |  |             def __hash__(self): | 
					
						
							|  |  |  |                 del L[0] | 
					
						
							|  |  |  |                 return 1337 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def __lt__(self, o): | 
					
						
							|  |  |  |                 return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         L = [X() for i in range(1122)] | 
					
						
							|  |  |  |         d = D() | 
					
						
							|  |  |  |         d[1337] = "true.dat" | 
					
						
							|  |  |  |         self.assertEqual(self.dumps(d, sort_keys=True), '{"1337": "true.dat"}') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-14 06:47:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestPyDump(TestDump, PyTest): pass | 
					
						
							| 
									
										
										
										
											2011-08-19 18:03:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class TestCDump(TestDump, CTest): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # The size requirement here is hopefully over-estimated (actual | 
					
						
							|  |  |  |     # memory consumption depending on implementation details, and also | 
					
						
							|  |  |  |     # system memory management, since this may allocate a lot of | 
					
						
							|  |  |  |     # small objects). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-04 10:39:54 +02:00
										 |  |  |     @bigmemtest(size=_1G, memuse=1) | 
					
						
							| 
									
										
										
										
											2011-08-19 18:03:14 +02:00
										 |  |  |     def test_large_list(self, size): | 
					
						
							|  |  |  |         N = int(30 * 1024 * 1024 * (size / _1G)) | 
					
						
							|  |  |  |         l = [1] * N | 
					
						
							|  |  |  |         encoded = self.dumps(l) | 
					
						
							|  |  |  |         self.assertEqual(len(encoded), N * 3) | 
					
						
							|  |  |  |         self.assertEqual(encoded[:1], "[") | 
					
						
							|  |  |  |         self.assertEqual(encoded[-2:], "1]") | 
					
						
							|  |  |  |         self.assertEqual(encoded[1:-2], "1, " * (N - 1)) |