#11763: don't use difflib in TestCase.assertMultiLineEqual if the strings are too long.

This commit is contained in:
Ezio Melotti 2011-04-27 10:17:34 +03:00
parent 72387f90fd
commit 935a588825
3 changed files with 45 additions and 0 deletions

View File

@ -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)

View File

@ -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))

View File

@ -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