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