summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2022-06-24 20:09:13 (GMT)
committerGitHub <noreply@github.com>2022-06-24 20:09:13 (GMT)
commit605e9c66ad367b54a847f9fc65447a071742f554 (patch)
tree8b728b556c38003d2f8989f7758c51cf0c29320c
parent0a40025b803a8dc1d604538e317992827ab96625 (diff)
downloadcpython-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.py5
-rw-r--r--Lib/test/test_argparse.py35
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):