summaryrefslogtreecommitdiff
path: root/simplejson/tests
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-05-12 22:12:15 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2017-05-12 22:12:15 +0300
commitaaa16a53f721027695ffe68d361d58871a224c08 (patch)
tree03586bde00d99bf2105f20f912427fc58396c00a /simplejson/tests
parent881c62b215822fa3dcd79c78e72b761c34032274 (diff)
downloadsimplejson-aaa16a53f721027695ffe68d361d58871a224c08.tar.gz
Fix argument checking errors in _speedups.c.
Always check PyObject_IsTrue() for error. Also fix integer overflow in the int_as_string_bitcount argument. Fixes #167.
Diffstat (limited to 'simplejson/tests')
-rw-r--r--simplejson/tests/test_speedups.py55
1 files changed, 54 insertions, 1 deletions
diff --git a/simplejson/tests/test_speedups.py b/simplejson/tests/test_speedups.py
index 0a2b63b..25e76dc 100644
--- a/simplejson/tests/test_speedups.py
+++ b/simplejson/tests/test_speedups.py
@@ -2,7 +2,9 @@ import sys
import unittest
from unittest import TestCase
-from simplejson import encoder, scanner
+import simplejson
+from simplejson import encoder, decoder, scanner
+from simplejson.compat import PY3
def has_speedups():
@@ -22,12 +24,31 @@ def skip_if_speedups_missing(func):
return wrapper
+class BadBool:
+ def __bool__(self):
+ 1/0
+ __nonzero__ = __bool__
+
+
class TestDecode(TestCase):
@skip_if_speedups_missing
def test_make_scanner(self):
self.assertRaises(AttributeError, scanner.c_make_scanner, 1)
@skip_if_speedups_missing
+ def test_bad_bool_args(self):
+ with self.assertRaises(ZeroDivisionError):
+ decoder.JSONDecoder(strict=BadBool()).decode('""')
+ with self.assertRaises(ZeroDivisionError):
+ decoder.JSONDecoder(strict=BadBool()).decode('{}')
+ if not PY3:
+ with self.assertRaises(ZeroDivisionError):
+ decoder.JSONDecoder(strict=BadBool()).decode(u'""')
+ with self.assertRaises(ZeroDivisionError):
+ decoder.JSONDecoder(strict=BadBool()).decode(u'{}')
+
+class TestEncode(TestCase):
+ @skip_if_speedups_missing
def test_make_encoder(self):
self.assertRaises(
TypeError,
@@ -37,3 +58,35 @@ class TestDecode(TestCase):
"\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"),
None
)
+
+ @skip_if_speedups_missing
+ def test_bad_bool_args(self):
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(skipkeys=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(ensure_ascii=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(check_circular=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(allow_nan=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(sort_keys=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(use_decimal=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(namedtuple_as_object=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(tuple_as_array=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(bigint_as_string=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(for_json=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(ignore_nan=BadBool()).encode({})
+ with self.assertRaises(ZeroDivisionError):
+ encoder.JSONEncoder(iterable_as_array=BadBool()).encode({})
+
+ @skip_if_speedups_missing
+ def test_int_as_string_bitcount_overflow(self):
+ with self.assertRaises((TypeError, OverflowError)):
+ encoder.JSONEncoder(int_as_string_bitcount=2**32+31).encode(0)