diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2021-10-25 21:26:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-25 21:26:41 (GMT) |
commit | 6afb285ff0790471a6858e44f85d143f07fda70c (patch) | |
tree | 4e8505fe17c108c8a58aecea7111775b59a66b29 | |
parent | 2b8677a3cd855eb3a579894c64588eab0e006269 (diff) | |
download | cpython-6afb285ff0790471a6858e44f85d143f07fda70c.zip cpython-6afb285ff0790471a6858e44f85d143f07fda70c.tar.gz cpython-6afb285ff0790471a6858e44f85d143f07fda70c.tar.bz2 |
bpo-45020: Add tests for the -X "frozen_modules" option. (gh-28997)
We hadn't explicitly added any tests for this, so here they are.
https://bugs.python.org/issue45020
-rw-r--r-- | Lib/test/test_cmd_line.py | 15 | ||||
-rw-r--r-- | Lib/test/test_embed.py | 24 | ||||
-rw-r--r-- | Programs/_testembed.c | 39 |
3 files changed, 78 insertions, 0 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 1dc8c45..86ee274 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -123,6 +123,21 @@ class CmdLineTest(unittest.TestCase): else: self.assertEqual(err, b'') + def test_xoption_frozen_modules(self): + tests = { + ('=on', 'FrozenImporter'), + ('=off', 'SourceFileLoader'), + ('=', 'FrozenImporter'), + ('', 'FrozenImporter'), + } + for raw, expected in tests: + cmd = ['-X', f'frozen_modules{raw}', + #'-c', 'import os; print(os.__spec__.loader.__name__, end="")'] + '-c', 'import os; print(os.__spec__.loader, end="")'] + with self.subTest(raw): + res = assert_python_ok(*cmd) + self.assertRegex(res.out.decode('utf-8'), expected) + def test_run_module(self): # Test expected operation of the '-m' switch # Switch needs an argument diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 4186f01..7858f68 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -1466,6 +1466,30 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): self.run_embedded_interpreter("test_get_argc_argv") # ignore output + def test_init_use_frozen_modules(self): + tests = { + ('=on', 1), + ('=off', 0), + ('=', 1), + ('', 1), + } + for raw, expected in tests: + optval = f'frozen_modules{raw}' + config = { + 'parse_argv': 2, + 'argv': ['-c'], + 'orig_argv': ['./argv0', '-X', optval, '-c', 'pass'], + 'program_name': './argv0', + 'run_command': 'pass\n', + 'use_environment': 1, + 'xoptions': [optval], + 'use_frozen_modules': expected, + } + env = {'TESTFROZEN': raw[1:]} if raw else None + with self.subTest(repr(raw)): + self.check_all_configs("test_init_use_frozen_modules", config, + api=API_PYTHON, env=env) + class SetConfigTests(unittest.TestCase): def test_set_config(self): diff --git a/Programs/_testembed.c b/Programs/_testembed.c index b61fe34..773c6c3 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1726,6 +1726,44 @@ static int test_get_argc_argv(void) } +static int check_use_frozen_modules(const char *rawval) +{ + wchar_t optval[100]; + if (rawval == NULL) { + wcscpy(optval, L"frozen_modules"); + } + else if (swprintf(optval, 100, L"frozen_modules=%s", rawval) < 0) { + error("rawval is too long"); + return -1; + } + + PyConfig config; + PyConfig_InitPythonConfig(&config); + + config.parse_argv = 1; + + wchar_t* argv[] = { + L"./argv0", + L"-X", + optval, + L"-c", + L"pass", + }; + config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); + init_from_config_clear(&config); + + dump_config(); + Py_Finalize(); + return 0; +} + +static int test_init_use_frozen_modules(void) +{ + const char *envvar = getenv("TESTFROZEN"); + return check_use_frozen_modules(envvar); +} + + static int test_unicode_id_init(void) { // bpo-42882: Test that _PyUnicode_FromId() works @@ -1912,6 +1950,7 @@ static struct TestCase TestCases[] = { {"test_run_main", test_run_main}, {"test_run_main_loop", test_run_main_loop}, {"test_get_argc_argv", test_get_argc_argv}, + {"test_init_use_frozen_modules", test_init_use_frozen_modules}, // Audit {"test_open_code_hook", test_open_code_hook}, |