[Python-checkins] bpo-36763: InitConfigTests tests all core config (GH-13331)

Victor Stinner webhook-mailer at python.org
Tue May 14 20:13:00 EDT 2019


https://github.com/python/cpython/commit/5eb8b07f87c66a9ca54fcb90737753ce76a3054d
commit: 5eb8b07f87c66a9ca54fcb90737753ce76a3054d
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2019-05-15T02:12:48+02:00
summary:

bpo-36763: InitConfigTests tests all core config (GH-13331)

Remove UNTESTED_CORE_CONFIG from test_embed.InitConfigTests: all core
config fields are now tested!

Changes:

* Test also dll_path on Windows
* Add run_main_config unit test: test config using _Py_RunMain().

files:
M Lib/test/test_embed.py
M Programs/_testembed.c

diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index ca06f3c3dbcc..8f40e9fdb184 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -269,12 +269,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
     maxDiff = 4096
     UTF8_MODE_ERRORS = ('surrogatepass' if MS_WINDOWS else 'surrogateescape')
 
-    # core config
-    UNTESTED_CORE_CONFIG = (
-        # FIXME: untested core configuration variables
-        'dll_path',
-        'module_search_paths',
-    )
     # Mark config which should be get by get_default_config()
     GET_DEFAULT_CONFIG = object()
     DEFAULT_PRE_CONFIG = {
@@ -324,6 +318,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
         'base_prefix': GET_DEFAULT_CONFIG,
         'exec_prefix': GET_DEFAULT_CONFIG,
         'base_exec_prefix': GET_DEFAULT_CONFIG,
+        'module_search_paths': GET_DEFAULT_CONFIG,
 
         'site_import': 1,
         'bytes_warning': 0,
@@ -354,6 +349,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
             'legacy_windows_fs_encoding': 0,
         })
         DEFAULT_CORE_CONFIG.update({
+            'dll_path': GET_DEFAULT_CONFIG,
             'legacy_windows_stdio': 0,
         })
 
@@ -410,7 +406,10 @@ def get_expected_config(self, expected, env, add_path=None):
         code = textwrap.dedent('''
             import json
             import sys
+            import _testinternalcapi
 
+            configs = _testinternalcapi.get_configs()
+            core_config = configs['core_config']
             data = {
                 'stdio_encoding': sys.stdout.encoding,
                 'stdio_errors': sys.stdout.errors,
@@ -420,8 +419,10 @@ def get_expected_config(self, expected, env, add_path=None):
                 'base_exec_prefix': sys.base_exec_prefix,
                 'filesystem_encoding': sys.getfilesystemencoding(),
                 'filesystem_errors': sys.getfilesystemencodeerrors(),
-                'module_search_paths': sys.path,
+                'module_search_paths': core_config['module_search_paths'],
             }
+            if sys.platform == 'win32':
+                data['dll_path'] = core_config['dll_path']
 
             data = json.dumps(data)
             data = data.encode('utf-8')
@@ -431,7 +432,7 @@ def get_expected_config(self, expected, env, add_path=None):
 
         # Use -S to not import the site module: get the proper configuration
         # when test_embed is run from a venv (bpo-35313)
-        args = (sys.executable, '-S', '-c', code)
+        args = [sys.executable, '-S', '-c', code]
         env = dict(env)
         if not expected['isolated']:
             env['PYTHONCOERCECLOCALE'] = '0'
@@ -462,7 +463,9 @@ def get_expected_config(self, expected, env, add_path=None):
         for key, value in expected.items():
             if value is self.GET_DEFAULT_CONFIG:
                 expected[key] = config[key]
-        expected['module_search_paths'] = config['module_search_paths']
+
+        if add_path is not None:
+            expected['module_search_paths'].append(add_path)
         return expected
 
     def check_pre_config(self, config, expected):
@@ -470,16 +473,8 @@ def check_pre_config(self, config, expected):
         core_config = dict(config['core_config'])
         self.assertEqual(pre_config, expected)
 
-    def check_core_config(self, config, expected, add_path=None):
+    def check_core_config(self, config, expected):
         core_config = dict(config['core_config'])
-        if add_path is not None:
-            paths = [*expected['module_search_paths'], add_path]
-            if not paths[0]:
-                del paths[0]
-            self.assertEqual(core_config['module_search_paths'], paths)
-        for key in self.UNTESTED_CORE_CONFIG:
-            core_config.pop(key, None)
-            expected.pop(key, None)
         self.assertEqual(core_config, expected)
 
     def check_global_config(self, config):
@@ -529,7 +524,7 @@ def check_config(self, testname, expected_config, expected_preconfig, add_path=N
                 expected_preconfig[key] = expected_config[key]
 
         self.check_pre_config(config, expected_preconfig)
-        self.check_core_config(config, expected_config, add_path)
+        self.check_core_config(config, expected_config)
         self.check_global_config(config)
 
     def test_init_default_config(self):
@@ -693,6 +688,18 @@ def test_init_read_set(self):
         self.check_config("init_read_set", core_config, preconfig,
                           add_path="init_read_set_path")
 
+    def test_run_main_config(self):
+        preconfig = {}
+        code = ('import _testinternalcapi, json; '
+                'print(json.dumps(_testinternalcapi.get_configs()))')
+        core_config = {
+            'argv': ['-c', 'arg2'],
+            'program': 'python3',
+            'program_name': './python3',
+            'run_command': code + '\n',
+        }
+        self.check_config("run_main_config", core_config, preconfig)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index 73b37c5f1f3b..2560bfc62bb8 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -747,6 +747,27 @@ static int test_run_main(void)
 }
 
 
+static int test_run_main_config(void)
+{
+    _PyCoreConfig config = _PyCoreConfig_INIT;
+
+    wchar_t *argv[] = {L"python3", L"-c",
+                       (L"import _testinternalcapi, json; "
+                        L"print(json.dumps(_testinternalcapi.get_configs()))"),
+                       L"arg2"};
+    config.argv.length = Py_ARRAY_LENGTH(argv);
+    config.argv.items = argv;
+    config.program_name = L"./python3";
+
+    _PyInitError err = _Py_InitializeFromConfig(&config);
+    if (_Py_INIT_FAILED(err)) {
+        _Py_ExitInitError(err);
+    }
+
+    return _Py_RunMain();
+}
+
+
 /* *********************************************************
  * List of test cases and the function that implements it.
  *
@@ -785,6 +806,7 @@ static struct TestCase TestCases[] = {
     { "preinit_isolated2", test_preinit_isolated2 },
     { "init_read_set", test_init_read_set },
     { "run_main", test_run_main },
+    { "run_main_config", test_run_main_config },
     { NULL, NULL }
 };
 



More information about the Python-checkins mailing list