diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-05-12 22:12:15 +0300 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2017-05-12 22:12:15 +0300 |
commit | aaa16a53f721027695ffe68d361d58871a224c08 (patch) | |
tree | 03586bde00d99bf2105f20f912427fc58396c00a /simplejson/tests | |
parent | 881c62b215822fa3dcd79c78e72b761c34032274 (diff) | |
download | simplejson-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.py | 55 |
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) |