|
13 | 13 | from test.support import socket_helper
|
14 | 14 | from test.support import captured_stderr
|
15 | 15 | from test.support.os_helper import TESTFN, EnvironmentVarGuard
|
| 16 | +from test.support.script_helper import spawn_python, kill_python |
16 | 17 | import ast
|
17 | 18 | import builtins
|
18 | 19 | import glob
|
|
25 | 26 | import sys
|
26 | 27 | import sysconfig
|
27 | 28 | import tempfile
|
| 29 | +from textwrap import dedent |
28 | 30 | import urllib.error
|
29 | 31 | import urllib.request
|
30 | 32 | from unittest import mock
|
@@ -803,5 +805,107 @@ def test_underpth_dll_file(self):
|
803 | 805 | self.assertTrue(rc, "sys.path is incorrect")
|
804 | 806 |
|
805 | 807 |
|
| 808 | +class CommandLineTests(unittest.TestCase): |
| 809 | + def exists(self, path): |
| 810 | + if path is not None and os.path.isdir(path): |
| 811 | + return "exists" |
| 812 | + else: |
| 813 | + return "doesn't exist" |
| 814 | + |
| 815 | + def get_excepted_output(self, *args): |
| 816 | + if len(args) == 0: |
| 817 | + user_base = site.getuserbase() |
| 818 | + user_site = site.getusersitepackages() |
| 819 | + output = io.StringIO() |
| 820 | + output.write("sys.path = [\n") |
| 821 | + for dir in sys.path: |
| 822 | + output.write(" %r,\n" % (dir,)) |
| 823 | + output.write("]\n") |
| 824 | + output.write(f"USER_BASE: {user_base} ({self.exists(user_base)})\n") |
| 825 | + output.write(f"USER_SITE: {user_site} ({self.exists(user_site)})\n") |
| 826 | + output.write(f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}\n") |
| 827 | + return 0, dedent(output.getvalue()).strip() |
| 828 | + |
| 829 | + buffer = [] |
| 830 | + if '--user-base' in args: |
| 831 | + buffer.append(site.getuserbase()) |
| 832 | + if '--user-site' in args: |
| 833 | + buffer.append(site.getusersitepackages()) |
| 834 | + |
| 835 | + if buffer: |
| 836 | + return_code = 3 |
| 837 | + if site.ENABLE_USER_SITE: |
| 838 | + return_code = 0 |
| 839 | + elif site.ENABLE_USER_SITE is False: |
| 840 | + return_code = 1 |
| 841 | + elif site.ENABLE_USER_SITE is None: |
| 842 | + return_code = 2 |
| 843 | + output = os.pathsep.join(buffer) |
| 844 | + return return_code, os.path.normpath(dedent(output).strip()) |
| 845 | + else: |
| 846 | + return 10, None |
| 847 | + |
| 848 | + def invoke_command_line(self, *args): |
| 849 | + args = ["-m", "site", *args] |
| 850 | + |
| 851 | + with EnvironmentVarGuard() as env: |
| 852 | + env["PYTHONUTF8"] = "1" |
| 853 | + env["PYTHONIOENCODING"] = "utf-8" |
| 854 | + proc = spawn_python(*args, text=True, env=env, |
| 855 | + encoding='utf-8', errors='replace') |
| 856 | + |
| 857 | + output = kill_python(proc) |
| 858 | + return_code = proc.returncode |
| 859 | + return return_code, os.path.normpath(dedent(output).strip()) |
| 860 | + |
| 861 | + @support.requires_subprocess() |
| 862 | + def test_no_args(self): |
| 863 | + return_code, output = self.invoke_command_line() |
| 864 | + excepted_return_code, _ = self.get_excepted_output() |
| 865 | + self.assertEqual(return_code, excepted_return_code) |
| 866 | + lines = output.splitlines() |
| 867 | + self.assertEqual(lines[0], "sys.path = [") |
| 868 | + self.assertEqual(lines[-4], "]") |
| 869 | + excepted_base = f"USER_BASE: '{site.getuserbase()}'" +\ |
| 870 | + f" ({self.exists(site.getuserbase())})" |
| 871 | + self.assertEqual(lines[-3], excepted_base) |
| 872 | + excepted_site = f"USER_SITE: '{site.getusersitepackages()}'" +\ |
| 873 | + f" ({self.exists(site.getusersitepackages())})" |
| 874 | + self.assertEqual(lines[-2], excepted_site) |
| 875 | + self.assertEqual(lines[-1], f"ENABLE_USER_SITE: {site.ENABLE_USER_SITE}") |
| 876 | + |
| 877 | + @support.requires_subprocess() |
| 878 | + def test_unknown_args(self): |
| 879 | + return_code, output = self.invoke_command_line("--unknown-arg") |
| 880 | + excepted_return_code, _ = self.get_excepted_output("--unknown-arg") |
| 881 | + self.assertEqual(return_code, excepted_return_code) |
| 882 | + self.assertIn('[--user-base] [--user-site]', output) |
| 883 | + |
| 884 | + @support.requires_subprocess() |
| 885 | + def test_base_arg(self): |
| 886 | + return_code, output = self.invoke_command_line("--user-base") |
| 887 | + excepted = self.get_excepted_output("--user-base") |
| 888 | + excepted_return_code, excepted_output = excepted |
| 889 | + self.assertEqual(return_code, excepted_return_code) |
| 890 | + self.assertEqual(output, excepted_output) |
| 891 | + |
| 892 | + @support.requires_subprocess() |
| 893 | + def test_site_arg(self): |
| 894 | + return_code, output = self.invoke_command_line("--user-site") |
| 895 | + excepted = self.get_excepted_output("--user-site") |
| 896 | + excepted_return_code, excepted_output = excepted |
| 897 | + self.assertEqual(return_code, excepted_return_code) |
| 898 | + self.assertEqual(output, excepted_output) |
| 899 | + |
| 900 | + @support.requires_subprocess() |
| 901 | + def test_both_args(self): |
| 902 | + return_code, output = self.invoke_command_line("--user-base", |
| 903 | + "--user-site") |
| 904 | + excepted = self.get_excepted_output("--user-base", "--user-site") |
| 905 | + excepted_return_code, excepted_output = excepted |
| 906 | + self.assertEqual(return_code, excepted_return_code) |
| 907 | + self.assertEqual(output, excepted_output) |
| 908 | + |
| 909 | + |
806 | 910 | if __name__ == "__main__":
|
807 | 911 | unittest.main()
|
0 commit comments