bpo-34170, test_embed: write Py_Initialize() tests (GH-8484)

This commit is contained in:
Victor Stinner 2018-07-26 18:57:56 +02:00 committed by GitHub
parent e42b705188
commit 56b29b6d6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 495 additions and 2 deletions

View file

@ -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 }
};