From 6da20a49507c46738632baf3e4bfe3bdd086155b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 27 Mar 2019 00:26:18 +0100 Subject: [PATCH] bpo-36301: Test Python init with isolated (GH-12569) Add test_preinit_isolated1() and test_preinit_isolated2() test_embed. --- Lib/test/test_embed.py | 20 ++++++++++++ Programs/_testembed.c | 70 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index 7efd5be23e0..c44d24ecfdd 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -662,6 +662,26 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): } self.check_config("init_isolated", config, preconfig) + def test_preinit_isolated1(self): + # _PyPreConfig.isolated=1, _PyCoreConfig.isolated not set + preconfig = {} + config = { + 'isolated': 1, + 'use_environment': 0, + 'user_site_directory': 0, + } + self.check_config("preinit_isolated1", config, preconfig) + + def test_preinit_isolated2(self): + # _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 + preconfig = {} + config = { + 'isolated': 1, + 'use_environment': 0, + 'user_site_directory': 0, + } + self.check_config("preinit_isolated2", config, preconfig) + if __name__ == "__main__": unittest.main() diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7fb0d695b47..76de8aab5ba 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -648,6 +648,74 @@ static int test_init_isolated(void) } +/* _PyPreConfig.isolated=1, _PyCoreConfig.isolated=0 */ +static int test_preinit_isolated1(void) +{ + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ + preconfig.coerce_c_locale = 0; + preconfig.utf8_mode = 0; + preconfig.isolated = 1; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + _PyCoreConfig config = _PyCoreConfig_INIT; + config.program_name = L"./_testembed"; + + test_init_env_dev_mode_putenvs(); + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + +/* _PyPreConfig.isolated=0, _PyCoreConfig.isolated=1 */ +static int test_preinit_isolated2(void) +{ + _PyInitError err; + + _PyPreConfig preconfig = _PyPreConfig_INIT; + + /* Set coerce_c_locale and utf8_mode to not depend on the locale */ + preconfig.coerce_c_locale = 0; + preconfig.utf8_mode = 0; + preconfig.isolated = 0; + + err = _Py_PreInitializeFromPreConfig(&preconfig); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + + /* Test _PyCoreConfig.isolated=1 */ + _PyCoreConfig config = _PyCoreConfig_INIT; + + Py_IsolatedFlag = 0; + config.isolated = 1; + + /* Use path starting with "./" avoids a search along the PATH */ + config.program_name = L"./_testembed"; + + test_init_env_dev_mode_putenvs(); + err = _Py_InitializeFromConfig(&config); + if (_Py_INIT_FAILED(err)) { + _Py_ExitInitError(err); + } + dump_config(); + Py_Finalize(); + return 0; +} + + static int test_init_dev_mode(void) { _PyCoreConfig config = _PyCoreConfig_INIT; @@ -699,6 +767,8 @@ static struct TestCase TestCases[] = { { "init_env_dev_mode_alloc", test_init_env_dev_mode_alloc }, { "init_dev_mode", test_init_dev_mode }, { "init_isolated", test_init_isolated }, + { "preinit_isolated1", test_preinit_isolated1 }, + { "preinit_isolated2", test_preinit_isolated2 }, { NULL, NULL } };