gh-90716: bugfixes and more tests for _pylong. (#99073)

* Properly decref on _pylong import error.
* Improve the error message on _pylong TypeError.
* Fix the assertion error in pydebug builds to be a TypeError.
* Tie the return value comments together.

These are minor followups to issues not caught among the reviewers on
https://github.com/python/cpython/pull/96673.
This commit is contained in:
Gregory P. Smith 2022-11-03 16:18:38 -07:00 committed by GitHub
parent bee1070289
commit 4c4b5ce2e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 4 deletions

View file

@ -2,10 +2,16 @@ import sys
import time
import unittest
from unittest import mock
from test import support
from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
INVALID_UNDERSCORE_LITERALS)
try:
import _pylong
except ImportError:
_pylong = None
L = [
('0', 0),
('1', 1),
@ -841,6 +847,39 @@ class PyLongModuleTests(unittest.TestCase):
with self.assertRaises(ValueError) as err:
int('_' + s)
@support.cpython_only # tests implementation details of CPython.
@unittest.skipUnless(_pylong, "_pylong module required")
@mock.patch.object(_pylong, "int_to_decimal_string")
def test_pylong_misbehavior_error_path_to_str(
self, mock_int_to_str):
with support.adjust_int_max_str_digits(20_000):
big_value = int('7'*19_999)
mock_int_to_str.return_value = None # not a str
with self.assertRaises(TypeError) as ctx:
str(big_value)
self.assertIn('_pylong.int_to_decimal_string did not',
str(ctx.exception))
mock_int_to_str.side_effect = RuntimeError("testABC")
with self.assertRaises(RuntimeError):
str(big_value)
@support.cpython_only # tests implementation details of CPython.
@unittest.skipUnless(_pylong, "_pylong module required")
@mock.patch.object(_pylong, "int_from_string")
def test_pylong_misbehavior_error_path_from_str(
self, mock_int_from_str):
big_value = '7'*19_999
with support.adjust_int_max_str_digits(20_000):
mock_int_from_str.return_value = b'not an int'
with self.assertRaises(TypeError) as ctx:
int(big_value)
self.assertIn('_pylong.int_from_string did not',
str(ctx.exception))
mock_int_from_str.side_effect = RuntimeError("test123")
with self.assertRaises(RuntimeError):
int(big_value)
if __name__ == "__main__":
unittest.main()