Skip to content
Merged
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions Lib/test/test_site.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import sys
import sysconfig
import tempfile
from textwrap import dedent
import urllib.error
import urllib.request
from unittest import mock
Expand Down Expand Up @@ -805,5 +806,112 @@ def test_underpth_dll_file(self):
self.assertTrue(rc, "sys.path is incorrect")


class CommandLineTests(unittest.TestCase):
def exists(self, path):
if path is not None and os.path.isdir(path):
return "exists"
else:
return "doesn't exist"

def get_excepted_output(self, *args):
if len(args) == 0:
user_base = site.getuserbase()
user_site = site.getusersitepackages()
output = "sys.path = [\n"
for dir in sys.path:
output += " %r,\n" % (dir,)
output += "]\n"
output += f"USER_BASE: {user_base!r} ({self.exists(user_base)})\n"
output += f"USER_SITE: {user_site!r} ({self.exists(user_site)})\n"
output += f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE!r}\n"
return 0, dedent(output).strip()

buffer = []
if '--user-base' in args:
buffer.append(site.getuserbase())
if '--user-site' in args:
buffer.append(site.getusersitepackages())

if buffer:
return_code = 3
if site.ENABLE_USER_SITE:
return_code = 0
elif site.ENABLE_USER_SITE is False:
return_code = 1
elif site.ENABLE_USER_SITE is None:
return_code = 2
output = os.pathsep.join(buffer)
return return_code, os.path.normpath(dedent(output).strip())
else:
return 10, None

def invoke_command_line(self, *args):
args = [sys.executable, "-m", "site", *args]
env = os.environ.copy()
env["PYTHONUTF8"] = "1"
env["PYTHONIOENCODING"] = "utf-8"

proc = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
env=env,
encoding='utf-8',
errors='replace')
proc.wait()
output = proc.stdout.read()
return_code = proc.returncode
proc.stdout.close()
return return_code, os.path.normpath(dedent(output).strip())

@unittest.skipIf(sys.platform == 'wasi', "Popen not supported on WASI")
def test_no_args(self):
return_code, output = self.invoke_command_line()
excepted_return_code, _ = self.get_excepted_output()
self.assertEqual(return_code, excepted_return_code)
lines = output.splitlines()
self.assertEqual(lines[0], "sys.path = [")
self.assertEqual(lines[-4], "]")
excepted_base = f"USER_BASE: '{site.getuserbase()}'" +\
f" ({self.exists(site.getuserbase())})"
self.assertEqual(lines[-3], excepted_base)
excepted_site = f"USER_SITE: '{site.getusersitepackages()}'" +\
f" ({self.exists(site.getusersitepackages())})"
self.assertEqual(lines[-2], excepted_site)
self.assertEqual(lines[-1], f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}")

@unittest.skipIf(sys.platform == 'wasi', "Popen not supported on WASI")
def test_unknown_args(self):
return_code, output = self.invoke_command_line("--unknown-arg")
excepted_return_code, _ = self.get_excepted_output("--unknown-arg")
self.assertEqual(return_code, excepted_return_code)
self.assertIn('[--user-base] [--user-site]', output)

@unittest.skipIf(sys.platform == 'wasi', "Popen not supported on WASI")
def test_base_arg(self):
return_code, output = self.invoke_command_line("--user-base")
excepted = self.get_excepted_output("--user-base")
excepted_return_code, excepted_output = excepted
self.assertEqual(return_code, excepted_return_code)
self.assertEqual(output, excepted_output)

@unittest.skipIf(sys.platform == 'wasi', "Popen not supported on WASI")
def test_site_arg(self):
return_code, output = self.invoke_command_line("--user-site")
excepted = self.get_excepted_output("--user-site")
excepted_return_code, excepted_output = excepted
self.assertEqual(return_code, excepted_return_code)
self.assertEqual(output, excepted_output)

@unittest.skipIf(sys.platform == 'wasi', "Popen not supported on WASI")
def test_both_args(self):
return_code, output = self.invoke_command_line("--user-base",
"--user-site")
excepted = self.get_excepted_output("--user-base", "--user-site")
excepted_return_code, excepted_output = excepted
self.assertEqual(return_code, excepted_return_code)
self.assertEqual(output, excepted_output)


if __name__ == "__main__":
unittest.main()
Loading