gh-115801: Only allow sequence of strings as input for difflib.unified_diff (GH-118333)

This commit is contained in:
Pieter Eendebak 2024-06-10 13:06:18 +02:00 committed by GitHub
parent b90bd3e5bb
commit c3b6dbff2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 6 deletions

View file

@ -295,7 +295,7 @@ class TestDiffer(unittest.TestCase):
class TestOutputFormat(unittest.TestCase):
def test_tab_delimiter(self):
args = ['one', 'two', 'Original', 'Current',
args = [['one'], ['two'], 'Original', 'Current',
'2005-01-26 23:30:50', '2010-04-02 10:20:52']
ud = difflib.unified_diff(*args, lineterm='')
self.assertEqual(list(ud)[0:2], [
@ -307,7 +307,7 @@ class TestOutputFormat(unittest.TestCase):
"--- Current\t2010-04-02 10:20:52"])
def test_no_trailing_tab_on_empty_filedate(self):
args = ['one', 'two', 'Original', 'Current']
args = [['one'], ['two'], 'Original', 'Current']
ud = difflib.unified_diff(*args, lineterm='')
self.assertEqual(list(ud)[0:2], ["--- Original", "+++ Current"])
@ -447,6 +447,28 @@ class TestBytes(unittest.TestCase):
lineterm=b'')
assertDiff(expect, actual)
class TestInputTypes(unittest.TestCase):
def _assert_type_error(self, msg, generator, *args):
with self.assertRaises(TypeError) as ctx:
list(generator(*args))
self.assertEqual(msg, str(ctx.exception))
def test_input_type_checks(self):
unified = difflib.unified_diff
context = difflib.context_diff
expect = "input must be a sequence of strings, not str"
self._assert_type_error(expect, unified, 'a', ['b'])
self._assert_type_error(expect, context, 'a', ['b'])
self._assert_type_error(expect, unified, ['a'], 'b')
self._assert_type_error(expect, context, ['a'], 'b')
expect = "lines to compare must be str, not NoneType (None)"
self._assert_type_error(expect, unified, ['a'], [None])
self._assert_type_error(expect, context, ['a'], [None])
def test_mixed_types_content(self):
# type of input content must be consistent: all str or all bytes
a = [b'hello']
@ -495,10 +517,6 @@ class TestBytes(unittest.TestCase):
b = ['bar\n']
list(difflib.unified_diff(a, b, 'a', 'b', datea, dateb))
def _assert_type_error(self, msg, generator, *args):
with self.assertRaises(TypeError) as ctx:
list(generator(*args))
self.assertEqual(msg, str(ctx.exception))
class TestJunkAPIs(unittest.TestCase):
def test_is_line_junk_true(self):