#11763: don't use difflib in TestCase.assertMultiLineEqual if the strings are too long.
This commit is contained in:
parent
72387f90fd
commit
935a588825
|
@ -2719,6 +2719,41 @@ test case
|
||||||
# no fair testing ourself with ourself, use assertEqual..
|
# no fair testing ourself with ourself, use assertEqual..
|
||||||
self.assertEqual(sample_text_error, str(e))
|
self.assertEqual(sample_text_error, str(e))
|
||||||
|
|
||||||
|
def testAssertEqual_diffThreshold(self):
|
||||||
|
# check threshold value
|
||||||
|
self.assertEqual(self._diffThreshold, 2**16)
|
||||||
|
# disable madDiff to get diff markers
|
||||||
|
self.maxDiff = None
|
||||||
|
|
||||||
|
# set a lower threshold value and add a cleanup to restore it
|
||||||
|
old_threshold = self._diffThreshold
|
||||||
|
self._diffThreshold = 2**8
|
||||||
|
self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
|
||||||
|
|
||||||
|
# under the threshold: diff marker (^) in error message
|
||||||
|
s = 'x' * (2**7)
|
||||||
|
try:
|
||||||
|
self.assertMultiLineEqual(s + 'a', s + 'b')
|
||||||
|
except self.failureException as exc:
|
||||||
|
err_msg = str(exc)
|
||||||
|
else:
|
||||||
|
self.fail('assertEqual unexpectedly succeeded')
|
||||||
|
self.assertIn('^', err_msg)
|
||||||
|
self.assertMultiLineEqual(s + 'a', s + 'a')
|
||||||
|
|
||||||
|
# over the threshold: diff not used and marker (^) not in error message
|
||||||
|
s = 'x' * (2**9)
|
||||||
|
s1, s2 = s + 'a', s + 'b'
|
||||||
|
try:
|
||||||
|
self.assertMultiLineEqual(s1, s2)
|
||||||
|
except self.failureException as exc:
|
||||||
|
err_msg = str(exc)
|
||||||
|
else:
|
||||||
|
self.fail('assertEqual unexpectedly succeeded')
|
||||||
|
self.assertNotIn('^', err_msg)
|
||||||
|
self.assertEqual(err_msg, '%r != %r' % (s1, s2))
|
||||||
|
self.assertMultiLineEqual(s + 'a', s + 'a')
|
||||||
|
|
||||||
def testAssertIsNone(self):
|
def testAssertIsNone(self):
|
||||||
self.assertIsNone(None)
|
self.assertIsNone(None)
|
||||||
self.assertRaises(self.failureException, self.assertIsNone, False)
|
self.assertRaises(self.failureException, self.assertIsNone, False)
|
||||||
|
|
|
@ -346,6 +346,9 @@ class TestCase(object):
|
||||||
|
|
||||||
longMessage = False
|
longMessage = False
|
||||||
|
|
||||||
|
# If a string is longer than _diffThreshold, use normal comparison instead
|
||||||
|
# of difflib. See #11763.
|
||||||
|
_diffThreshold = 2**16
|
||||||
|
|
||||||
def __init__(self, methodName='runTest'):
|
def __init__(self, methodName='runTest'):
|
||||||
"""Create an instance of the class that will use the named test
|
"""Create an instance of the class that will use the named test
|
||||||
|
@ -955,6 +958,10 @@ class TestCase(object):
|
||||||
'Second argument is not a string'))
|
'Second argument is not a string'))
|
||||||
|
|
||||||
if first != second:
|
if first != second:
|
||||||
|
# don't use difflib if the strings are too long
|
||||||
|
if (len(first) > self._diffThreshold or
|
||||||
|
len(second) > self._diffThreshold):
|
||||||
|
self._baseAssertEqual(first, second, msg)
|
||||||
standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
|
standardMsg = '\n' + ''.join(difflib.ndiff(first.splitlines(True), second.splitlines(True)))
|
||||||
self.fail(self._formatMessage(msg, standardMsg))
|
self.fail(self._formatMessage(msg, standardMsg))
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the
|
||||||
|
strings are too long.
|
||||||
|
|
||||||
- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.
|
- Issue #11236: getpass.getpass responds to ctrl-c or ctrl-z on terminal.
|
||||||
|
|
||||||
- Issue #11768: The signal handler of the signal module only calls
|
- Issue #11768: The signal handler of the signal module only calls
|
||||||
|
|
Loading…
Reference in New Issue