summaryrefslogtreecommitdiffstats
path: root/Programs
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-07-26 16:57:56 (GMT)
committerGitHub <noreply@github.com>2018-07-26 16:57:56 (GMT)
commit56b29b6d6fa3eb32bb1533ee3f21b1e7135648a0 (patch)
tree9c9ee5697c1c1dc873a21617fd4e9de30d04f0b2 /Programs
parente42b705188271da108de42b55d9344642170aa2b (diff)
downloadcpython-56b29b6d6fa3eb32bb1533ee3f21b1e7135648a0.zip
cpython-56b29b6d6fa3eb32bb1533ee3f21b1e7135648a0.tar.gz
cpython-56b29b6d6fa3eb32bb1533ee3f21b1e7135648a0.tar.bz2
bpo-34170, test_embed: write Py_Initialize() tests (GH-8484)
Diffstat (limited to 'Programs')
-rw-r--r--Programs/_testembed.c331
1 files changed, 331 insertions, 0 deletions
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index b1be682..f7e7749 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -292,6 +292,331 @@ static int test_initialize_pymain(void)
}
+static void
+dump_config(void)
+{
+#define ASSERT_EQUAL(a, b) \
+ if ((a) != (b)) { \
+ printf("ERROR: %s != %s (%i != %i)\n", #a, #b, (a), (b)); \
+ exit(1); \
+ }
+#define ASSERT_STR_EQUAL(a, b) \
+ if ((a) == NULL || (b == NULL) || wcscmp((a), (b)) != 0) { \
+ printf("ERROR: %s != %s ('%ls' != '%ls')\n", #a, #b, (a), (b)); \
+ exit(1); \
+ }
+
+ PyInterpreterState *interp = PyThreadState_Get()->interp;
+ _PyCoreConfig *config = &interp->core_config;
+
+ printf("install_signal_handlers = %i\n", config->install_signal_handlers);
+
+ printf("use_environment = %i\n", config->use_environment);
+ ASSERT_EQUAL(config->use_environment, !Py_IgnoreEnvironmentFlag);
+
+ printf("use_hash_seed = %i\n", config->use_hash_seed);
+ printf("hash_seed = %lu\n", config->hash_seed);
+
+ printf("allocator = %s\n", config->allocator);
+
+ printf("dev_mode = %i\n", config->dev_mode);
+ printf("faulthandler = %i\n", config->faulthandler);
+ printf("tracemalloc = %i\n", config->tracemalloc);
+ printf("import_time = %i\n", config->import_time);
+ printf("show_ref_count = %i\n", config->show_ref_count);
+ printf("show_alloc_count = %i\n", config->show_alloc_count);
+ printf("dump_refs = %i\n", config->dump_refs);
+ printf("malloc_stats = %i\n", config->malloc_stats);
+
+ printf("coerce_c_locale = %i\n", config->coerce_c_locale);
+ printf("coerce_c_locale_warn = %i\n", config->coerce_c_locale_warn);
+ printf("utf8_mode = %i\n", config->utf8_mode);
+
+ printf("pycache_prefix = %ls\n", config->pycache_prefix);
+ printf("program_name = %ls\n", config->program_name);
+ ASSERT_STR_EQUAL(config->program_name, Py_GetProgramName());
+ /* FIXME: test argc/argv */
+ printf("program = %ls\n", config->program);
+ /* FIXME: test xoptions */
+ /* FIXME: test warnoptions */
+ /* FIXME: test module_search_path_env */
+ /* FIXME: test home */
+ /* FIXME: test module_search_paths */
+ /* FIXME: test executable */
+ /* FIXME: test prefix */
+ /* FIXME: test base_prefix */
+ /* FIXME: test exec_prefix */
+ /* FIXME: test base_exec_prefix */
+ /* FIXME: test dll_path */
+
+ printf("isolated = %i\n", config->isolated);
+ ASSERT_EQUAL(config->isolated, Py_IsolatedFlag);
+ printf("site_import = %i\n", config->site_import);
+ printf("bytes_warning = %i\n", config->bytes_warning);
+ printf("inspect = %i\n", config->inspect);
+ printf("interactive = %i\n", config->interactive);
+ printf("optimization_level = %i\n", config->optimization_level);
+ printf("debug = %i\n", config->debug);
+ printf("write_bytecode = %i\n", config->write_bytecode);
+ printf("verbose = %i\n", config->verbose);
+ ASSERT_EQUAL(config->verbose, Py_VerboseFlag);
+ printf("quiet = %i\n", config->quiet);
+ printf("user_site_directory = %i\n", config->user_site_directory);
+ printf("unbuffered_stdio = %i\n", config->unbuffered_stdio);
+ /* FIXME: test legacy_windows_fs_encoding */
+ /* FIXME: test legacy_windows_stdio */
+
+ printf("_install_importlib = %i\n", config->_install_importlib);
+ printf("_check_hash_pycs_mode = %s\n", config->_check_hash_pycs_mode);
+
+#undef ASSERT_EQUAL
+#undef ASSERT_STR_EQUAL
+}
+
+
+static int test_init_default_config(void)
+{
+ _testembed_Py_Initialize();
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
+static int test_init_global_config(void)
+{
+ /* FIXME: test Py_IgnoreEnvironmentFlag */
+
+ putenv("PYTHONUTF8=0");
+ Py_UTF8Mode = 1;
+
+ /* Test initialization from global configuration variables (Py_xxx) */
+ Py_SetProgramName(L"./globalvar");
+
+ /* Py_IsolatedFlag is not tested */
+ Py_NoSiteFlag = 1;
+ Py_BytesWarningFlag = 1;
+
+ putenv("PYTHONINSPECT=");
+ Py_InspectFlag = 1;
+
+ putenv("PYTHONOPTIMIZE=0");
+ Py_InteractiveFlag = 1;
+
+ putenv("PYTHONDEBUG=0");
+ Py_OptimizeFlag = 2;
+
+ /* Py_DebugFlag is not tested */
+
+ putenv("PYTHONDONTWRITEBYTECODE=");
+ Py_DontWriteBytecodeFlag = 1;
+
+ putenv("PYTHONVERBOSE=0");
+ Py_VerboseFlag = 1;
+
+ Py_QuietFlag = 1;
+ Py_NoUserSiteDirectory = 1;
+
+ putenv("PYTHONUNBUFFERED=");
+ Py_UnbufferedStdioFlag = 1;
+
+ /* FIXME: test Py_LegacyWindowsFSEncodingFlag */
+ /* FIXME: test Py_LegacyWindowsStdioFlag */
+
+ /* _Py_CheckHashBasedPycsMode is not public, and so not tested */
+
+ Py_Initialize();
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
+static int test_init_from_config(void)
+{
+ /* Test _Py_InitializeFromConfig() */
+ _PyCoreConfig config = _PyCoreConfig_INIT;
+ config.install_signal_handlers = 0;
+
+ /* FIXME: test use_environment */
+
+ putenv("PYTHONHASHSEED=42");
+ config.use_hash_seed = 1;
+ config.hash_seed = 123;
+
+ putenv("PYTHONMALLOC=malloc");
+ config.allocator = "malloc_debug";
+
+ /* dev_mode=1 is tested in test_init_dev_mode() */
+
+ putenv("PYTHONFAULTHANDLER=");
+ config.faulthandler = 1;
+
+ putenv("PYTHONTRACEMALLOC=0");
+ config.tracemalloc = 2;
+
+ putenv("PYTHONPROFILEIMPORTTIME=0");
+ config.import_time = 1;
+
+ config.show_ref_count = 1;
+ config.show_alloc_count = 1;
+ /* FIXME: test dump_refs: bpo-34223 */
+
+ putenv("PYTHONMALLOCSTATS=0");
+ config.malloc_stats = 1;
+
+ /* FIXME: test coerce_c_locale and coerce_c_locale_warn */
+
+ putenv("PYTHONUTF8=0");
+ Py_UTF8Mode = 0;
+ config.utf8_mode = 1;
+
+ putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix");
+ config.pycache_prefix = L"conf_pycache_prefix";
+
+ Py_SetProgramName(L"./globalvar");
+ config.program_name = L"./conf_program_name";
+
+ /* FIXME: test argc/argv */
+ config.program = L"conf_program";
+ /* FIXME: test xoptions */
+ /* FIXME: test warnoptions */
+ /* FIXME: test module_search_path_env */
+ /* FIXME: test home */
+ /* FIXME: test path config: module_search_path .. dll_path */
+
+ putenv("PYTHONVERBOSE=0");
+ Py_VerboseFlag = 0;
+ config.verbose = 1;
+
+ Py_NoSiteFlag = 0;
+ config.site_import = 0;
+
+ Py_BytesWarningFlag = 0;
+ config.bytes_warning = 1;
+
+ putenv("PYTHONINSPECT=");
+ Py_InspectFlag = 0;
+ config.inspect = 1;
+
+ Py_InteractiveFlag = 0;
+ config.interactive = 1;
+
+ putenv("PYTHONOPTIMIZE=0");
+ Py_OptimizeFlag = 1;
+ config.optimization_level = 2;
+
+ /* FIXME: test debug */
+
+ putenv("PYTHONDONTWRITEBYTECODE=");
+ Py_DontWriteBytecodeFlag = 0;
+ config.write_bytecode = 0;
+
+ Py_QuietFlag = 0;
+ config.quiet = 1;
+
+ putenv("PYTHONUNBUFFERED=");
+ Py_UnbufferedStdioFlag = 0;
+ config.unbuffered_stdio = 1;
+
+ putenv("PYTHONNOUSERSITE=");
+ Py_NoUserSiteDirectory = 0;
+ config.user_site_directory = 0;
+
+ config._check_hash_pycs_mode = "always";
+
+ _PyInitError err = _Py_InitializeFromConfig(&config);
+ /* Don't call _PyCoreConfig_Clear() since all strings are static */
+ if (_Py_INIT_FAILED(err)) {
+ _Py_FatalInitError(err);
+ }
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
+static void test_init_env_putenvs(void)
+{
+ putenv("PYTHONHASHSEED=42");
+ putenv("PYTHONMALLOC=malloc_debug");
+ putenv("PYTHONTRACEMALLOC=2");
+ putenv("PYTHONPROFILEIMPORTTIME=1");
+ putenv("PYTHONMALLOCSTATS=1");
+ putenv("PYTHONUTF8=1");
+ putenv("PYTHONVERBOSE=1");
+ putenv("PYTHONINSPECT=1");
+ putenv("PYTHONOPTIMIZE=2");
+ putenv("PYTHONDONTWRITEBYTECODE=1");
+ putenv("PYTHONUNBUFFERED=1");
+ putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix");
+ putenv("PYTHONNOUSERSITE=1");
+ putenv("PYTHONFAULTHANDLER=1");
+ putenv("PYTHONDEVMODE=1");
+ /* FIXME: test PYTHONWARNINGS */
+ /* FIXME: test PYTHONEXECUTABLE */
+ /* FIXME: test PYTHONHOME */
+ /* FIXME: test PYTHONDEBUG */
+ /* FIXME: test PYTHONDUMPREFS */
+ /* FIXME: test PYTHONCOERCECLOCALE */
+ /* FIXME: test PYTHONPATH */
+}
+
+
+static int test_init_env(void)
+{
+ /* Test initialization from environment variables */
+ Py_IgnoreEnvironmentFlag = 0;
+ test_init_env_putenvs();
+ _testembed_Py_Initialize();
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
+static int test_init_isolated(void)
+{
+ /* Test _PyCoreConfig.isolated=1 */
+ _PyCoreConfig config = _PyCoreConfig_INIT;
+
+ /* Set coerce_c_locale and utf8_mode to not depend on the locale */
+ config.coerce_c_locale = 0;
+ config.utf8_mode = 0;
+ /* Use path starting with "./" avoids a search along the PATH */
+ config.program_name = L"./_testembed";
+
+ Py_IsolatedFlag = 0;
+ config.isolated = 1;
+
+ test_init_env_putenvs();
+ _PyInitError err = _Py_InitializeFromConfig(&config);
+ if (_Py_INIT_FAILED(err)) {
+ _Py_FatalInitError(err);
+ }
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
+static int test_init_dev_mode(void)
+{
+ _PyCoreConfig config = _PyCoreConfig_INIT;
+ putenv("PYTHONFAULTHANDLER=");
+ putenv("PYTHONMALLOC=");
+ config.dev_mode = 1;
+ config.program_name = L"./_testembed";
+ _PyInitError err = _Py_InitializeFromConfig(&config);
+ if (_Py_INIT_FAILED(err)) {
+ _Py_FatalInitError(err);
+ }
+ dump_config();
+ Py_Finalize();
+ return 0;
+}
+
+
/* *********************************************************
* List of test cases and the function that implements it.
*
@@ -318,6 +643,12 @@ static struct TestCase TestCases[] = {
{ "bpo20891", test_bpo20891 },
{ "initialize_twice", test_initialize_twice },
{ "initialize_pymain", test_initialize_pymain },
+ { "init_default_config", test_init_default_config },
+ { "init_global_config", test_init_global_config },
+ { "init_from_config", test_init_from_config },
+ { "init_env", test_init_env },
+ { "init_dev_mode", test_init_dev_mode },
+ { "init_isolated", test_init_isolated },
{ NULL, NULL }
};