diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2022-06-24 20:09:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-24 20:09:13 (GMT) |
commit | 605e9c66ad367b54a847f9fc65447a071742f554 (patch) | |
tree | 8b728b556c38003d2f8989f7758c51cf0c29320c | |
parent | 0a40025b803a8dc1d604538e317992827ab96625 (diff) | |
download | cpython-605e9c66ad367b54a847f9fc65447a071742f554.zip cpython-605e9c66ad367b54a847f9fc65447a071742f554.tar.gz cpython-605e9c66ad367b54a847f9fc65447a071742f554.tar.bz2 |
gh-85308: Add argparse tests for reading non-ASCII arguments from file (GH-94160)
-rw-r--r-- | Lib/test/support/os_helper.py | 5 | ||||
-rw-r--r-- | Lib/test/test_argparse.py | 35 |
2 files changed, 28 insertions, 12 deletions
diff --git a/Lib/test/support/os_helper.py b/Lib/test/support/os_helper.py index ff2fc33..589ef19 100644 --- a/Lib/test/support/os_helper.py +++ b/Lib/test/support/os_helper.py @@ -141,6 +141,11 @@ for name in ( try: name.decode(sys.getfilesystemencoding()) except UnicodeDecodeError: + try: + name.decode(sys.getfilesystemencoding(), + sys.getfilesystemencodeerrors()) + except UnicodeDecodeError: + continue TESTFN_UNDECODABLE = os.fsencode(TESTFN_ASCII) + name break diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 299eb30..673ef89 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -1505,14 +1505,15 @@ class TestArgumentsFromFile(TempDirMixin, ParserTestCase): def setUp(self): super(TestArgumentsFromFile, self).setUp() file_texts = [ - ('hello', 'hello world!\n'), - ('recursive', '-a\n' - 'A\n' - '@hello'), - ('invalid', '@no-such-path\n'), + ('hello', os.fsencode(self.hello) + b'\n'), + ('recursive', b'-a\n' + b'A\n' + b'@hello'), + ('invalid', b'@no-such-path\n'), + ('undecodable', self.undecodable + b'\n'), ] for path, text in file_texts: - with open(path, 'w', encoding="utf-8") as file: + with open(path, 'wb') as file: file.write(text) parser_signature = Sig(fromfile_prefix_chars='@') @@ -1522,15 +1523,25 @@ class TestArgumentsFromFile(TempDirMixin, ParserTestCase): Sig('y', nargs='+'), ] failures = ['', '-b', 'X', '@invalid', '@missing'] + hello = 'hello world!' + os_helper.FS_NONASCII successes = [ ('X Y', NS(a=None, x='X', y=['Y'])), ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])), - ('@hello X', NS(a=None, x='hello world!', y=['X'])), - ('X @hello', NS(a=None, x='X', y=['hello world!'])), - ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])), - ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])), + ('@hello X', NS(a=None, x=hello, y=['X'])), + ('X @hello', NS(a=None, x='X', y=[hello])), + ('-a B @recursive Y Z', NS(a='A', x=hello, y=['Y', 'Z'])), + ('X @recursive Z -a B', NS(a='B', x='X', y=[hello, 'Z'])), (["-a", "", "X", "Y"], NS(a='', x='X', y=['Y'])), ] + if os_helper.TESTFN_UNDECODABLE: + undecodable = os_helper.TESTFN_UNDECODABLE.lstrip(b'@') + decoded_undecodable = os.fsdecode(undecodable) + successes += [ + ('@undecodable X', NS(a=None, x=decoded_undecodable, y=['X'])), + ('X @undecodable', NS(a=None, x='X', y=[decoded_undecodable])), + ] + else: + undecodable = b'' class TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase): @@ -1539,10 +1550,10 @@ class TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase): def setUp(self): super(TestArgumentsFromFileConverter, self).setUp() file_texts = [ - ('hello', 'hello world!\n'), + ('hello', b'hello world!\n'), ] for path, text in file_texts: - with open(path, 'w', encoding="utf-8") as file: + with open(path, 'wb') as file: file.write(text) class FromFileConverterArgumentParser(ErrorRaisingArgumentParser): |