1  from io import StringIO
       2  from test.test_json import PyTest, CTest
       3  
       4  from test.support import bigmemtest, _1G
       5  
       6  class ESC[4;38;5;81mTestDump:
       7      def test_dump(self):
       8          sio = StringIO()
       9          self.json.dump({}, sio)
      10          self.assertEqual(sio.getvalue(), '{}')
      11  
      12      def test_dumps(self):
      13          self.assertEqual(self.dumps({}), '{}')
      14  
      15      def test_dump_skipkeys(self):
      16          v = {b'invalid_key': False, 'valid_key': True}
      17          with self.assertRaises(TypeError):
      18              self.json.dumps(v)
      19  
      20          s = self.json.dumps(v, skipkeys=True)
      21          o = self.json.loads(s)
      22          self.assertIn('valid_key', o)
      23          self.assertNotIn(b'invalid_key', o)
      24  
      25      def test_encode_truefalse(self):
      26          self.assertEqual(self.dumps(
      27                   {True: False, False: True}, sort_keys=True),
      28                   '{"false": true, "true": false}')
      29          self.assertEqual(self.dumps(
      30                  {2: 3.0, 4.0: 5, False: 1, 6: True}, sort_keys=True),
      31                  '{"false": 1, "2": 3.0, "4.0": 5, "6": true}')
      32  
      33      # Issue 16228: Crash on encoding resized list
      34      def test_encode_mutated(self):
      35          a = [object()] * 10
      36          def crasher(obj):
      37              del a[-1]
      38          self.assertEqual(self.dumps(a, default=crasher),
      39                   '[null, null, null, null, null]')
      40  
      41      # Issue 24094
      42      def test_encode_evil_dict(self):
      43          class ESC[4;38;5;81mD(ESC[4;38;5;149mdict):
      44              def keys(self):
      45                  return L
      46  
      47          class ESC[4;38;5;81mX:
      48              def __hash__(self):
      49                  del L[0]
      50                  return 1337
      51  
      52              def __lt__(self, o):
      53                  return 0
      54  
      55          L = [X() for i in range(1122)]
      56          d = D()
      57          d[1337] = "true.dat"
      58          self.assertEqual(self.dumps(d, sort_keys=True), '{"1337": "true.dat"}')
      59  
      60  
      61  class ESC[4;38;5;81mTestPyDump(ESC[4;38;5;149mTestDump, ESC[4;38;5;149mPyTest): pass
      62  
      63  class ESC[4;38;5;81mTestCDump(ESC[4;38;5;149mTestDump, ESC[4;38;5;149mCTest):
      64  
      65      # The size requirement here is hopefully over-estimated (actual
      66      # memory consumption depending on implementation details, and also
      67      # system memory management, since this may allocate a lot of
      68      # small objects).
      69  
      70      @bigmemtest(size=_1G, memuse=1)
      71      def test_large_list(self, size):
      72          N = int(30 * 1024 * 1024 * (size / _1G))
      73          l = [1] * N
      74          encoded = self.dumps(l)
      75          self.assertEqual(len(encoded), N * 3)
      76          self.assertEqual(encoded[:1], "[")
      77          self.assertEqual(encoded[-2:], "1]")
      78          self.assertEqual(encoded[1:-2], "1, " * (N - 1))