diff options
author | Ezio Melotti <ezio.melotti@gmail.com> | 2011-04-27 07:17:34 (GMT) |
---|---|---|
committer | Ezio Melotti <ezio.melotti@gmail.com> | 2011-04-27 07:17:34 (GMT) |
commit | 935a5888255b60b77547e7bdf32e03fbe963ef52 (patch) | |
tree | 9b961df2edfd13c0df9f5eb2012c12d124282605 | |
parent | 72387f90fd317199ed1df1605f1d719870033355 (diff) | |
download | cpython-935a5888255b60b77547e7bdf32e03fbe963ef52.zip cpython-935a5888255b60b77547e7bdf32e03fbe963ef52.tar.gz cpython-935a5888255b60b77547e7bdf32e03fbe963ef52.tar.bz2 |
#11763: don't use difflib in TestCase.assertMultiLineEqual if the strings are too long.
-rw-r--r-- | Lib/test/test_unittest.py | 35 | ||||
-rw-r--r-- | Lib/unittest.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 45 insertions, 0 deletions
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py index 21e0806..c4cad83 100644 --- a/Lib/test/test_unittest.py +++ b/Lib/test/test_unittest.py @@ -2719,6 +2719,41 @@ test case # no fair testing ourself with ourself, use assertEqual.. 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): self.assertIsNone(None) self.assertRaises(self.failureException, self.assertIsNone, False) diff --git a/Lib/unittest.py b/Lib/unittest.py index 03a11b7..cabd857 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -346,6 +346,9 @@ class TestCase(object): 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'): """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')) 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))) self.fail(self._formatMessage(msg, standardMsg)) @@ -61,6 +61,9 @@ Core and Builtins 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 #11768: The signal handler of the signal module only calls |