summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-01-10 23:43:39 (GMT)
committerGitHub <noreply@github.com>2024-01-10 23:43:39 (GMT)
commit4050a150e9ce08bacb1ce0140ba16d1689dbbcdc (patch)
treec60f1303aa7520a9030af25f5c0658c78b89ed58 /Lib/test
parent3fc45e6c4e31fe817e91ebeeb5f7dc8afc6c6c13 (diff)
downloadcpython-4050a150e9ce08bacb1ce0140ba16d1689dbbcdc.zip
cpython-4050a150e9ce08bacb1ce0140ba16d1689dbbcdc.tar.gz
cpython-4050a150e9ce08bacb1ce0140ba16d1689dbbcdc.tar.bz2
gh-87868: Sort and remove duplicates in getenvironment() (GH-102731)
(cherry picked from commit c31be58da8577ef140e83d4e46502c7bb1eb9abf) Co-authored-by: AN Long <aisk@users.noreply.github.com> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com> Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com> Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_subprocess.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 79497f9..9ade90f 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -791,6 +791,19 @@ class ProcessTestCase(BaseTestCase):
stdout, stderr = p.communicate()
self.assertEqual(stdout, b"orange")
+ @unittest.skipUnless(sys.platform == "win32", "Windows only issue")
+ def test_win32_duplicate_envs(self):
+ newenv = os.environ.copy()
+ newenv["fRUit"] = "cherry"
+ newenv["fruit"] = "lemon"
+ newenv["FRUIT"] = "orange"
+ newenv["frUit"] = "banana"
+ with subprocess.Popen(["CMD", "/c", "SET", "fruit"],
+ stdout=subprocess.PIPE,
+ env=newenv) as p:
+ stdout, _ = p.communicate()
+ self.assertEqual(stdout.strip(), b"frUit=banana")
+
# Windows requires at least the SYSTEMROOT environment variable to start
# Python
@unittest.skipIf(sys.platform == 'win32',
@@ -822,6 +835,26 @@ class ProcessTestCase(BaseTestCase):
if not is_env_var_to_ignore(k)]
self.assertEqual(child_env_names, [])
+ @unittest.skipIf(sysconfig.get_config_var('Py_ENABLE_SHARED') == 1,
+ 'The Python shared library cannot be loaded '
+ 'without some system environments.')
+ @unittest.skipIf(check_sanitizer(address=True),
+ 'AddressSanitizer adds to the environment.')
+ def test_one_environment_variable(self):
+ newenv = {'fruit': 'orange'}
+ cmd = [sys.executable, '-c',
+ 'import sys,os;'
+ 'sys.stdout.write("fruit="+os.getenv("fruit"))']
+ if sys.platform == "win32":
+ cmd = ["CMD", "/c", "SET", "fruit"]
+ with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=newenv) as p:
+ stdout, stderr = p.communicate()
+ if p.returncode and support.verbose:
+ print("STDOUT:", stdout.decode("ascii", "replace"))
+ print("STDERR:", stderr.decode("ascii", "replace"))
+ self.assertEqual(p.returncode, 0)
+ self.assertEqual(stdout.strip(), b"fruit=orange")
+
def test_invalid_cmd(self):
# null character in the command name
cmd = sys.executable + '\0'
@@ -862,6 +895,19 @@ class ProcessTestCase(BaseTestCase):
stdout, stderr = p.communicate()
self.assertEqual(stdout, b"orange=lemon")
+ @unittest.skipUnless(sys.platform == "win32", "Windows only issue")
+ def test_win32_invalid_env(self):
+ # '=' in the environment variable name
+ newenv = os.environ.copy()
+ newenv["FRUIT=VEGETABLE"] = "cabbage"
+ with self.assertRaises(ValueError):
+ subprocess.Popen(ZERO_RETURN_CMD, env=newenv)
+
+ newenv = os.environ.copy()
+ newenv["==FRUIT"] = "cabbage"
+ with self.assertRaises(ValueError):
+ subprocess.Popen(ZERO_RETURN_CMD, env=newenv)
+
def test_communicate_stdin(self):
p = subprocess.Popen([sys.executable, "-c",
'import sys;'