17db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE_MODULE 27db96d56Sopenharmony_ci# define Py_BUILD_CORE_MODULE 37db96d56Sopenharmony_ci#endif 47db96d56Sopenharmony_ci#define NEEDS_PY_IDENTIFIER 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci/* Always enable assertion (even in release mode) */ 77db96d56Sopenharmony_ci#undef NDEBUG 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci#include <Python.h> 107db96d56Sopenharmony_ci#include "pycore_initconfig.h" // _PyConfig_InitCompatConfig() 117db96d56Sopenharmony_ci#include "pycore_runtime.h" // _PyRuntime 127db96d56Sopenharmony_ci#include "pycore_import.h" // _PyImport_FrozenBootstrap 137db96d56Sopenharmony_ci#include <Python.h> 147db96d56Sopenharmony_ci#include <inttypes.h> 157db96d56Sopenharmony_ci#include <stdio.h> 167db96d56Sopenharmony_ci#include <stdlib.h> // putenv() 177db96d56Sopenharmony_ci#include <wchar.h> 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciint main_argc; 207db96d56Sopenharmony_cichar **main_argv; 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci/********************************************************* 237db96d56Sopenharmony_ci * Embedded interpreter tests that need a custom exe 247db96d56Sopenharmony_ci * 257db96d56Sopenharmony_ci * Executed via Lib/test/test_embed.py 267db96d56Sopenharmony_ci *********************************************************/ 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci// Use to display the usage 297db96d56Sopenharmony_ci#define PROGRAM "test_embed" 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci/* Use path starting with "./" avoids a search along the PATH */ 327db96d56Sopenharmony_ci#define PROGRAM_NAME L"./_testembed" 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci#define INIT_LOOPS 4 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci// Ignore Py_DEPRECATED() compiler warnings: deprecated functions are 377db96d56Sopenharmony_ci// tested on purpose here. 387db96d56Sopenharmony_ci_Py_COMP_DIAG_PUSH 397db96d56Sopenharmony_ci_Py_COMP_DIAG_IGNORE_DEPR_DECLS 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_cistatic void error(const char *msg) 437db96d56Sopenharmony_ci{ 447db96d56Sopenharmony_ci fprintf(stderr, "ERROR: %s\n", msg); 457db96d56Sopenharmony_ci fflush(stderr); 467db96d56Sopenharmony_ci} 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_cistatic void config_set_string(PyConfig *config, wchar_t **config_str, const wchar_t *str) 507db96d56Sopenharmony_ci{ 517db96d56Sopenharmony_ci PyStatus status = PyConfig_SetString(config, config_str, str); 527db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 537db96d56Sopenharmony_ci PyConfig_Clear(config); 547db96d56Sopenharmony_ci Py_ExitStatusException(status); 557db96d56Sopenharmony_ci } 567db96d56Sopenharmony_ci} 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_cistatic void config_set_program_name(PyConfig *config) 607db96d56Sopenharmony_ci{ 617db96d56Sopenharmony_ci const wchar_t *program_name = PROGRAM_NAME; 627db96d56Sopenharmony_ci config_set_string(config, &config->program_name, program_name); 637db96d56Sopenharmony_ci} 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_cistatic void init_from_config_clear(PyConfig *config) 677db96d56Sopenharmony_ci{ 687db96d56Sopenharmony_ci PyStatus status = Py_InitializeFromConfig(config); 697db96d56Sopenharmony_ci PyConfig_Clear(config); 707db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 717db96d56Sopenharmony_ci Py_ExitStatusException(status); 727db96d56Sopenharmony_ci } 737db96d56Sopenharmony_ci} 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_cistatic void _testembed_Py_InitializeFromConfig(void) 777db96d56Sopenharmony_ci{ 787db96d56Sopenharmony_ci PyConfig config; 797db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 807db96d56Sopenharmony_ci config_set_program_name(&config); 817db96d56Sopenharmony_ci init_from_config_clear(&config); 827db96d56Sopenharmony_ci} 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_cistatic void _testembed_Py_Initialize(void) 857db96d56Sopenharmony_ci{ 867db96d56Sopenharmony_ci Py_SetProgramName(PROGRAM_NAME); 877db96d56Sopenharmony_ci Py_Initialize(); 887db96d56Sopenharmony_ci} 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci/***************************************************** 927db96d56Sopenharmony_ci * Test repeated initialisation and subinterpreters 937db96d56Sopenharmony_ci *****************************************************/ 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_cistatic void print_subinterp(void) 967db96d56Sopenharmony_ci{ 977db96d56Sopenharmony_ci /* Output information about the interpreter in the format 987db96d56Sopenharmony_ci expected in Lib/test/test_capi.py (test_subinterps). */ 997db96d56Sopenharmony_ci PyThreadState *ts = PyThreadState_Get(); 1007db96d56Sopenharmony_ci PyInterpreterState *interp = ts->interp; 1017db96d56Sopenharmony_ci int64_t id = PyInterpreterState_GetID(interp); 1027db96d56Sopenharmony_ci printf("interp %" PRId64 " <0x%" PRIXPTR ">, thread state <0x%" PRIXPTR ">: ", 1037db96d56Sopenharmony_ci id, (uintptr_t)interp, (uintptr_t)ts); 1047db96d56Sopenharmony_ci fflush(stdout); 1057db96d56Sopenharmony_ci PyRun_SimpleString( 1067db96d56Sopenharmony_ci "import sys;" 1077db96d56Sopenharmony_ci "print('id(modules) =', id(sys.modules));" 1087db96d56Sopenharmony_ci "sys.stdout.flush()" 1097db96d56Sopenharmony_ci ); 1107db96d56Sopenharmony_ci} 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_cistatic int test_repeated_init_and_subinterpreters(void) 1137db96d56Sopenharmony_ci{ 1147db96d56Sopenharmony_ci PyThreadState *mainstate, *substate; 1157db96d56Sopenharmony_ci PyGILState_STATE gilstate; 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci for (int i=1; i <= INIT_LOOPS; i++) { 1187db96d56Sopenharmony_ci printf("--- Pass %d ---\n", i); 1197db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 1207db96d56Sopenharmony_ci mainstate = PyThreadState_Get(); 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci PyEval_ReleaseThread(mainstate); 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci gilstate = PyGILState_Ensure(); 1257db96d56Sopenharmony_ci print_subinterp(); 1267db96d56Sopenharmony_ci PyThreadState_Swap(NULL); 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci for (int j=0; j<3; j++) { 1297db96d56Sopenharmony_ci substate = Py_NewInterpreter(); 1307db96d56Sopenharmony_ci print_subinterp(); 1317db96d56Sopenharmony_ci Py_EndInterpreter(substate); 1327db96d56Sopenharmony_ci } 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci PyThreadState_Swap(mainstate); 1357db96d56Sopenharmony_ci print_subinterp(); 1367db96d56Sopenharmony_ci PyGILState_Release(gilstate); 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci PyEval_RestoreThread(mainstate); 1397db96d56Sopenharmony_ci Py_Finalize(); 1407db96d56Sopenharmony_ci } 1417db96d56Sopenharmony_ci return 0; 1427db96d56Sopenharmony_ci} 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci#define EMBEDDED_EXT_NAME "embedded_ext" 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_cistatic PyModuleDef embedded_ext = { 1477db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 1487db96d56Sopenharmony_ci .m_name = EMBEDDED_EXT_NAME, 1497db96d56Sopenharmony_ci .m_size = 0, 1507db96d56Sopenharmony_ci}; 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_cistatic PyObject* 1537db96d56Sopenharmony_ciPyInit_embedded_ext(void) 1547db96d56Sopenharmony_ci{ 1557db96d56Sopenharmony_ci return PyModule_Create(&embedded_ext); 1567db96d56Sopenharmony_ci} 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci/**************************************************************************** 1597db96d56Sopenharmony_ci * Call Py_Initialize()/Py_Finalize() multiple times and execute Python code 1607db96d56Sopenharmony_ci ***************************************************************************/ 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci// Used by bpo-46417 to test that structseq types used by the sys module are 1637db96d56Sopenharmony_ci// cleared properly and initialized again properly when Python is finalized 1647db96d56Sopenharmony_ci// multiple times. 1657db96d56Sopenharmony_cistatic int test_repeated_init_exec(void) 1667db96d56Sopenharmony_ci{ 1677db96d56Sopenharmony_ci if (main_argc < 3) { 1687db96d56Sopenharmony_ci fprintf(stderr, "usage: %s test_repeated_init_exec CODE\n", PROGRAM); 1697db96d56Sopenharmony_ci exit(1); 1707db96d56Sopenharmony_ci } 1717db96d56Sopenharmony_ci const char *code = main_argv[2]; 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci for (int i=1; i <= INIT_LOOPS; i++) { 1747db96d56Sopenharmony_ci fprintf(stderr, "--- Loop #%d ---\n", i); 1757db96d56Sopenharmony_ci fflush(stderr); 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 1787db96d56Sopenharmony_ci int err = PyRun_SimpleString(code); 1797db96d56Sopenharmony_ci Py_Finalize(); 1807db96d56Sopenharmony_ci if (err) { 1817db96d56Sopenharmony_ci return 1; 1827db96d56Sopenharmony_ci } 1837db96d56Sopenharmony_ci } 1847db96d56Sopenharmony_ci return 0; 1857db96d56Sopenharmony_ci} 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci/**************************************************************************** 1887db96d56Sopenharmony_ci * Test the Py_Initialize(Ex) convenience/compatibility wrappers 1897db96d56Sopenharmony_ci ***************************************************************************/ 1907db96d56Sopenharmony_ci// This is here to help ensure there are no wrapper resource leaks (gh-96853) 1917db96d56Sopenharmony_cistatic int test_repeated_simple_init(void) 1927db96d56Sopenharmony_ci{ 1937db96d56Sopenharmony_ci for (int i=1; i <= INIT_LOOPS; i++) { 1947db96d56Sopenharmony_ci fprintf(stderr, "--- Loop #%d ---\n", i); 1957db96d56Sopenharmony_ci fflush(stderr); 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci _testembed_Py_Initialize(); 1987db96d56Sopenharmony_ci Py_Finalize(); 1997db96d56Sopenharmony_ci printf("Finalized\n"); // Give test_embed some output to check 2007db96d56Sopenharmony_ci } 2017db96d56Sopenharmony_ci return 0; 2027db96d56Sopenharmony_ci} 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci/***************************************************** 2067db96d56Sopenharmony_ci * Test forcing a particular IO encoding 2077db96d56Sopenharmony_ci *****************************************************/ 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_cistatic void check_stdio_details(const char *encoding, const char * errors) 2107db96d56Sopenharmony_ci{ 2117db96d56Sopenharmony_ci /* Output info for the test case to check */ 2127db96d56Sopenharmony_ci if (encoding) { 2137db96d56Sopenharmony_ci printf("Expected encoding: %s\n", encoding); 2147db96d56Sopenharmony_ci } else { 2157db96d56Sopenharmony_ci printf("Expected encoding: default\n"); 2167db96d56Sopenharmony_ci } 2177db96d56Sopenharmony_ci if (errors) { 2187db96d56Sopenharmony_ci printf("Expected errors: %s\n", errors); 2197db96d56Sopenharmony_ci } else { 2207db96d56Sopenharmony_ci printf("Expected errors: default\n"); 2217db96d56Sopenharmony_ci } 2227db96d56Sopenharmony_ci fflush(stdout); 2237db96d56Sopenharmony_ci /* Force the given IO encoding */ 2247db96d56Sopenharmony_ci Py_SetStandardStreamEncoding(encoding, errors); 2257db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 2267db96d56Sopenharmony_ci PyRun_SimpleString( 2277db96d56Sopenharmony_ci "import sys;" 2287db96d56Sopenharmony_ci "print('stdin: {0.encoding}:{0.errors}'.format(sys.stdin));" 2297db96d56Sopenharmony_ci "print('stdout: {0.encoding}:{0.errors}'.format(sys.stdout));" 2307db96d56Sopenharmony_ci "print('stderr: {0.encoding}:{0.errors}'.format(sys.stderr));" 2317db96d56Sopenharmony_ci "sys.stdout.flush()" 2327db96d56Sopenharmony_ci ); 2337db96d56Sopenharmony_ci Py_Finalize(); 2347db96d56Sopenharmony_ci} 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_cistatic int test_forced_io_encoding(void) 2377db96d56Sopenharmony_ci{ 2387db96d56Sopenharmony_ci /* Check various combinations */ 2397db96d56Sopenharmony_ci printf("--- Use defaults ---\n"); 2407db96d56Sopenharmony_ci check_stdio_details(NULL, NULL); 2417db96d56Sopenharmony_ci printf("--- Set errors only ---\n"); 2427db96d56Sopenharmony_ci check_stdio_details(NULL, "ignore"); 2437db96d56Sopenharmony_ci printf("--- Set encoding only ---\n"); 2447db96d56Sopenharmony_ci check_stdio_details("iso8859-1", NULL); 2457db96d56Sopenharmony_ci printf("--- Set encoding and errors ---\n"); 2467db96d56Sopenharmony_ci check_stdio_details("iso8859-1", "replace"); 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci /* Check calling after initialization fails */ 2497db96d56Sopenharmony_ci Py_Initialize(); 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci if (Py_SetStandardStreamEncoding(NULL, NULL) == 0) { 2527db96d56Sopenharmony_ci printf("Unexpected success calling Py_SetStandardStreamEncoding"); 2537db96d56Sopenharmony_ci } 2547db96d56Sopenharmony_ci Py_Finalize(); 2557db96d56Sopenharmony_ci return 0; 2567db96d56Sopenharmony_ci} 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci/********************************************************* 2597db96d56Sopenharmony_ci * Test parts of the C-API that work before initialization 2607db96d56Sopenharmony_ci *********************************************************/ 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci/* The pre-initialization tests tend to break by segfaulting, so explicitly 2637db96d56Sopenharmony_ci * flushed progress messages make the broken API easier to find when they fail. 2647db96d56Sopenharmony_ci */ 2657db96d56Sopenharmony_ci#define _Py_EMBED_PREINIT_CHECK(msg) \ 2667db96d56Sopenharmony_ci do {printf(msg); fflush(stdout);} while (0); 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_cistatic int test_pre_initialization_api(void) 2697db96d56Sopenharmony_ci{ 2707db96d56Sopenharmony_ci /* the test doesn't support custom memory allocators */ 2717db96d56Sopenharmony_ci putenv("PYTHONMALLOC="); 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci /* Leading "./" ensures getpath.c can still find the standard library */ 2747db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking Py_DecodeLocale\n"); 2757db96d56Sopenharmony_ci wchar_t *program = Py_DecodeLocale("./spam", NULL); 2767db96d56Sopenharmony_ci if (program == NULL) { 2777db96d56Sopenharmony_ci fprintf(stderr, "Fatal error: cannot decode program name\n"); 2787db96d56Sopenharmony_ci return 1; 2797db96d56Sopenharmony_ci } 2807db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking Py_SetProgramName\n"); 2817db96d56Sopenharmony_ci Py_SetProgramName(program); 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Initializing interpreter\n"); 2847db96d56Sopenharmony_ci Py_Initialize(); 2857db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Check sys module contents\n"); 2867db96d56Sopenharmony_ci PyRun_SimpleString("import sys; " 2877db96d56Sopenharmony_ci "print('sys.executable:', sys.executable)"); 2887db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Finalizing interpreter\n"); 2897db96d56Sopenharmony_ci Py_Finalize(); 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Freeing memory allocated by Py_DecodeLocale\n"); 2927db96d56Sopenharmony_ci PyMem_RawFree(program); 2937db96d56Sopenharmony_ci return 0; 2947db96d56Sopenharmony_ci} 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci/* bpo-33042: Ensure embedding apps can predefine sys module options */ 2987db96d56Sopenharmony_cistatic int test_pre_initialization_sys_options(void) 2997db96d56Sopenharmony_ci{ 3007db96d56Sopenharmony_ci /* We allocate a couple of the options dynamically, and then delete 3017db96d56Sopenharmony_ci * them before calling Py_Initialize. This ensures the interpreter isn't 3027db96d56Sopenharmony_ci * relying on the caller to keep the passed in strings alive. 3037db96d56Sopenharmony_ci */ 3047db96d56Sopenharmony_ci const wchar_t *static_warnoption = L"once"; 3057db96d56Sopenharmony_ci const wchar_t *static_xoption = L"also_not_an_option=2"; 3067db96d56Sopenharmony_ci size_t warnoption_len = wcslen(static_warnoption); 3077db96d56Sopenharmony_ci size_t xoption_len = wcslen(static_xoption); 3087db96d56Sopenharmony_ci wchar_t *dynamic_once_warnoption = \ 3097db96d56Sopenharmony_ci (wchar_t *) calloc(warnoption_len+1, sizeof(wchar_t)); 3107db96d56Sopenharmony_ci wchar_t *dynamic_xoption = \ 3117db96d56Sopenharmony_ci (wchar_t *) calloc(xoption_len+1, sizeof(wchar_t)); 3127db96d56Sopenharmony_ci wcsncpy(dynamic_once_warnoption, static_warnoption, warnoption_len+1); 3137db96d56Sopenharmony_ci wcsncpy(dynamic_xoption, static_xoption, xoption_len+1); 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking PySys_AddWarnOption\n"); 3167db96d56Sopenharmony_ci PySys_AddWarnOption(L"default"); 3177db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking PySys_ResetWarnOptions\n"); 3187db96d56Sopenharmony_ci PySys_ResetWarnOptions(); 3197db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking PySys_AddWarnOption linked list\n"); 3207db96d56Sopenharmony_ci PySys_AddWarnOption(dynamic_once_warnoption); 3217db96d56Sopenharmony_ci PySys_AddWarnOption(L"module"); 3227db96d56Sopenharmony_ci PySys_AddWarnOption(L"default"); 3237db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Checking PySys_AddXOption\n"); 3247db96d56Sopenharmony_ci PySys_AddXOption(L"not_an_option=1"); 3257db96d56Sopenharmony_ci PySys_AddXOption(dynamic_xoption); 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci /* Delete the dynamic options early */ 3287db96d56Sopenharmony_ci free(dynamic_once_warnoption); 3297db96d56Sopenharmony_ci dynamic_once_warnoption = NULL; 3307db96d56Sopenharmony_ci free(dynamic_xoption); 3317db96d56Sopenharmony_ci dynamic_xoption = NULL; 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Initializing interpreter\n"); 3347db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 3357db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Check sys module contents\n"); 3367db96d56Sopenharmony_ci PyRun_SimpleString("import sys; " 3377db96d56Sopenharmony_ci "print('sys.warnoptions:', sys.warnoptions); " 3387db96d56Sopenharmony_ci "print('sys._xoptions:', sys._xoptions); " 3397db96d56Sopenharmony_ci "warnings = sys.modules['warnings']; " 3407db96d56Sopenharmony_ci "latest_filters = [f[0] for f in warnings.filters[:3]]; " 3417db96d56Sopenharmony_ci "print('warnings.filters[:3]:', latest_filters)"); 3427db96d56Sopenharmony_ci _Py_EMBED_PREINIT_CHECK("Finalizing interpreter\n"); 3437db96d56Sopenharmony_ci Py_Finalize(); 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci return 0; 3467db96d56Sopenharmony_ci} 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci/* bpo-20891: Avoid race condition when initialising the GIL */ 3507db96d56Sopenharmony_cistatic void bpo20891_thread(void *lockp) 3517db96d56Sopenharmony_ci{ 3527db96d56Sopenharmony_ci PyThread_type_lock lock = *((PyThread_type_lock*)lockp); 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci PyGILState_STATE state = PyGILState_Ensure(); 3557db96d56Sopenharmony_ci if (!PyGILState_Check()) { 3567db96d56Sopenharmony_ci error("PyGILState_Check failed!"); 3577db96d56Sopenharmony_ci abort(); 3587db96d56Sopenharmony_ci } 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci PyGILState_Release(state); 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci PyThread_release_lock(lock); 3637db96d56Sopenharmony_ci} 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_cistatic int test_bpo20891(void) 3667db96d56Sopenharmony_ci{ 3677db96d56Sopenharmony_ci /* the test doesn't support custom memory allocators */ 3687db96d56Sopenharmony_ci putenv("PYTHONMALLOC="); 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci /* bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not 3717db96d56Sopenharmony_ci crash. */ 3727db96d56Sopenharmony_ci PyThread_type_lock lock = PyThread_allocate_lock(); 3737db96d56Sopenharmony_ci if (!lock) { 3747db96d56Sopenharmony_ci error("PyThread_allocate_lock failed!"); 3757db96d56Sopenharmony_ci return 1; 3767db96d56Sopenharmony_ci } 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci unsigned long thrd = PyThread_start_new_thread(bpo20891_thread, &lock); 3817db96d56Sopenharmony_ci if (thrd == PYTHREAD_INVALID_THREAD_ID) { 3827db96d56Sopenharmony_ci error("PyThread_start_new_thread failed!"); 3837db96d56Sopenharmony_ci return 1; 3847db96d56Sopenharmony_ci } 3857db96d56Sopenharmony_ci PyThread_acquire_lock(lock, WAIT_LOCK); 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 3887db96d56Sopenharmony_ci /* wait until the thread exit */ 3897db96d56Sopenharmony_ci PyThread_acquire_lock(lock, WAIT_LOCK); 3907db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci PyThread_free_lock(lock); 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci Py_Finalize(); 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci return 0; 3977db96d56Sopenharmony_ci} 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_cistatic int test_initialize_twice(void) 4007db96d56Sopenharmony_ci{ 4017db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci /* bpo-33932: Calling Py_Initialize() twice should do nothing 4047db96d56Sopenharmony_ci * (and not crash!). */ 4057db96d56Sopenharmony_ci Py_Initialize(); 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci Py_Finalize(); 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci return 0; 4107db96d56Sopenharmony_ci} 4117db96d56Sopenharmony_ci 4127db96d56Sopenharmony_cistatic int test_initialize_pymain(void) 4137db96d56Sopenharmony_ci{ 4147db96d56Sopenharmony_ci wchar_t *argv[] = {L"PYTHON", L"-c", 4157db96d56Sopenharmony_ci (L"import sys; " 4167db96d56Sopenharmony_ci L"print(f'Py_Main() after Py_Initialize: " 4177db96d56Sopenharmony_ci L"sys.argv={sys.argv}')"), 4187db96d56Sopenharmony_ci L"arg2"}; 4197db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci /* bpo-34008: Calling Py_Main() after Py_Initialize() must not crash */ 4227db96d56Sopenharmony_ci Py_Main(Py_ARRAY_LENGTH(argv), argv); 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_ci Py_Finalize(); 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci return 0; 4277db96d56Sopenharmony_ci} 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci 4307db96d56Sopenharmony_cistatic void 4317db96d56Sopenharmony_cidump_config(void) 4327db96d56Sopenharmony_ci{ 4337db96d56Sopenharmony_ci (void) PyRun_SimpleStringFlags( 4347db96d56Sopenharmony_ci "import _testinternalcapi, json; " 4357db96d56Sopenharmony_ci "print(json.dumps(_testinternalcapi.get_configs()))", 4367db96d56Sopenharmony_ci 0); 4377db96d56Sopenharmony_ci} 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci 4407db96d56Sopenharmony_cistatic int test_init_initialize_config(void) 4417db96d56Sopenharmony_ci{ 4427db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 4437db96d56Sopenharmony_ci dump_config(); 4447db96d56Sopenharmony_ci Py_Finalize(); 4457db96d56Sopenharmony_ci return 0; 4467db96d56Sopenharmony_ci} 4477db96d56Sopenharmony_ci 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_cistatic void config_set_argv(PyConfig *config, Py_ssize_t argc, wchar_t * const *argv) 4507db96d56Sopenharmony_ci{ 4517db96d56Sopenharmony_ci PyStatus status = PyConfig_SetArgv(config, argc, argv); 4527db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 4537db96d56Sopenharmony_ci PyConfig_Clear(config); 4547db96d56Sopenharmony_ci Py_ExitStatusException(status); 4557db96d56Sopenharmony_ci } 4567db96d56Sopenharmony_ci} 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_cistatic void 4607db96d56Sopenharmony_ciconfig_set_wide_string_list(PyConfig *config, PyWideStringList *list, 4617db96d56Sopenharmony_ci Py_ssize_t length, wchar_t **items) 4627db96d56Sopenharmony_ci{ 4637db96d56Sopenharmony_ci PyStatus status = PyConfig_SetWideStringList(config, list, length, items); 4647db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 4657db96d56Sopenharmony_ci PyConfig_Clear(config); 4667db96d56Sopenharmony_ci Py_ExitStatusException(status); 4677db96d56Sopenharmony_ci } 4687db96d56Sopenharmony_ci} 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_cistatic int check_init_compat_config(int preinit) 4727db96d56Sopenharmony_ci{ 4737db96d56Sopenharmony_ci PyStatus status; 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci if (preinit) { 4767db96d56Sopenharmony_ci PyPreConfig preconfig; 4777db96d56Sopenharmony_ci _PyPreConfig_InitCompatConfig(&preconfig); 4787db96d56Sopenharmony_ci 4797db96d56Sopenharmony_ci status = Py_PreInitialize(&preconfig); 4807db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 4817db96d56Sopenharmony_ci Py_ExitStatusException(status); 4827db96d56Sopenharmony_ci } 4837db96d56Sopenharmony_ci } 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_ci PyConfig config; 4867db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 4877db96d56Sopenharmony_ci 4887db96d56Sopenharmony_ci config_set_program_name(&config); 4897db96d56Sopenharmony_ci init_from_config_clear(&config); 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci dump_config(); 4927db96d56Sopenharmony_ci Py_Finalize(); 4937db96d56Sopenharmony_ci return 0; 4947db96d56Sopenharmony_ci} 4957db96d56Sopenharmony_ci 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_cistatic int test_preinit_compat_config(void) 4987db96d56Sopenharmony_ci{ 4997db96d56Sopenharmony_ci return check_init_compat_config(1); 5007db96d56Sopenharmony_ci} 5017db96d56Sopenharmony_ci 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_cistatic int test_init_compat_config(void) 5047db96d56Sopenharmony_ci{ 5057db96d56Sopenharmony_ci return check_init_compat_config(0); 5067db96d56Sopenharmony_ci} 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci 5097db96d56Sopenharmony_cistatic int test_init_global_config(void) 5107db96d56Sopenharmony_ci{ 5117db96d56Sopenharmony_ci /* FIXME: test Py_IgnoreEnvironmentFlag */ 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ci putenv("PYTHONUTF8=0"); 5147db96d56Sopenharmony_ci Py_UTF8Mode = 1; 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci /* Test initialization from global configuration variables (Py_xxx) */ 5177db96d56Sopenharmony_ci Py_SetProgramName(L"./globalvar"); 5187db96d56Sopenharmony_ci 5197db96d56Sopenharmony_ci /* Py_IsolatedFlag is not tested */ 5207db96d56Sopenharmony_ci Py_NoSiteFlag = 1; 5217db96d56Sopenharmony_ci Py_BytesWarningFlag = 1; 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci putenv("PYTHONINSPECT="); 5247db96d56Sopenharmony_ci Py_InspectFlag = 1; 5257db96d56Sopenharmony_ci 5267db96d56Sopenharmony_ci putenv("PYTHONOPTIMIZE=0"); 5277db96d56Sopenharmony_ci Py_InteractiveFlag = 1; 5287db96d56Sopenharmony_ci 5297db96d56Sopenharmony_ci putenv("PYTHONDEBUG=0"); 5307db96d56Sopenharmony_ci Py_OptimizeFlag = 2; 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci /* Py_DebugFlag is not tested */ 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci putenv("PYTHONDONTWRITEBYTECODE="); 5357db96d56Sopenharmony_ci Py_DontWriteBytecodeFlag = 1; 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ci putenv("PYTHONVERBOSE=0"); 5387db96d56Sopenharmony_ci Py_VerboseFlag = 1; 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ci Py_QuietFlag = 1; 5417db96d56Sopenharmony_ci Py_NoUserSiteDirectory = 1; 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci putenv("PYTHONUNBUFFERED="); 5447db96d56Sopenharmony_ci Py_UnbufferedStdioFlag = 1; 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci Py_FrozenFlag = 1; 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ 5497db96d56Sopenharmony_ci /* FIXME: test Py_LegacyWindowsStdioFlag */ 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci Py_Initialize(); 5527db96d56Sopenharmony_ci dump_config(); 5537db96d56Sopenharmony_ci Py_Finalize(); 5547db96d56Sopenharmony_ci return 0; 5557db96d56Sopenharmony_ci} 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci 5587db96d56Sopenharmony_cistatic int test_init_from_config(void) 5597db96d56Sopenharmony_ci{ 5607db96d56Sopenharmony_ci PyPreConfig preconfig; 5617db96d56Sopenharmony_ci _PyPreConfig_InitCompatConfig(&preconfig); 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci putenv("PYTHONMALLOC=malloc_debug"); 5647db96d56Sopenharmony_ci preconfig.allocator = PYMEM_ALLOCATOR_MALLOC; 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ci putenv("PYTHONUTF8=0"); 5677db96d56Sopenharmony_ci Py_UTF8Mode = 0; 5687db96d56Sopenharmony_ci preconfig.utf8_mode = 1; 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 5717db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 5727db96d56Sopenharmony_ci Py_ExitStatusException(status); 5737db96d56Sopenharmony_ci } 5747db96d56Sopenharmony_ci 5757db96d56Sopenharmony_ci PyConfig config; 5767db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 5777db96d56Sopenharmony_ci 5787db96d56Sopenharmony_ci config.install_signal_handlers = 0; 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci /* FIXME: test use_environment */ 5817db96d56Sopenharmony_ci 5827db96d56Sopenharmony_ci putenv("PYTHONHASHSEED=42"); 5837db96d56Sopenharmony_ci config.use_hash_seed = 1; 5847db96d56Sopenharmony_ci config.hash_seed = 123; 5857db96d56Sopenharmony_ci 5867db96d56Sopenharmony_ci /* dev_mode=1 is tested in test_init_dev_mode() */ 5877db96d56Sopenharmony_ci 5887db96d56Sopenharmony_ci putenv("PYTHONFAULTHANDLER="); 5897db96d56Sopenharmony_ci config.faulthandler = 1; 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ci putenv("PYTHONTRACEMALLOC=0"); 5927db96d56Sopenharmony_ci config.tracemalloc = 2; 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci putenv("PYTHONPROFILEIMPORTTIME=0"); 5957db96d56Sopenharmony_ci config.import_time = 1; 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci putenv("PYTHONNODEBUGRANGES=0"); 5987db96d56Sopenharmony_ci config.code_debug_ranges = 0; 5997db96d56Sopenharmony_ci 6007db96d56Sopenharmony_ci config.show_ref_count = 1; 6017db96d56Sopenharmony_ci /* FIXME: test dump_refs: bpo-34223 */ 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci putenv("PYTHONMALLOCSTATS=0"); 6047db96d56Sopenharmony_ci config.malloc_stats = 1; 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ci putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); 6077db96d56Sopenharmony_ci config_set_string(&config, &config.pycache_prefix, L"conf_pycache_prefix"); 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci Py_SetProgramName(L"./globalvar"); 6107db96d56Sopenharmony_ci config_set_string(&config, &config.program_name, L"./conf_program_name"); 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci wchar_t* argv[] = { 6137db96d56Sopenharmony_ci L"python3", 6147db96d56Sopenharmony_ci L"-W", 6157db96d56Sopenharmony_ci L"cmdline_warnoption", 6167db96d56Sopenharmony_ci L"-X", 6177db96d56Sopenharmony_ci L"cmdline_xoption", 6187db96d56Sopenharmony_ci L"-c", 6197db96d56Sopenharmony_ci L"pass", 6207db96d56Sopenharmony_ci L"arg2", 6217db96d56Sopenharmony_ci }; 6227db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 6237db96d56Sopenharmony_ci config.parse_argv = 1; 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci wchar_t* xoptions[3] = { 6267db96d56Sopenharmony_ci L"config_xoption1=3", 6277db96d56Sopenharmony_ci L"config_xoption2=", 6287db96d56Sopenharmony_ci L"config_xoption3", 6297db96d56Sopenharmony_ci }; 6307db96d56Sopenharmony_ci config_set_wide_string_list(&config, &config.xoptions, 6317db96d56Sopenharmony_ci Py_ARRAY_LENGTH(xoptions), xoptions); 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci wchar_t* warnoptions[1] = { 6347db96d56Sopenharmony_ci L"config_warnoption", 6357db96d56Sopenharmony_ci }; 6367db96d56Sopenharmony_ci config_set_wide_string_list(&config, &config.warnoptions, 6377db96d56Sopenharmony_ci Py_ARRAY_LENGTH(warnoptions), warnoptions); 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci /* FIXME: test pythonpath_env */ 6407db96d56Sopenharmony_ci /* FIXME: test home */ 6417db96d56Sopenharmony_ci /* FIXME: test path config: module_search_path .. dll_path */ 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci putenv("PYTHONPLATLIBDIR=env_platlibdir"); 6447db96d56Sopenharmony_ci status = PyConfig_SetBytesString(&config, &config.platlibdir, "my_platlibdir"); 6457db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 6467db96d56Sopenharmony_ci PyConfig_Clear(&config); 6477db96d56Sopenharmony_ci Py_ExitStatusException(status); 6487db96d56Sopenharmony_ci } 6497db96d56Sopenharmony_ci 6507db96d56Sopenharmony_ci putenv("PYTHONVERBOSE=0"); 6517db96d56Sopenharmony_ci Py_VerboseFlag = 0; 6527db96d56Sopenharmony_ci config.verbose = 1; 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ci Py_NoSiteFlag = 0; 6557db96d56Sopenharmony_ci config.site_import = 0; 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci Py_BytesWarningFlag = 0; 6587db96d56Sopenharmony_ci config.bytes_warning = 1; 6597db96d56Sopenharmony_ci 6607db96d56Sopenharmony_ci putenv("PYTHONINSPECT="); 6617db96d56Sopenharmony_ci Py_InspectFlag = 0; 6627db96d56Sopenharmony_ci config.inspect = 1; 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci Py_InteractiveFlag = 0; 6657db96d56Sopenharmony_ci config.interactive = 1; 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci putenv("PYTHONOPTIMIZE=0"); 6687db96d56Sopenharmony_ci Py_OptimizeFlag = 1; 6697db96d56Sopenharmony_ci config.optimization_level = 2; 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci /* FIXME: test parser_debug */ 6727db96d56Sopenharmony_ci 6737db96d56Sopenharmony_ci putenv("PYTHONDONTWRITEBYTECODE="); 6747db96d56Sopenharmony_ci Py_DontWriteBytecodeFlag = 0; 6757db96d56Sopenharmony_ci config.write_bytecode = 0; 6767db96d56Sopenharmony_ci 6777db96d56Sopenharmony_ci Py_QuietFlag = 0; 6787db96d56Sopenharmony_ci config.quiet = 1; 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci config.configure_c_stdio = 1; 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci putenv("PYTHONUNBUFFERED="); 6837db96d56Sopenharmony_ci Py_UnbufferedStdioFlag = 0; 6847db96d56Sopenharmony_ci config.buffered_stdio = 0; 6857db96d56Sopenharmony_ci 6867db96d56Sopenharmony_ci putenv("PYTHONIOENCODING=cp424"); 6877db96d56Sopenharmony_ci Py_SetStandardStreamEncoding("ascii", "ignore"); 6887db96d56Sopenharmony_ci#ifdef MS_WINDOWS 6897db96d56Sopenharmony_ci /* Py_SetStandardStreamEncoding() sets Py_LegacyWindowsStdioFlag to 1. 6907db96d56Sopenharmony_ci Force it to 0 through the config. */ 6917db96d56Sopenharmony_ci config.legacy_windows_stdio = 0; 6927db96d56Sopenharmony_ci#endif 6937db96d56Sopenharmony_ci config_set_string(&config, &config.stdio_encoding, L"iso8859-1"); 6947db96d56Sopenharmony_ci config_set_string(&config, &config.stdio_errors, L"replace"); 6957db96d56Sopenharmony_ci 6967db96d56Sopenharmony_ci putenv("PYTHONNOUSERSITE="); 6977db96d56Sopenharmony_ci Py_NoUserSiteDirectory = 0; 6987db96d56Sopenharmony_ci config.user_site_directory = 0; 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci config_set_string(&config, &config.check_hash_pycs_mode, L"always"); 7017db96d56Sopenharmony_ci 7027db96d56Sopenharmony_ci Py_FrozenFlag = 0; 7037db96d56Sopenharmony_ci config.pathconfig_warnings = 0; 7047db96d56Sopenharmony_ci 7057db96d56Sopenharmony_ci config.safe_path = 1; 7067db96d56Sopenharmony_ci 7077db96d56Sopenharmony_ci config._isolated_interpreter = 1; 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ci init_from_config_clear(&config); 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_ci dump_config(); 7127db96d56Sopenharmony_ci Py_Finalize(); 7137db96d56Sopenharmony_ci return 0; 7147db96d56Sopenharmony_ci} 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_cistatic int check_init_parse_argv(int parse_argv) 7187db96d56Sopenharmony_ci{ 7197db96d56Sopenharmony_ci PyConfig config; 7207db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 7217db96d56Sopenharmony_ci 7227db96d56Sopenharmony_ci config.parse_argv = parse_argv; 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci wchar_t* argv[] = { 7257db96d56Sopenharmony_ci L"./argv0", 7267db96d56Sopenharmony_ci L"-E", 7277db96d56Sopenharmony_ci L"-c", 7287db96d56Sopenharmony_ci L"pass", 7297db96d56Sopenharmony_ci L"arg1", 7307db96d56Sopenharmony_ci L"-v", 7317db96d56Sopenharmony_ci L"arg3", 7327db96d56Sopenharmony_ci }; 7337db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 7347db96d56Sopenharmony_ci init_from_config_clear(&config); 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci dump_config(); 7377db96d56Sopenharmony_ci Py_Finalize(); 7387db96d56Sopenharmony_ci return 0; 7397db96d56Sopenharmony_ci} 7407db96d56Sopenharmony_ci 7417db96d56Sopenharmony_ci 7427db96d56Sopenharmony_cistatic int test_init_parse_argv(void) 7437db96d56Sopenharmony_ci{ 7447db96d56Sopenharmony_ci return check_init_parse_argv(1); 7457db96d56Sopenharmony_ci} 7467db96d56Sopenharmony_ci 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_cistatic int test_init_dont_parse_argv(void) 7497db96d56Sopenharmony_ci{ 7507db96d56Sopenharmony_ci return check_init_parse_argv(0); 7517db96d56Sopenharmony_ci} 7527db96d56Sopenharmony_ci 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_cistatic void set_most_env_vars(void) 7557db96d56Sopenharmony_ci{ 7567db96d56Sopenharmony_ci putenv("PYTHONHASHSEED=42"); 7577db96d56Sopenharmony_ci putenv("PYTHONMALLOC=malloc"); 7587db96d56Sopenharmony_ci putenv("PYTHONTRACEMALLOC=2"); 7597db96d56Sopenharmony_ci putenv("PYTHONPROFILEIMPORTTIME=1"); 7607db96d56Sopenharmony_ci putenv("PYTHONNODEBUGRANGES=1"); 7617db96d56Sopenharmony_ci putenv("PYTHONMALLOCSTATS=1"); 7627db96d56Sopenharmony_ci putenv("PYTHONUTF8=1"); 7637db96d56Sopenharmony_ci putenv("PYTHONVERBOSE=1"); 7647db96d56Sopenharmony_ci putenv("PYTHONINSPECT=1"); 7657db96d56Sopenharmony_ci putenv("PYTHONOPTIMIZE=2"); 7667db96d56Sopenharmony_ci putenv("PYTHONDONTWRITEBYTECODE=1"); 7677db96d56Sopenharmony_ci putenv("PYTHONUNBUFFERED=1"); 7687db96d56Sopenharmony_ci putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); 7697db96d56Sopenharmony_ci putenv("PYTHONNOUSERSITE=1"); 7707db96d56Sopenharmony_ci putenv("PYTHONFAULTHANDLER=1"); 7717db96d56Sopenharmony_ci putenv("PYTHONIOENCODING=iso8859-1:replace"); 7727db96d56Sopenharmony_ci putenv("PYTHONPLATLIBDIR=env_platlibdir"); 7737db96d56Sopenharmony_ci putenv("PYTHONSAFEPATH=1"); 7747db96d56Sopenharmony_ci} 7757db96d56Sopenharmony_ci 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_cistatic void set_all_env_vars(void) 7787db96d56Sopenharmony_ci{ 7797db96d56Sopenharmony_ci set_most_env_vars(); 7807db96d56Sopenharmony_ci 7817db96d56Sopenharmony_ci putenv("PYTHONWARNINGS=EnvVar"); 7827db96d56Sopenharmony_ci putenv("PYTHONPATH=/my/path"); 7837db96d56Sopenharmony_ci} 7847db96d56Sopenharmony_ci 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_cistatic int test_init_compat_env(void) 7877db96d56Sopenharmony_ci{ 7887db96d56Sopenharmony_ci /* Test initialization from environment variables */ 7897db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 7907db96d56Sopenharmony_ci set_all_env_vars(); 7917db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 7927db96d56Sopenharmony_ci dump_config(); 7937db96d56Sopenharmony_ci Py_Finalize(); 7947db96d56Sopenharmony_ci return 0; 7957db96d56Sopenharmony_ci} 7967db96d56Sopenharmony_ci 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_cistatic int test_init_python_env(void) 7997db96d56Sopenharmony_ci{ 8007db96d56Sopenharmony_ci set_all_env_vars(); 8017db96d56Sopenharmony_ci 8027db96d56Sopenharmony_ci PyConfig config; 8037db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_ci config_set_program_name(&config); 8067db96d56Sopenharmony_ci init_from_config_clear(&config); 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ci dump_config(); 8097db96d56Sopenharmony_ci Py_Finalize(); 8107db96d56Sopenharmony_ci return 0; 8117db96d56Sopenharmony_ci} 8127db96d56Sopenharmony_ci 8137db96d56Sopenharmony_ci 8147db96d56Sopenharmony_cistatic void set_all_env_vars_dev_mode(void) 8157db96d56Sopenharmony_ci{ 8167db96d56Sopenharmony_ci putenv("PYTHONMALLOC="); 8177db96d56Sopenharmony_ci putenv("PYTHONFAULTHANDLER="); 8187db96d56Sopenharmony_ci putenv("PYTHONDEVMODE=1"); 8197db96d56Sopenharmony_ci} 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_ci 8227db96d56Sopenharmony_cistatic int test_init_env_dev_mode(void) 8237db96d56Sopenharmony_ci{ 8247db96d56Sopenharmony_ci /* Test initialization from environment variables */ 8257db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 8267db96d56Sopenharmony_ci set_all_env_vars_dev_mode(); 8277db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 8287db96d56Sopenharmony_ci dump_config(); 8297db96d56Sopenharmony_ci Py_Finalize(); 8307db96d56Sopenharmony_ci return 0; 8317db96d56Sopenharmony_ci} 8327db96d56Sopenharmony_ci 8337db96d56Sopenharmony_ci 8347db96d56Sopenharmony_cistatic int test_init_env_dev_mode_alloc(void) 8357db96d56Sopenharmony_ci{ 8367db96d56Sopenharmony_ci /* Test initialization from environment variables */ 8377db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 8387db96d56Sopenharmony_ci set_all_env_vars_dev_mode(); 8397db96d56Sopenharmony_ci putenv("PYTHONMALLOC=malloc"); 8407db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 8417db96d56Sopenharmony_ci dump_config(); 8427db96d56Sopenharmony_ci Py_Finalize(); 8437db96d56Sopenharmony_ci return 0; 8447db96d56Sopenharmony_ci} 8457db96d56Sopenharmony_ci 8467db96d56Sopenharmony_ci 8477db96d56Sopenharmony_cistatic int test_init_isolated_flag(void) 8487db96d56Sopenharmony_ci{ 8497db96d56Sopenharmony_ci /* Test PyConfig.isolated=1 */ 8507db96d56Sopenharmony_ci PyConfig config; 8517db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci Py_IsolatedFlag = 0; 8547db96d56Sopenharmony_ci config.isolated = 1; 8557db96d56Sopenharmony_ci // These options are set to 1 by isolated=1 8567db96d56Sopenharmony_ci config.safe_path = 0; 8577db96d56Sopenharmony_ci config.use_environment = 1; 8587db96d56Sopenharmony_ci config.user_site_directory = 1; 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_ci config_set_program_name(&config); 8617db96d56Sopenharmony_ci set_all_env_vars(); 8627db96d56Sopenharmony_ci init_from_config_clear(&config); 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ci dump_config(); 8657db96d56Sopenharmony_ci Py_Finalize(); 8667db96d56Sopenharmony_ci return 0; 8677db96d56Sopenharmony_ci} 8687db96d56Sopenharmony_ci 8697db96d56Sopenharmony_ci 8707db96d56Sopenharmony_ci/* PyPreConfig.isolated=1, PyConfig.isolated=0 */ 8717db96d56Sopenharmony_cistatic int test_preinit_isolated1(void) 8727db96d56Sopenharmony_ci{ 8737db96d56Sopenharmony_ci PyPreConfig preconfig; 8747db96d56Sopenharmony_ci _PyPreConfig_InitCompatConfig(&preconfig); 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_ci preconfig.isolated = 1; 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 8797db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 8807db96d56Sopenharmony_ci Py_ExitStatusException(status); 8817db96d56Sopenharmony_ci } 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci PyConfig config; 8847db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci config_set_program_name(&config); 8877db96d56Sopenharmony_ci set_all_env_vars(); 8887db96d56Sopenharmony_ci init_from_config_clear(&config); 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci dump_config(); 8917db96d56Sopenharmony_ci Py_Finalize(); 8927db96d56Sopenharmony_ci return 0; 8937db96d56Sopenharmony_ci} 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ci 8967db96d56Sopenharmony_ci/* PyPreConfig.isolated=0, PyConfig.isolated=1 */ 8977db96d56Sopenharmony_cistatic int test_preinit_isolated2(void) 8987db96d56Sopenharmony_ci{ 8997db96d56Sopenharmony_ci PyPreConfig preconfig; 9007db96d56Sopenharmony_ci _PyPreConfig_InitCompatConfig(&preconfig); 9017db96d56Sopenharmony_ci 9027db96d56Sopenharmony_ci preconfig.isolated = 0; 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 9057db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 9067db96d56Sopenharmony_ci Py_ExitStatusException(status); 9077db96d56Sopenharmony_ci } 9087db96d56Sopenharmony_ci 9097db96d56Sopenharmony_ci /* Test PyConfig.isolated=1 */ 9107db96d56Sopenharmony_ci PyConfig config; 9117db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci Py_IsolatedFlag = 0; 9147db96d56Sopenharmony_ci config.isolated = 1; 9157db96d56Sopenharmony_ci 9167db96d56Sopenharmony_ci config_set_program_name(&config); 9177db96d56Sopenharmony_ci set_all_env_vars(); 9187db96d56Sopenharmony_ci init_from_config_clear(&config); 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci dump_config(); 9217db96d56Sopenharmony_ci Py_Finalize(); 9227db96d56Sopenharmony_ci return 0; 9237db96d56Sopenharmony_ci} 9247db96d56Sopenharmony_ci 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_cistatic int test_preinit_dont_parse_argv(void) 9277db96d56Sopenharmony_ci{ 9287db96d56Sopenharmony_ci PyPreConfig preconfig; 9297db96d56Sopenharmony_ci PyPreConfig_InitIsolatedConfig(&preconfig); 9307db96d56Sopenharmony_ci 9317db96d56Sopenharmony_ci preconfig.isolated = 0; 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci /* -X dev must be ignored by isolated preconfiguration */ 9347db96d56Sopenharmony_ci wchar_t *argv[] = {L"python3", 9357db96d56Sopenharmony_ci L"-E", 9367db96d56Sopenharmony_ci L"-I", 9377db96d56Sopenharmony_ci L"-P", 9387db96d56Sopenharmony_ci L"-X", L"dev", 9397db96d56Sopenharmony_ci L"-X", L"utf8", 9407db96d56Sopenharmony_ci L"script.py"}; 9417db96d56Sopenharmony_ci PyStatus status = Py_PreInitializeFromArgs(&preconfig, 9427db96d56Sopenharmony_ci Py_ARRAY_LENGTH(argv), argv); 9437db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 9447db96d56Sopenharmony_ci Py_ExitStatusException(status); 9457db96d56Sopenharmony_ci } 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci PyConfig config; 9487db96d56Sopenharmony_ci PyConfig_InitIsolatedConfig(&config); 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ci config.isolated = 0; 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci /* Pre-initialize implicitly using argv: make sure that -X dev 9537db96d56Sopenharmony_ci is used to configure the allocation in preinitialization */ 9547db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 9557db96d56Sopenharmony_ci config_set_program_name(&config); 9567db96d56Sopenharmony_ci init_from_config_clear(&config); 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci dump_config(); 9597db96d56Sopenharmony_ci Py_Finalize(); 9607db96d56Sopenharmony_ci return 0; 9617db96d56Sopenharmony_ci} 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_ci 9647db96d56Sopenharmony_cistatic int test_preinit_parse_argv(void) 9657db96d56Sopenharmony_ci{ 9667db96d56Sopenharmony_ci PyConfig config; 9677db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 9687db96d56Sopenharmony_ci 9697db96d56Sopenharmony_ci /* Pre-initialize implicitly using argv: make sure that -X dev 9707db96d56Sopenharmony_ci is used to configure the allocation in preinitialization */ 9717db96d56Sopenharmony_ci wchar_t *argv[] = {L"python3", L"-X", L"dev", L"-P", L"script.py"}; 9727db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 9737db96d56Sopenharmony_ci config_set_program_name(&config); 9747db96d56Sopenharmony_ci init_from_config_clear(&config); 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci dump_config(); 9777db96d56Sopenharmony_ci Py_Finalize(); 9787db96d56Sopenharmony_ci return 0; 9797db96d56Sopenharmony_ci} 9807db96d56Sopenharmony_ci 9817db96d56Sopenharmony_ci 9827db96d56Sopenharmony_ci 9837db96d56Sopenharmony_ci 9847db96d56Sopenharmony_cistatic void set_all_global_config_variables(void) 9857db96d56Sopenharmony_ci{ 9867db96d56Sopenharmony_ci Py_IsolatedFlag = 0; 9877db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 9887db96d56Sopenharmony_ci Py_BytesWarningFlag = 2; 9897db96d56Sopenharmony_ci Py_InspectFlag = 1; 9907db96d56Sopenharmony_ci Py_InteractiveFlag = 1; 9917db96d56Sopenharmony_ci Py_OptimizeFlag = 1; 9927db96d56Sopenharmony_ci Py_DebugFlag = 1; 9937db96d56Sopenharmony_ci Py_VerboseFlag = 1; 9947db96d56Sopenharmony_ci Py_QuietFlag = 1; 9957db96d56Sopenharmony_ci Py_FrozenFlag = 0; 9967db96d56Sopenharmony_ci Py_UnbufferedStdioFlag = 1; 9977db96d56Sopenharmony_ci Py_NoSiteFlag = 1; 9987db96d56Sopenharmony_ci Py_DontWriteBytecodeFlag = 1; 9997db96d56Sopenharmony_ci Py_NoUserSiteDirectory = 1; 10007db96d56Sopenharmony_ci#ifdef MS_WINDOWS 10017db96d56Sopenharmony_ci Py_LegacyWindowsStdioFlag = 1; 10027db96d56Sopenharmony_ci#endif 10037db96d56Sopenharmony_ci} 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci 10067db96d56Sopenharmony_cistatic int check_preinit_isolated_config(int preinit) 10077db96d56Sopenharmony_ci{ 10087db96d56Sopenharmony_ci PyStatus status; 10097db96d56Sopenharmony_ci PyPreConfig *rt_preconfig; 10107db96d56Sopenharmony_ci 10117db96d56Sopenharmony_ci /* environment variables must be ignored */ 10127db96d56Sopenharmony_ci set_all_env_vars(); 10137db96d56Sopenharmony_ci 10147db96d56Sopenharmony_ci /* global configuration variables must be ignored */ 10157db96d56Sopenharmony_ci set_all_global_config_variables(); 10167db96d56Sopenharmony_ci 10177db96d56Sopenharmony_ci if (preinit) { 10187db96d56Sopenharmony_ci PyPreConfig preconfig; 10197db96d56Sopenharmony_ci PyPreConfig_InitIsolatedConfig(&preconfig); 10207db96d56Sopenharmony_ci 10217db96d56Sopenharmony_ci status = Py_PreInitialize(&preconfig); 10227db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 10237db96d56Sopenharmony_ci Py_ExitStatusException(status); 10247db96d56Sopenharmony_ci } 10257db96d56Sopenharmony_ci 10267db96d56Sopenharmony_ci rt_preconfig = &_PyRuntime.preconfig; 10277db96d56Sopenharmony_ci assert(rt_preconfig->isolated == 1); 10287db96d56Sopenharmony_ci assert(rt_preconfig->use_environment == 0); 10297db96d56Sopenharmony_ci } 10307db96d56Sopenharmony_ci 10317db96d56Sopenharmony_ci PyConfig config; 10327db96d56Sopenharmony_ci PyConfig_InitIsolatedConfig(&config); 10337db96d56Sopenharmony_ci 10347db96d56Sopenharmony_ci config_set_program_name(&config); 10357db96d56Sopenharmony_ci init_from_config_clear(&config); 10367db96d56Sopenharmony_ci 10377db96d56Sopenharmony_ci rt_preconfig = &_PyRuntime.preconfig; 10387db96d56Sopenharmony_ci assert(rt_preconfig->isolated == 1); 10397db96d56Sopenharmony_ci assert(rt_preconfig->use_environment == 0); 10407db96d56Sopenharmony_ci 10417db96d56Sopenharmony_ci dump_config(); 10427db96d56Sopenharmony_ci Py_Finalize(); 10437db96d56Sopenharmony_ci return 0; 10447db96d56Sopenharmony_ci} 10457db96d56Sopenharmony_ci 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_cistatic int test_preinit_isolated_config(void) 10487db96d56Sopenharmony_ci{ 10497db96d56Sopenharmony_ci return check_preinit_isolated_config(1); 10507db96d56Sopenharmony_ci} 10517db96d56Sopenharmony_ci 10527db96d56Sopenharmony_ci 10537db96d56Sopenharmony_cistatic int test_init_isolated_config(void) 10547db96d56Sopenharmony_ci{ 10557db96d56Sopenharmony_ci return check_preinit_isolated_config(0); 10567db96d56Sopenharmony_ci} 10577db96d56Sopenharmony_ci 10587db96d56Sopenharmony_ci 10597db96d56Sopenharmony_cistatic int check_init_python_config(int preinit) 10607db96d56Sopenharmony_ci{ 10617db96d56Sopenharmony_ci /* global configuration variables must be ignored */ 10627db96d56Sopenharmony_ci set_all_global_config_variables(); 10637db96d56Sopenharmony_ci Py_IsolatedFlag = 1; 10647db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 1; 10657db96d56Sopenharmony_ci Py_FrozenFlag = 1; 10667db96d56Sopenharmony_ci Py_UnbufferedStdioFlag = 1; 10677db96d56Sopenharmony_ci Py_NoSiteFlag = 1; 10687db96d56Sopenharmony_ci Py_DontWriteBytecodeFlag = 1; 10697db96d56Sopenharmony_ci Py_NoUserSiteDirectory = 1; 10707db96d56Sopenharmony_ci#ifdef MS_WINDOWS 10717db96d56Sopenharmony_ci Py_LegacyWindowsStdioFlag = 1; 10727db96d56Sopenharmony_ci#endif 10737db96d56Sopenharmony_ci 10747db96d56Sopenharmony_ci if (preinit) { 10757db96d56Sopenharmony_ci PyPreConfig preconfig; 10767db96d56Sopenharmony_ci PyPreConfig_InitPythonConfig(&preconfig); 10777db96d56Sopenharmony_ci 10787db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 10797db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 10807db96d56Sopenharmony_ci Py_ExitStatusException(status); 10817db96d56Sopenharmony_ci } 10827db96d56Sopenharmony_ci } 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_ci PyConfig config; 10857db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 10867db96d56Sopenharmony_ci 10877db96d56Sopenharmony_ci config_set_program_name(&config); 10887db96d56Sopenharmony_ci init_from_config_clear(&config); 10897db96d56Sopenharmony_ci 10907db96d56Sopenharmony_ci dump_config(); 10917db96d56Sopenharmony_ci Py_Finalize(); 10927db96d56Sopenharmony_ci return 0; 10937db96d56Sopenharmony_ci} 10947db96d56Sopenharmony_ci 10957db96d56Sopenharmony_ci 10967db96d56Sopenharmony_cistatic int test_preinit_python_config(void) 10977db96d56Sopenharmony_ci{ 10987db96d56Sopenharmony_ci return check_init_python_config(1); 10997db96d56Sopenharmony_ci} 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci 11027db96d56Sopenharmony_cistatic int test_init_python_config(void) 11037db96d56Sopenharmony_ci{ 11047db96d56Sopenharmony_ci return check_init_python_config(0); 11057db96d56Sopenharmony_ci} 11067db96d56Sopenharmony_ci 11077db96d56Sopenharmony_ci 11087db96d56Sopenharmony_cistatic int test_init_dont_configure_locale(void) 11097db96d56Sopenharmony_ci{ 11107db96d56Sopenharmony_ci PyPreConfig preconfig; 11117db96d56Sopenharmony_ci PyPreConfig_InitPythonConfig(&preconfig); 11127db96d56Sopenharmony_ci 11137db96d56Sopenharmony_ci preconfig.configure_locale = 0; 11147db96d56Sopenharmony_ci preconfig.coerce_c_locale = 1; 11157db96d56Sopenharmony_ci preconfig.coerce_c_locale_warn = 1; 11167db96d56Sopenharmony_ci 11177db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 11187db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 11197db96d56Sopenharmony_ci Py_ExitStatusException(status); 11207db96d56Sopenharmony_ci } 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ci PyConfig config; 11237db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 11247db96d56Sopenharmony_ci 11257db96d56Sopenharmony_ci config_set_program_name(&config); 11267db96d56Sopenharmony_ci init_from_config_clear(&config); 11277db96d56Sopenharmony_ci 11287db96d56Sopenharmony_ci dump_config(); 11297db96d56Sopenharmony_ci Py_Finalize(); 11307db96d56Sopenharmony_ci return 0; 11317db96d56Sopenharmony_ci} 11327db96d56Sopenharmony_ci 11337db96d56Sopenharmony_ci 11347db96d56Sopenharmony_cistatic int test_init_dev_mode(void) 11357db96d56Sopenharmony_ci{ 11367db96d56Sopenharmony_ci PyConfig config; 11377db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 11387db96d56Sopenharmony_ci 11397db96d56Sopenharmony_ci putenv("PYTHONFAULTHANDLER="); 11407db96d56Sopenharmony_ci putenv("PYTHONMALLOC="); 11417db96d56Sopenharmony_ci config.dev_mode = 1; 11427db96d56Sopenharmony_ci config_set_program_name(&config); 11437db96d56Sopenharmony_ci init_from_config_clear(&config); 11447db96d56Sopenharmony_ci 11457db96d56Sopenharmony_ci dump_config(); 11467db96d56Sopenharmony_ci Py_Finalize(); 11477db96d56Sopenharmony_ci return 0; 11487db96d56Sopenharmony_ci} 11497db96d56Sopenharmony_ci 11507db96d56Sopenharmony_cistatic PyObject *_open_code_hook(PyObject *path, void *data) 11517db96d56Sopenharmony_ci{ 11527db96d56Sopenharmony_ci if (PyUnicode_CompareWithASCIIString(path, "$$test-filename") == 0) { 11537db96d56Sopenharmony_ci return PyLong_FromVoidPtr(data); 11547db96d56Sopenharmony_ci } 11557db96d56Sopenharmony_ci PyObject *io = PyImport_ImportModule("_io"); 11567db96d56Sopenharmony_ci if (!io) { 11577db96d56Sopenharmony_ci return NULL; 11587db96d56Sopenharmony_ci } 11597db96d56Sopenharmony_ci return PyObject_CallMethod(io, "open", "Os", path, "rb"); 11607db96d56Sopenharmony_ci} 11617db96d56Sopenharmony_ci 11627db96d56Sopenharmony_cistatic int test_open_code_hook(void) 11637db96d56Sopenharmony_ci{ 11647db96d56Sopenharmony_ci int result = 0; 11657db96d56Sopenharmony_ci 11667db96d56Sopenharmony_ci /* Provide a hook */ 11677db96d56Sopenharmony_ci result = PyFile_SetOpenCodeHook(_open_code_hook, &result); 11687db96d56Sopenharmony_ci if (result) { 11697db96d56Sopenharmony_ci printf("Failed to set hook\n"); 11707db96d56Sopenharmony_ci return 1; 11717db96d56Sopenharmony_ci } 11727db96d56Sopenharmony_ci /* A second hook should fail */ 11737db96d56Sopenharmony_ci result = PyFile_SetOpenCodeHook(_open_code_hook, &result); 11747db96d56Sopenharmony_ci if (!result) { 11757db96d56Sopenharmony_ci printf("Should have failed to set second hook\n"); 11767db96d56Sopenharmony_ci return 2; 11777db96d56Sopenharmony_ci } 11787db96d56Sopenharmony_ci 11797db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 11807db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 11817db96d56Sopenharmony_ci result = 0; 11827db96d56Sopenharmony_ci 11837db96d56Sopenharmony_ci PyObject *r = PyFile_OpenCode("$$test-filename"); 11847db96d56Sopenharmony_ci if (!r) { 11857db96d56Sopenharmony_ci PyErr_Print(); 11867db96d56Sopenharmony_ci result = 3; 11877db96d56Sopenharmony_ci } else { 11887db96d56Sopenharmony_ci void *cmp = PyLong_AsVoidPtr(r); 11897db96d56Sopenharmony_ci Py_DECREF(r); 11907db96d56Sopenharmony_ci if (cmp != &result) { 11917db96d56Sopenharmony_ci printf("Did not get expected result from hook\n"); 11927db96d56Sopenharmony_ci result = 4; 11937db96d56Sopenharmony_ci } 11947db96d56Sopenharmony_ci } 11957db96d56Sopenharmony_ci 11967db96d56Sopenharmony_ci if (!result) { 11977db96d56Sopenharmony_ci PyObject *io = PyImport_ImportModule("_io"); 11987db96d56Sopenharmony_ci PyObject *r = io 11997db96d56Sopenharmony_ci ? PyObject_CallMethod(io, "open_code", "s", "$$test-filename") 12007db96d56Sopenharmony_ci : NULL; 12017db96d56Sopenharmony_ci if (!r) { 12027db96d56Sopenharmony_ci PyErr_Print(); 12037db96d56Sopenharmony_ci result = 5; 12047db96d56Sopenharmony_ci } else { 12057db96d56Sopenharmony_ci void *cmp = PyLong_AsVoidPtr(r); 12067db96d56Sopenharmony_ci Py_DECREF(r); 12077db96d56Sopenharmony_ci if (cmp != &result) { 12087db96d56Sopenharmony_ci printf("Did not get expected result from hook\n"); 12097db96d56Sopenharmony_ci result = 6; 12107db96d56Sopenharmony_ci } 12117db96d56Sopenharmony_ci } 12127db96d56Sopenharmony_ci Py_XDECREF(io); 12137db96d56Sopenharmony_ci } 12147db96d56Sopenharmony_ci 12157db96d56Sopenharmony_ci Py_Finalize(); 12167db96d56Sopenharmony_ci return result; 12177db96d56Sopenharmony_ci} 12187db96d56Sopenharmony_ci 12197db96d56Sopenharmony_cistatic int _audit_hook_clear_count = 0; 12207db96d56Sopenharmony_ci 12217db96d56Sopenharmony_cistatic int _audit_hook(const char *event, PyObject *args, void *userdata) 12227db96d56Sopenharmony_ci{ 12237db96d56Sopenharmony_ci assert(args && PyTuple_CheckExact(args)); 12247db96d56Sopenharmony_ci if (strcmp(event, "_testembed.raise") == 0) { 12257db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Intentional error"); 12267db96d56Sopenharmony_ci return -1; 12277db96d56Sopenharmony_ci } else if (strcmp(event, "_testembed.set") == 0) { 12287db96d56Sopenharmony_ci if (!PyArg_ParseTuple(args, "n", userdata)) { 12297db96d56Sopenharmony_ci return -1; 12307db96d56Sopenharmony_ci } 12317db96d56Sopenharmony_ci return 0; 12327db96d56Sopenharmony_ci } else if (strcmp(event, "cpython._PySys_ClearAuditHooks") == 0) { 12337db96d56Sopenharmony_ci _audit_hook_clear_count += 1; 12347db96d56Sopenharmony_ci } 12357db96d56Sopenharmony_ci return 0; 12367db96d56Sopenharmony_ci} 12377db96d56Sopenharmony_ci 12387db96d56Sopenharmony_cistatic int _test_audit(Py_ssize_t setValue) 12397db96d56Sopenharmony_ci{ 12407db96d56Sopenharmony_ci Py_ssize_t sawSet = 0; 12417db96d56Sopenharmony_ci 12427db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 12437db96d56Sopenharmony_ci PySys_AddAuditHook(_audit_hook, &sawSet); 12447db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 12457db96d56Sopenharmony_ci 12467db96d56Sopenharmony_ci if (PySys_Audit("_testembed.raise", NULL) == 0) { 12477db96d56Sopenharmony_ci printf("No error raised"); 12487db96d56Sopenharmony_ci return 1; 12497db96d56Sopenharmony_ci } 12507db96d56Sopenharmony_ci if (PySys_Audit("_testembed.nop", NULL) != 0) { 12517db96d56Sopenharmony_ci printf("Nop event failed"); 12527db96d56Sopenharmony_ci /* Exception from above may still remain */ 12537db96d56Sopenharmony_ci PyErr_Clear(); 12547db96d56Sopenharmony_ci return 2; 12557db96d56Sopenharmony_ci } 12567db96d56Sopenharmony_ci if (!PyErr_Occurred()) { 12577db96d56Sopenharmony_ci printf("Exception not preserved"); 12587db96d56Sopenharmony_ci return 3; 12597db96d56Sopenharmony_ci } 12607db96d56Sopenharmony_ci PyErr_Clear(); 12617db96d56Sopenharmony_ci 12627db96d56Sopenharmony_ci if (PySys_Audit("_testembed.set", "n", setValue) != 0) { 12637db96d56Sopenharmony_ci PyErr_Print(); 12647db96d56Sopenharmony_ci printf("Set event failed"); 12657db96d56Sopenharmony_ci return 4; 12667db96d56Sopenharmony_ci } 12677db96d56Sopenharmony_ci 12687db96d56Sopenharmony_ci if (sawSet != 42) { 12697db96d56Sopenharmony_ci printf("Failed to see *userData change\n"); 12707db96d56Sopenharmony_ci return 5; 12717db96d56Sopenharmony_ci } 12727db96d56Sopenharmony_ci return 0; 12737db96d56Sopenharmony_ci} 12747db96d56Sopenharmony_ci 12757db96d56Sopenharmony_cistatic int test_audit(void) 12767db96d56Sopenharmony_ci{ 12777db96d56Sopenharmony_ci int result = _test_audit(42); 12787db96d56Sopenharmony_ci Py_Finalize(); 12797db96d56Sopenharmony_ci if (_audit_hook_clear_count != 1) { 12807db96d56Sopenharmony_ci return 0x1000 | _audit_hook_clear_count; 12817db96d56Sopenharmony_ci } 12827db96d56Sopenharmony_ci return result; 12837db96d56Sopenharmony_ci} 12847db96d56Sopenharmony_ci 12857db96d56Sopenharmony_cistatic volatile int _audit_subinterpreter_interpreter_count = 0; 12867db96d56Sopenharmony_ci 12877db96d56Sopenharmony_cistatic int _audit_subinterpreter_hook(const char *event, PyObject *args, void *userdata) 12887db96d56Sopenharmony_ci{ 12897db96d56Sopenharmony_ci printf("%s\n", event); 12907db96d56Sopenharmony_ci if (strcmp(event, "cpython.PyInterpreterState_New") == 0) { 12917db96d56Sopenharmony_ci _audit_subinterpreter_interpreter_count += 1; 12927db96d56Sopenharmony_ci } 12937db96d56Sopenharmony_ci return 0; 12947db96d56Sopenharmony_ci} 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_cistatic int test_audit_subinterpreter(void) 12977db96d56Sopenharmony_ci{ 12987db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 12997db96d56Sopenharmony_ci PySys_AddAuditHook(_audit_subinterpreter_hook, NULL); 13007db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 13017db96d56Sopenharmony_ci 13027db96d56Sopenharmony_ci Py_NewInterpreter(); 13037db96d56Sopenharmony_ci Py_NewInterpreter(); 13047db96d56Sopenharmony_ci Py_NewInterpreter(); 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_ci Py_Finalize(); 13077db96d56Sopenharmony_ci 13087db96d56Sopenharmony_ci switch (_audit_subinterpreter_interpreter_count) { 13097db96d56Sopenharmony_ci case 3: return 0; 13107db96d56Sopenharmony_ci case 0: return -1; 13117db96d56Sopenharmony_ci default: return _audit_subinterpreter_interpreter_count; 13127db96d56Sopenharmony_ci } 13137db96d56Sopenharmony_ci} 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_citypedef struct { 13167db96d56Sopenharmony_ci const char* expected; 13177db96d56Sopenharmony_ci int exit; 13187db96d56Sopenharmony_ci} AuditRunCommandTest; 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_cistatic int _audit_hook_run(const char *eventName, PyObject *args, void *userData) 13217db96d56Sopenharmony_ci{ 13227db96d56Sopenharmony_ci AuditRunCommandTest *test = (AuditRunCommandTest*)userData; 13237db96d56Sopenharmony_ci if (strcmp(eventName, test->expected)) { 13247db96d56Sopenharmony_ci return 0; 13257db96d56Sopenharmony_ci } 13267db96d56Sopenharmony_ci 13277db96d56Sopenharmony_ci if (test->exit) { 13287db96d56Sopenharmony_ci PyObject *msg = PyUnicode_FromFormat("detected %s(%R)", eventName, args); 13297db96d56Sopenharmony_ci if (msg) { 13307db96d56Sopenharmony_ci printf("%s\n", PyUnicode_AsUTF8(msg)); 13317db96d56Sopenharmony_ci Py_DECREF(msg); 13327db96d56Sopenharmony_ci } 13337db96d56Sopenharmony_ci exit(test->exit); 13347db96d56Sopenharmony_ci } 13357db96d56Sopenharmony_ci 13367db96d56Sopenharmony_ci PyErr_Format(PyExc_RuntimeError, "detected %s(%R)", eventName, args); 13377db96d56Sopenharmony_ci return -1; 13387db96d56Sopenharmony_ci} 13397db96d56Sopenharmony_ci 13407db96d56Sopenharmony_cistatic int test_audit_run_command(void) 13417db96d56Sopenharmony_ci{ 13427db96d56Sopenharmony_ci AuditRunCommandTest test = {"cpython.run_command"}; 13437db96d56Sopenharmony_ci wchar_t *argv[] = {PROGRAM_NAME, L"-c", L"pass"}; 13447db96d56Sopenharmony_ci 13457db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 13467db96d56Sopenharmony_ci PySys_AddAuditHook(_audit_hook_run, (void*)&test); 13477db96d56Sopenharmony_ci 13487db96d56Sopenharmony_ci return Py_Main(Py_ARRAY_LENGTH(argv), argv); 13497db96d56Sopenharmony_ci} 13507db96d56Sopenharmony_ci 13517db96d56Sopenharmony_cistatic int test_audit_run_file(void) 13527db96d56Sopenharmony_ci{ 13537db96d56Sopenharmony_ci AuditRunCommandTest test = {"cpython.run_file"}; 13547db96d56Sopenharmony_ci wchar_t *argv[] = {PROGRAM_NAME, L"filename.py"}; 13557db96d56Sopenharmony_ci 13567db96d56Sopenharmony_ci Py_IgnoreEnvironmentFlag = 0; 13577db96d56Sopenharmony_ci PySys_AddAuditHook(_audit_hook_run, (void*)&test); 13587db96d56Sopenharmony_ci 13597db96d56Sopenharmony_ci return Py_Main(Py_ARRAY_LENGTH(argv), argv); 13607db96d56Sopenharmony_ci} 13617db96d56Sopenharmony_ci 13627db96d56Sopenharmony_cistatic int run_audit_run_test(int argc, wchar_t **argv, void *test) 13637db96d56Sopenharmony_ci{ 13647db96d56Sopenharmony_ci PyConfig config; 13657db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 13667db96d56Sopenharmony_ci 13677db96d56Sopenharmony_ci config.argv.length = argc; 13687db96d56Sopenharmony_ci config.argv.items = argv; 13697db96d56Sopenharmony_ci config.parse_argv = 1; 13707db96d56Sopenharmony_ci config.program_name = argv[0]; 13717db96d56Sopenharmony_ci config.interactive = 1; 13727db96d56Sopenharmony_ci config.isolated = 0; 13737db96d56Sopenharmony_ci config.use_environment = 1; 13747db96d56Sopenharmony_ci config.quiet = 1; 13757db96d56Sopenharmony_ci 13767db96d56Sopenharmony_ci PySys_AddAuditHook(_audit_hook_run, test); 13777db96d56Sopenharmony_ci 13787db96d56Sopenharmony_ci PyStatus status = Py_InitializeFromConfig(&config); 13797db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 13807db96d56Sopenharmony_ci Py_ExitStatusException(status); 13817db96d56Sopenharmony_ci } 13827db96d56Sopenharmony_ci 13837db96d56Sopenharmony_ci return Py_RunMain(); 13847db96d56Sopenharmony_ci} 13857db96d56Sopenharmony_ci 13867db96d56Sopenharmony_cistatic int test_audit_run_interactivehook(void) 13877db96d56Sopenharmony_ci{ 13887db96d56Sopenharmony_ci AuditRunCommandTest test = {"cpython.run_interactivehook", 10}; 13897db96d56Sopenharmony_ci wchar_t *argv[] = {PROGRAM_NAME}; 13907db96d56Sopenharmony_ci return run_audit_run_test(Py_ARRAY_LENGTH(argv), argv, &test); 13917db96d56Sopenharmony_ci} 13927db96d56Sopenharmony_ci 13937db96d56Sopenharmony_cistatic int test_audit_run_startup(void) 13947db96d56Sopenharmony_ci{ 13957db96d56Sopenharmony_ci AuditRunCommandTest test = {"cpython.run_startup", 10}; 13967db96d56Sopenharmony_ci wchar_t *argv[] = {PROGRAM_NAME}; 13977db96d56Sopenharmony_ci return run_audit_run_test(Py_ARRAY_LENGTH(argv), argv, &test); 13987db96d56Sopenharmony_ci} 13997db96d56Sopenharmony_ci 14007db96d56Sopenharmony_cistatic int test_audit_run_stdin(void) 14017db96d56Sopenharmony_ci{ 14027db96d56Sopenharmony_ci AuditRunCommandTest test = {"cpython.run_stdin"}; 14037db96d56Sopenharmony_ci wchar_t *argv[] = {PROGRAM_NAME}; 14047db96d56Sopenharmony_ci return run_audit_run_test(Py_ARRAY_LENGTH(argv), argv, &test); 14057db96d56Sopenharmony_ci} 14067db96d56Sopenharmony_ci 14077db96d56Sopenharmony_cistatic int test_init_read_set(void) 14087db96d56Sopenharmony_ci{ 14097db96d56Sopenharmony_ci PyStatus status; 14107db96d56Sopenharmony_ci PyConfig config; 14117db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 14127db96d56Sopenharmony_ci 14137db96d56Sopenharmony_ci status = PyConfig_SetBytesString(&config, &config.program_name, 14147db96d56Sopenharmony_ci "./init_read_set"); 14157db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14167db96d56Sopenharmony_ci goto fail; 14177db96d56Sopenharmony_ci } 14187db96d56Sopenharmony_ci 14197db96d56Sopenharmony_ci status = PyConfig_Read(&config); 14207db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14217db96d56Sopenharmony_ci goto fail; 14227db96d56Sopenharmony_ci } 14237db96d56Sopenharmony_ci 14247db96d56Sopenharmony_ci status = PyWideStringList_Insert(&config.module_search_paths, 14257db96d56Sopenharmony_ci 1, L"test_path_insert1"); 14267db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14277db96d56Sopenharmony_ci goto fail; 14287db96d56Sopenharmony_ci } 14297db96d56Sopenharmony_ci 14307db96d56Sopenharmony_ci status = PyWideStringList_Append(&config.module_search_paths, 14317db96d56Sopenharmony_ci L"test_path_append"); 14327db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14337db96d56Sopenharmony_ci goto fail; 14347db96d56Sopenharmony_ci } 14357db96d56Sopenharmony_ci 14367db96d56Sopenharmony_ci /* override executable computed by PyConfig_Read() */ 14377db96d56Sopenharmony_ci config_set_string(&config, &config.executable, L"my_executable"); 14387db96d56Sopenharmony_ci init_from_config_clear(&config); 14397db96d56Sopenharmony_ci 14407db96d56Sopenharmony_ci dump_config(); 14417db96d56Sopenharmony_ci Py_Finalize(); 14427db96d56Sopenharmony_ci return 0; 14437db96d56Sopenharmony_ci 14447db96d56Sopenharmony_cifail: 14457db96d56Sopenharmony_ci PyConfig_Clear(&config); 14467db96d56Sopenharmony_ci Py_ExitStatusException(status); 14477db96d56Sopenharmony_ci} 14487db96d56Sopenharmony_ci 14497db96d56Sopenharmony_ci 14507db96d56Sopenharmony_cistatic int test_init_sys_add(void) 14517db96d56Sopenharmony_ci{ 14527db96d56Sopenharmony_ci PySys_AddXOption(L"sysadd_xoption"); 14537db96d56Sopenharmony_ci PySys_AddXOption(L"faulthandler"); 14547db96d56Sopenharmony_ci PySys_AddWarnOption(L"ignore:::sysadd_warnoption"); 14557db96d56Sopenharmony_ci 14567db96d56Sopenharmony_ci PyConfig config; 14577db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 14587db96d56Sopenharmony_ci 14597db96d56Sopenharmony_ci wchar_t* argv[] = { 14607db96d56Sopenharmony_ci L"python3", 14617db96d56Sopenharmony_ci L"-W", 14627db96d56Sopenharmony_ci L"ignore:::cmdline_warnoption", 14637db96d56Sopenharmony_ci L"-X", 14647db96d56Sopenharmony_ci L"cmdline_xoption", 14657db96d56Sopenharmony_ci }; 14667db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 14677db96d56Sopenharmony_ci config.parse_argv = 1; 14687db96d56Sopenharmony_ci 14697db96d56Sopenharmony_ci PyStatus status; 14707db96d56Sopenharmony_ci status = PyWideStringList_Append(&config.xoptions, 14717db96d56Sopenharmony_ci L"config_xoption"); 14727db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14737db96d56Sopenharmony_ci goto fail; 14747db96d56Sopenharmony_ci } 14757db96d56Sopenharmony_ci 14767db96d56Sopenharmony_ci status = PyWideStringList_Append(&config.warnoptions, 14777db96d56Sopenharmony_ci L"ignore:::config_warnoption"); 14787db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 14797db96d56Sopenharmony_ci goto fail; 14807db96d56Sopenharmony_ci } 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci config_set_program_name(&config); 14837db96d56Sopenharmony_ci init_from_config_clear(&config); 14847db96d56Sopenharmony_ci 14857db96d56Sopenharmony_ci dump_config(); 14867db96d56Sopenharmony_ci Py_Finalize(); 14877db96d56Sopenharmony_ci return 0; 14887db96d56Sopenharmony_ci 14897db96d56Sopenharmony_cifail: 14907db96d56Sopenharmony_ci PyConfig_Clear(&config); 14917db96d56Sopenharmony_ci Py_ExitStatusException(status); 14927db96d56Sopenharmony_ci} 14937db96d56Sopenharmony_ci 14947db96d56Sopenharmony_ci 14957db96d56Sopenharmony_cistatic int test_init_setpath(void) 14967db96d56Sopenharmony_ci{ 14977db96d56Sopenharmony_ci char *env = getenv("TESTPATH"); 14987db96d56Sopenharmony_ci if (!env) { 14997db96d56Sopenharmony_ci error("missing TESTPATH env var"); 15007db96d56Sopenharmony_ci return 1; 15017db96d56Sopenharmony_ci } 15027db96d56Sopenharmony_ci wchar_t *path = Py_DecodeLocale(env, NULL); 15037db96d56Sopenharmony_ci if (path == NULL) { 15047db96d56Sopenharmony_ci error("failed to decode TESTPATH"); 15057db96d56Sopenharmony_ci return 1; 15067db96d56Sopenharmony_ci } 15077db96d56Sopenharmony_ci Py_SetPath(path); 15087db96d56Sopenharmony_ci PyMem_RawFree(path); 15097db96d56Sopenharmony_ci putenv("TESTPATH="); 15107db96d56Sopenharmony_ci 15117db96d56Sopenharmony_ci Py_Initialize(); 15127db96d56Sopenharmony_ci dump_config(); 15137db96d56Sopenharmony_ci Py_Finalize(); 15147db96d56Sopenharmony_ci return 0; 15157db96d56Sopenharmony_ci} 15167db96d56Sopenharmony_ci 15177db96d56Sopenharmony_ci 15187db96d56Sopenharmony_cistatic int test_init_setpath_config(void) 15197db96d56Sopenharmony_ci{ 15207db96d56Sopenharmony_ci PyPreConfig preconfig; 15217db96d56Sopenharmony_ci PyPreConfig_InitPythonConfig(&preconfig); 15227db96d56Sopenharmony_ci 15237db96d56Sopenharmony_ci /* Explicitly preinitializes with Python preconfiguration to avoid 15247db96d56Sopenharmony_ci Py_SetPath() implicit preinitialization with compat preconfiguration. */ 15257db96d56Sopenharmony_ci PyStatus status = Py_PreInitialize(&preconfig); 15267db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 15277db96d56Sopenharmony_ci Py_ExitStatusException(status); 15287db96d56Sopenharmony_ci } 15297db96d56Sopenharmony_ci 15307db96d56Sopenharmony_ci char *env = getenv("TESTPATH"); 15317db96d56Sopenharmony_ci if (!env) { 15327db96d56Sopenharmony_ci error("missing TESTPATH env var"); 15337db96d56Sopenharmony_ci return 1; 15347db96d56Sopenharmony_ci } 15357db96d56Sopenharmony_ci wchar_t *path = Py_DecodeLocale(env, NULL); 15367db96d56Sopenharmony_ci if (path == NULL) { 15377db96d56Sopenharmony_ci error("failed to decode TESTPATH"); 15387db96d56Sopenharmony_ci return 1; 15397db96d56Sopenharmony_ci } 15407db96d56Sopenharmony_ci Py_SetPath(path); 15417db96d56Sopenharmony_ci PyMem_RawFree(path); 15427db96d56Sopenharmony_ci putenv("TESTPATH="); 15437db96d56Sopenharmony_ci 15447db96d56Sopenharmony_ci PyConfig config; 15457db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 15467db96d56Sopenharmony_ci 15477db96d56Sopenharmony_ci config_set_string(&config, &config.program_name, L"conf_program_name"); 15487db96d56Sopenharmony_ci config_set_string(&config, &config.executable, L"conf_executable"); 15497db96d56Sopenharmony_ci init_from_config_clear(&config); 15507db96d56Sopenharmony_ci 15517db96d56Sopenharmony_ci dump_config(); 15527db96d56Sopenharmony_ci Py_Finalize(); 15537db96d56Sopenharmony_ci return 0; 15547db96d56Sopenharmony_ci} 15557db96d56Sopenharmony_ci 15567db96d56Sopenharmony_ci 15577db96d56Sopenharmony_cistatic int test_init_setpythonhome(void) 15587db96d56Sopenharmony_ci{ 15597db96d56Sopenharmony_ci char *env = getenv("TESTHOME"); 15607db96d56Sopenharmony_ci if (!env) { 15617db96d56Sopenharmony_ci error("missing TESTHOME env var"); 15627db96d56Sopenharmony_ci return 1; 15637db96d56Sopenharmony_ci } 15647db96d56Sopenharmony_ci wchar_t *home = Py_DecodeLocale(env, NULL); 15657db96d56Sopenharmony_ci if (home == NULL) { 15667db96d56Sopenharmony_ci error("failed to decode TESTHOME"); 15677db96d56Sopenharmony_ci return 1; 15687db96d56Sopenharmony_ci } 15697db96d56Sopenharmony_ci Py_SetPythonHome(home); 15707db96d56Sopenharmony_ci PyMem_RawFree(home); 15717db96d56Sopenharmony_ci putenv("TESTHOME="); 15727db96d56Sopenharmony_ci 15737db96d56Sopenharmony_ci Py_Initialize(); 15747db96d56Sopenharmony_ci dump_config(); 15757db96d56Sopenharmony_ci Py_Finalize(); 15767db96d56Sopenharmony_ci return 0; 15777db96d56Sopenharmony_ci} 15787db96d56Sopenharmony_ci 15797db96d56Sopenharmony_ci 15807db96d56Sopenharmony_cistatic int test_init_is_python_build(void) 15817db96d56Sopenharmony_ci{ 15827db96d56Sopenharmony_ci // gh-91985: in-tree builds fail to check for build directory landmarks 15837db96d56Sopenharmony_ci // under the effect of 'home' or PYTHONHOME environment variable. 15847db96d56Sopenharmony_ci char *env = getenv("TESTHOME"); 15857db96d56Sopenharmony_ci if (!env) { 15867db96d56Sopenharmony_ci error("missing TESTHOME env var"); 15877db96d56Sopenharmony_ci return 1; 15887db96d56Sopenharmony_ci } 15897db96d56Sopenharmony_ci wchar_t *home = Py_DecodeLocale(env, NULL); 15907db96d56Sopenharmony_ci if (home == NULL) { 15917db96d56Sopenharmony_ci error("failed to decode TESTHOME"); 15927db96d56Sopenharmony_ci return 1; 15937db96d56Sopenharmony_ci } 15947db96d56Sopenharmony_ci 15957db96d56Sopenharmony_ci PyConfig config; 15967db96d56Sopenharmony_ci _PyConfig_InitCompatConfig(&config); 15977db96d56Sopenharmony_ci config_set_program_name(&config); 15987db96d56Sopenharmony_ci config_set_string(&config, &config.home, home); 15997db96d56Sopenharmony_ci PyMem_RawFree(home); 16007db96d56Sopenharmony_ci putenv("TESTHOME="); 16017db96d56Sopenharmony_ci 16027db96d56Sopenharmony_ci // Use an impossible value so we can detect whether it isn't updated 16037db96d56Sopenharmony_ci // during initialization. 16047db96d56Sopenharmony_ci config._is_python_build = INT_MAX; 16057db96d56Sopenharmony_ci env = getenv("NEGATIVE_ISPYTHONBUILD"); 16067db96d56Sopenharmony_ci if (env && strcmp(env, "0") != 0) { 16077db96d56Sopenharmony_ci config._is_python_build = INT_MIN; 16087db96d56Sopenharmony_ci } 16097db96d56Sopenharmony_ci init_from_config_clear(&config); 16107db96d56Sopenharmony_ci Py_Finalize(); 16117db96d56Sopenharmony_ci // Second initialization 16127db96d56Sopenharmony_ci config._is_python_build = -1; 16137db96d56Sopenharmony_ci init_from_config_clear(&config); 16147db96d56Sopenharmony_ci dump_config(); // home and _is_python_build are cached in _Py_path_config 16157db96d56Sopenharmony_ci Py_Finalize(); 16167db96d56Sopenharmony_ci return 0; 16177db96d56Sopenharmony_ci} 16187db96d56Sopenharmony_ci 16197db96d56Sopenharmony_ci 16207db96d56Sopenharmony_cistatic int test_init_warnoptions(void) 16217db96d56Sopenharmony_ci{ 16227db96d56Sopenharmony_ci putenv("PYTHONWARNINGS=ignore:::env1,ignore:::env2"); 16237db96d56Sopenharmony_ci 16247db96d56Sopenharmony_ci PySys_AddWarnOption(L"ignore:::PySys_AddWarnOption1"); 16257db96d56Sopenharmony_ci PySys_AddWarnOption(L"ignore:::PySys_AddWarnOption2"); 16267db96d56Sopenharmony_ci 16277db96d56Sopenharmony_ci PyConfig config; 16287db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 16297db96d56Sopenharmony_ci 16307db96d56Sopenharmony_ci config.dev_mode = 1; 16317db96d56Sopenharmony_ci config.bytes_warning = 1; 16327db96d56Sopenharmony_ci 16337db96d56Sopenharmony_ci config_set_program_name(&config); 16347db96d56Sopenharmony_ci 16357db96d56Sopenharmony_ci PyStatus status; 16367db96d56Sopenharmony_ci status = PyWideStringList_Append(&config.warnoptions, 16377db96d56Sopenharmony_ci L"ignore:::PyConfig_BeforeRead"); 16387db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 16397db96d56Sopenharmony_ci Py_ExitStatusException(status); 16407db96d56Sopenharmony_ci } 16417db96d56Sopenharmony_ci 16427db96d56Sopenharmony_ci wchar_t* argv[] = { 16437db96d56Sopenharmony_ci L"python3", 16447db96d56Sopenharmony_ci L"-Wignore:::cmdline1", 16457db96d56Sopenharmony_ci L"-Wignore:::cmdline2"}; 16467db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 16477db96d56Sopenharmony_ci config.parse_argv = 1; 16487db96d56Sopenharmony_ci 16497db96d56Sopenharmony_ci status = PyConfig_Read(&config); 16507db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 16517db96d56Sopenharmony_ci Py_ExitStatusException(status); 16527db96d56Sopenharmony_ci } 16537db96d56Sopenharmony_ci 16547db96d56Sopenharmony_ci status = PyWideStringList_Append(&config.warnoptions, 16557db96d56Sopenharmony_ci L"ignore:::PyConfig_AfterRead"); 16567db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 16577db96d56Sopenharmony_ci Py_ExitStatusException(status); 16587db96d56Sopenharmony_ci } 16597db96d56Sopenharmony_ci 16607db96d56Sopenharmony_ci status = PyWideStringList_Insert(&config.warnoptions, 16617db96d56Sopenharmony_ci 0, L"ignore:::PyConfig_Insert0"); 16627db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 16637db96d56Sopenharmony_ci Py_ExitStatusException(status); 16647db96d56Sopenharmony_ci } 16657db96d56Sopenharmony_ci 16667db96d56Sopenharmony_ci init_from_config_clear(&config); 16677db96d56Sopenharmony_ci dump_config(); 16687db96d56Sopenharmony_ci Py_Finalize(); 16697db96d56Sopenharmony_ci return 0; 16707db96d56Sopenharmony_ci} 16717db96d56Sopenharmony_ci 16727db96d56Sopenharmony_ci 16737db96d56Sopenharmony_cistatic int tune_config(void) 16747db96d56Sopenharmony_ci{ 16757db96d56Sopenharmony_ci PyConfig config; 16767db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 16777db96d56Sopenharmony_ci if (_PyInterpreterState_GetConfigCopy(&config) < 0) { 16787db96d56Sopenharmony_ci PyConfig_Clear(&config); 16797db96d56Sopenharmony_ci PyErr_Print(); 16807db96d56Sopenharmony_ci return -1; 16817db96d56Sopenharmony_ci } 16827db96d56Sopenharmony_ci 16837db96d56Sopenharmony_ci config.bytes_warning = 2; 16847db96d56Sopenharmony_ci 16857db96d56Sopenharmony_ci if (_PyInterpreterState_SetConfig(&config) < 0) { 16867db96d56Sopenharmony_ci PyConfig_Clear(&config); 16877db96d56Sopenharmony_ci return -1; 16887db96d56Sopenharmony_ci } 16897db96d56Sopenharmony_ci PyConfig_Clear(&config); 16907db96d56Sopenharmony_ci return 0; 16917db96d56Sopenharmony_ci} 16927db96d56Sopenharmony_ci 16937db96d56Sopenharmony_ci 16947db96d56Sopenharmony_cistatic int test_init_set_config(void) 16957db96d56Sopenharmony_ci{ 16967db96d56Sopenharmony_ci // Initialize core 16977db96d56Sopenharmony_ci PyConfig config; 16987db96d56Sopenharmony_ci PyConfig_InitIsolatedConfig(&config); 16997db96d56Sopenharmony_ci config_set_string(&config, &config.program_name, PROGRAM_NAME); 17007db96d56Sopenharmony_ci config._init_main = 0; 17017db96d56Sopenharmony_ci config.bytes_warning = 0; 17027db96d56Sopenharmony_ci init_from_config_clear(&config); 17037db96d56Sopenharmony_ci 17047db96d56Sopenharmony_ci // Tune the configuration using _PyInterpreterState_SetConfig() 17057db96d56Sopenharmony_ci if (tune_config() < 0) { 17067db96d56Sopenharmony_ci PyErr_Print(); 17077db96d56Sopenharmony_ci return 1; 17087db96d56Sopenharmony_ci } 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci // Finish initialization: main part 17117db96d56Sopenharmony_ci PyStatus status = _Py_InitializeMain(); 17127db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 17137db96d56Sopenharmony_ci Py_ExitStatusException(status); 17147db96d56Sopenharmony_ci } 17157db96d56Sopenharmony_ci 17167db96d56Sopenharmony_ci dump_config(); 17177db96d56Sopenharmony_ci Py_Finalize(); 17187db96d56Sopenharmony_ci return 0; 17197db96d56Sopenharmony_ci} 17207db96d56Sopenharmony_ci 17217db96d56Sopenharmony_ci 17227db96d56Sopenharmony_cistatic void configure_init_main(PyConfig *config) 17237db96d56Sopenharmony_ci{ 17247db96d56Sopenharmony_ci wchar_t* argv[] = { 17257db96d56Sopenharmony_ci L"python3", L"-c", 17267db96d56Sopenharmony_ci (L"import _testinternalcapi, json; " 17277db96d56Sopenharmony_ci L"print(json.dumps(_testinternalcapi.get_configs()))"), 17287db96d56Sopenharmony_ci L"arg2"}; 17297db96d56Sopenharmony_ci 17307db96d56Sopenharmony_ci config->parse_argv = 1; 17317db96d56Sopenharmony_ci 17327db96d56Sopenharmony_ci config_set_argv(config, Py_ARRAY_LENGTH(argv), argv); 17337db96d56Sopenharmony_ci config_set_string(config, &config->program_name, L"./python3"); 17347db96d56Sopenharmony_ci} 17357db96d56Sopenharmony_ci 17367db96d56Sopenharmony_ci 17377db96d56Sopenharmony_cistatic int test_init_run_main(void) 17387db96d56Sopenharmony_ci{ 17397db96d56Sopenharmony_ci PyConfig config; 17407db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 17417db96d56Sopenharmony_ci 17427db96d56Sopenharmony_ci configure_init_main(&config); 17437db96d56Sopenharmony_ci init_from_config_clear(&config); 17447db96d56Sopenharmony_ci 17457db96d56Sopenharmony_ci return Py_RunMain(); 17467db96d56Sopenharmony_ci} 17477db96d56Sopenharmony_ci 17487db96d56Sopenharmony_ci 17497db96d56Sopenharmony_cistatic int test_init_main(void) 17507db96d56Sopenharmony_ci{ 17517db96d56Sopenharmony_ci PyConfig config; 17527db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 17537db96d56Sopenharmony_ci 17547db96d56Sopenharmony_ci configure_init_main(&config); 17557db96d56Sopenharmony_ci config._init_main = 0; 17567db96d56Sopenharmony_ci init_from_config_clear(&config); 17577db96d56Sopenharmony_ci 17587db96d56Sopenharmony_ci /* sys.stdout don't exist yet: it is created by _Py_InitializeMain() */ 17597db96d56Sopenharmony_ci int res = PyRun_SimpleString( 17607db96d56Sopenharmony_ci "import sys; " 17617db96d56Sopenharmony_ci "print('Run Python code before _Py_InitializeMain', " 17627db96d56Sopenharmony_ci "file=sys.stderr)"); 17637db96d56Sopenharmony_ci if (res < 0) { 17647db96d56Sopenharmony_ci exit(1); 17657db96d56Sopenharmony_ci } 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci PyStatus status = _Py_InitializeMain(); 17687db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 17697db96d56Sopenharmony_ci Py_ExitStatusException(status); 17707db96d56Sopenharmony_ci } 17717db96d56Sopenharmony_ci 17727db96d56Sopenharmony_ci return Py_RunMain(); 17737db96d56Sopenharmony_ci} 17747db96d56Sopenharmony_ci 17757db96d56Sopenharmony_ci 17767db96d56Sopenharmony_cistatic int test_run_main(void) 17777db96d56Sopenharmony_ci{ 17787db96d56Sopenharmony_ci PyConfig config; 17797db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 17807db96d56Sopenharmony_ci 17817db96d56Sopenharmony_ci wchar_t *argv[] = {L"python3", L"-c", 17827db96d56Sopenharmony_ci (L"import sys; " 17837db96d56Sopenharmony_ci L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), 17847db96d56Sopenharmony_ci L"arg2"}; 17857db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 17867db96d56Sopenharmony_ci config_set_string(&config, &config.program_name, L"./python3"); 17877db96d56Sopenharmony_ci init_from_config_clear(&config); 17887db96d56Sopenharmony_ci 17897db96d56Sopenharmony_ci return Py_RunMain(); 17907db96d56Sopenharmony_ci} 17917db96d56Sopenharmony_ci 17927db96d56Sopenharmony_ci 17937db96d56Sopenharmony_cistatic int test_run_main_loop(void) 17947db96d56Sopenharmony_ci{ 17957db96d56Sopenharmony_ci // bpo-40413: Calling Py_InitializeFromConfig()+Py_RunMain() multiple 17967db96d56Sopenharmony_ci // times must not crash. 17977db96d56Sopenharmony_ci for (int i=0; i<5; i++) { 17987db96d56Sopenharmony_ci int exitcode = test_run_main(); 17997db96d56Sopenharmony_ci if (exitcode != 0) { 18007db96d56Sopenharmony_ci return exitcode; 18017db96d56Sopenharmony_ci } 18027db96d56Sopenharmony_ci } 18037db96d56Sopenharmony_ci return 0; 18047db96d56Sopenharmony_ci} 18057db96d56Sopenharmony_ci 18067db96d56Sopenharmony_ci 18077db96d56Sopenharmony_cistatic int test_get_argc_argv(void) 18087db96d56Sopenharmony_ci{ 18097db96d56Sopenharmony_ci PyConfig config; 18107db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 18117db96d56Sopenharmony_ci 18127db96d56Sopenharmony_ci wchar_t *argv[] = {L"python3", L"-c", L"pass", L"arg2"}; 18137db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 18147db96d56Sopenharmony_ci config_set_string(&config, &config.program_name, L"./python3"); 18157db96d56Sopenharmony_ci 18167db96d56Sopenharmony_ci // Calling PyConfig_Read() twice must not change Py_GetArgcArgv() result. 18177db96d56Sopenharmony_ci // The second call is done by Py_InitializeFromConfig(). 18187db96d56Sopenharmony_ci PyStatus status = PyConfig_Read(&config); 18197db96d56Sopenharmony_ci if (PyStatus_Exception(status)) { 18207db96d56Sopenharmony_ci PyConfig_Clear(&config); 18217db96d56Sopenharmony_ci Py_ExitStatusException(status); 18227db96d56Sopenharmony_ci } 18237db96d56Sopenharmony_ci 18247db96d56Sopenharmony_ci init_from_config_clear(&config); 18257db96d56Sopenharmony_ci 18267db96d56Sopenharmony_ci int get_argc; 18277db96d56Sopenharmony_ci wchar_t **get_argv; 18287db96d56Sopenharmony_ci Py_GetArgcArgv(&get_argc, &get_argv); 18297db96d56Sopenharmony_ci printf("argc: %i\n", get_argc); 18307db96d56Sopenharmony_ci assert(get_argc == Py_ARRAY_LENGTH(argv)); 18317db96d56Sopenharmony_ci for (int i=0; i < get_argc; i++) { 18327db96d56Sopenharmony_ci printf("argv[%i]: %ls\n", i, get_argv[i]); 18337db96d56Sopenharmony_ci assert(wcscmp(get_argv[i], argv[i]) == 0); 18347db96d56Sopenharmony_ci } 18357db96d56Sopenharmony_ci 18367db96d56Sopenharmony_ci Py_Finalize(); 18377db96d56Sopenharmony_ci 18387db96d56Sopenharmony_ci printf("\n"); 18397db96d56Sopenharmony_ci printf("test ok\n"); 18407db96d56Sopenharmony_ci return 0; 18417db96d56Sopenharmony_ci} 18427db96d56Sopenharmony_ci 18437db96d56Sopenharmony_ci 18447db96d56Sopenharmony_cistatic int check_use_frozen_modules(const char *rawval) 18457db96d56Sopenharmony_ci{ 18467db96d56Sopenharmony_ci wchar_t optval[100]; 18477db96d56Sopenharmony_ci if (rawval == NULL) { 18487db96d56Sopenharmony_ci wcscpy(optval, L"frozen_modules"); 18497db96d56Sopenharmony_ci } 18507db96d56Sopenharmony_ci else if (swprintf(optval, 100, 18517db96d56Sopenharmony_ci#if defined(_MSC_VER) 18527db96d56Sopenharmony_ci L"frozen_modules=%S", 18537db96d56Sopenharmony_ci#else 18547db96d56Sopenharmony_ci L"frozen_modules=%s", 18557db96d56Sopenharmony_ci#endif 18567db96d56Sopenharmony_ci rawval) < 0) { 18577db96d56Sopenharmony_ci error("rawval is too long"); 18587db96d56Sopenharmony_ci return -1; 18597db96d56Sopenharmony_ci } 18607db96d56Sopenharmony_ci 18617db96d56Sopenharmony_ci PyConfig config; 18627db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 18637db96d56Sopenharmony_ci 18647db96d56Sopenharmony_ci config.parse_argv = 1; 18657db96d56Sopenharmony_ci 18667db96d56Sopenharmony_ci wchar_t* argv[] = { 18677db96d56Sopenharmony_ci L"./argv0", 18687db96d56Sopenharmony_ci L"-X", 18697db96d56Sopenharmony_ci optval, 18707db96d56Sopenharmony_ci L"-c", 18717db96d56Sopenharmony_ci L"pass", 18727db96d56Sopenharmony_ci }; 18737db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 18747db96d56Sopenharmony_ci init_from_config_clear(&config); 18757db96d56Sopenharmony_ci 18767db96d56Sopenharmony_ci dump_config(); 18777db96d56Sopenharmony_ci Py_Finalize(); 18787db96d56Sopenharmony_ci return 0; 18797db96d56Sopenharmony_ci} 18807db96d56Sopenharmony_ci 18817db96d56Sopenharmony_cistatic int test_init_use_frozen_modules(void) 18827db96d56Sopenharmony_ci{ 18837db96d56Sopenharmony_ci const char *envvar = getenv("TESTFROZEN"); 18847db96d56Sopenharmony_ci return check_use_frozen_modules(envvar); 18857db96d56Sopenharmony_ci} 18867db96d56Sopenharmony_ci 18877db96d56Sopenharmony_ci 18887db96d56Sopenharmony_cistatic int test_unicode_id_init(void) 18897db96d56Sopenharmony_ci{ 18907db96d56Sopenharmony_ci // bpo-42882: Test that _PyUnicode_FromId() works 18917db96d56Sopenharmony_ci // when Python is initialized multiples times. 18927db96d56Sopenharmony_ci _Py_IDENTIFIER(test_unicode_id_init); 18937db96d56Sopenharmony_ci 18947db96d56Sopenharmony_ci // Initialize Python once without using the identifier 18957db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 18967db96d56Sopenharmony_ci Py_Finalize(); 18977db96d56Sopenharmony_ci 18987db96d56Sopenharmony_ci // Now initialize Python multiple times and use the identifier. 18997db96d56Sopenharmony_ci // The first _PyUnicode_FromId() call initializes the identifier index. 19007db96d56Sopenharmony_ci for (int i=0; i<3; i++) { 19017db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 19027db96d56Sopenharmony_ci 19037db96d56Sopenharmony_ci PyObject *str1, *str2; 19047db96d56Sopenharmony_ci 19057db96d56Sopenharmony_ci str1 = _PyUnicode_FromId(&PyId_test_unicode_id_init); 19067db96d56Sopenharmony_ci assert(str1 != NULL); 19077db96d56Sopenharmony_ci assert(Py_REFCNT(str1) == 1); 19087db96d56Sopenharmony_ci 19097db96d56Sopenharmony_ci str2 = PyUnicode_FromString("test_unicode_id_init"); 19107db96d56Sopenharmony_ci assert(str2 != NULL); 19117db96d56Sopenharmony_ci 19127db96d56Sopenharmony_ci assert(PyUnicode_Compare(str1, str2) == 0); 19137db96d56Sopenharmony_ci 19147db96d56Sopenharmony_ci // str1 is a borrowed reference 19157db96d56Sopenharmony_ci Py_DECREF(str2); 19167db96d56Sopenharmony_ci 19177db96d56Sopenharmony_ci Py_Finalize(); 19187db96d56Sopenharmony_ci } 19197db96d56Sopenharmony_ci return 0; 19207db96d56Sopenharmony_ci} 19217db96d56Sopenharmony_ci 19227db96d56Sopenharmony_ci 19237db96d56Sopenharmony_ci#ifndef MS_WINDOWS 19247db96d56Sopenharmony_ci#include "test_frozenmain.h" // M_test_frozenmain 19257db96d56Sopenharmony_ci 19267db96d56Sopenharmony_cistatic int test_frozenmain(void) 19277db96d56Sopenharmony_ci{ 19287db96d56Sopenharmony_ci static struct _frozen frozen_modules[4] = { 19297db96d56Sopenharmony_ci {"__main__", M_test_frozenmain, sizeof(M_test_frozenmain)}, 19307db96d56Sopenharmony_ci {0, 0, 0} // sentinel 19317db96d56Sopenharmony_ci }; 19327db96d56Sopenharmony_ci 19337db96d56Sopenharmony_ci char* argv[] = { 19347db96d56Sopenharmony_ci "./argv0", 19357db96d56Sopenharmony_ci "-E", 19367db96d56Sopenharmony_ci "arg1", 19377db96d56Sopenharmony_ci "arg2", 19387db96d56Sopenharmony_ci }; 19397db96d56Sopenharmony_ci PyImport_FrozenModules = frozen_modules; 19407db96d56Sopenharmony_ci return Py_FrozenMain(Py_ARRAY_LENGTH(argv), argv); 19417db96d56Sopenharmony_ci} 19427db96d56Sopenharmony_ci#endif // !MS_WINDOWS 19437db96d56Sopenharmony_ci 19447db96d56Sopenharmony_cistatic int test_repeated_init_and_inittab(void) 19457db96d56Sopenharmony_ci{ 19467db96d56Sopenharmony_ci // bpo-44441: Py_RunMain() must reset PyImport_Inittab at exit. 19477db96d56Sopenharmony_ci // It must be possible to call PyImport_AppendInittab() or 19487db96d56Sopenharmony_ci // PyImport_ExtendInittab() before each Python initialization. 19497db96d56Sopenharmony_ci for (int i=1; i <= INIT_LOOPS; i++) { 19507db96d56Sopenharmony_ci printf("--- Pass %d ---\n", i); 19517db96d56Sopenharmony_ci 19527db96d56Sopenharmony_ci // Call PyImport_AppendInittab() at each iteration 19537db96d56Sopenharmony_ci if (PyImport_AppendInittab(EMBEDDED_EXT_NAME, 19547db96d56Sopenharmony_ci &PyInit_embedded_ext) != 0) { 19557db96d56Sopenharmony_ci fprintf(stderr, "PyImport_AppendInittab() failed\n"); 19567db96d56Sopenharmony_ci return 1; 19577db96d56Sopenharmony_ci } 19587db96d56Sopenharmony_ci 19597db96d56Sopenharmony_ci // Initialize Python 19607db96d56Sopenharmony_ci wchar_t* argv[] = {PROGRAM_NAME, L"-c", L"pass"}; 19617db96d56Sopenharmony_ci PyConfig config; 19627db96d56Sopenharmony_ci PyConfig_InitPythonConfig(&config); 19637db96d56Sopenharmony_ci config.isolated = 1; 19647db96d56Sopenharmony_ci config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); 19657db96d56Sopenharmony_ci init_from_config_clear(&config); 19667db96d56Sopenharmony_ci 19677db96d56Sopenharmony_ci // Py_RunMain() calls _PyImport_Fini2() which resets PyImport_Inittab 19687db96d56Sopenharmony_ci int exitcode = Py_RunMain(); 19697db96d56Sopenharmony_ci if (exitcode != 0) { 19707db96d56Sopenharmony_ci return exitcode; 19717db96d56Sopenharmony_ci } 19727db96d56Sopenharmony_ci } 19737db96d56Sopenharmony_ci return 0; 19747db96d56Sopenharmony_ci} 19757db96d56Sopenharmony_ci 19767db96d56Sopenharmony_cistatic void wrap_allocator(PyMemAllocatorEx *allocator); 19777db96d56Sopenharmony_cistatic void unwrap_allocator(PyMemAllocatorEx *allocator); 19787db96d56Sopenharmony_ci 19797db96d56Sopenharmony_cistatic void * 19807db96d56Sopenharmony_cimalloc_wrapper(void *ctx, size_t size) 19817db96d56Sopenharmony_ci{ 19827db96d56Sopenharmony_ci PyMemAllocatorEx *allocator = (PyMemAllocatorEx *)ctx; 19837db96d56Sopenharmony_ci unwrap_allocator(allocator); 19847db96d56Sopenharmony_ci PyEval_GetFrame(); // BOOM! 19857db96d56Sopenharmony_ci wrap_allocator(allocator); 19867db96d56Sopenharmony_ci return allocator->malloc(allocator->ctx, size); 19877db96d56Sopenharmony_ci} 19887db96d56Sopenharmony_ci 19897db96d56Sopenharmony_cistatic void * 19907db96d56Sopenharmony_cicalloc_wrapper(void *ctx, size_t nelem, size_t elsize) 19917db96d56Sopenharmony_ci{ 19927db96d56Sopenharmony_ci PyMemAllocatorEx *allocator = (PyMemAllocatorEx *)ctx; 19937db96d56Sopenharmony_ci return allocator->calloc(allocator->ctx, nelem, elsize); 19947db96d56Sopenharmony_ci} 19957db96d56Sopenharmony_ci 19967db96d56Sopenharmony_cistatic void * 19977db96d56Sopenharmony_cirealloc_wrapper(void *ctx, void *ptr, size_t new_size) 19987db96d56Sopenharmony_ci{ 19997db96d56Sopenharmony_ci PyMemAllocatorEx *allocator = (PyMemAllocatorEx *)ctx; 20007db96d56Sopenharmony_ci return allocator->realloc(allocator->ctx, ptr, new_size); 20017db96d56Sopenharmony_ci} 20027db96d56Sopenharmony_ci 20037db96d56Sopenharmony_cistatic void 20047db96d56Sopenharmony_cifree_wrapper(void *ctx, void *ptr) 20057db96d56Sopenharmony_ci{ 20067db96d56Sopenharmony_ci PyMemAllocatorEx *allocator = (PyMemAllocatorEx *)ctx; 20077db96d56Sopenharmony_ci allocator->free(allocator->ctx, ptr); 20087db96d56Sopenharmony_ci} 20097db96d56Sopenharmony_ci 20107db96d56Sopenharmony_cistatic void 20117db96d56Sopenharmony_ciwrap_allocator(PyMemAllocatorEx *allocator) 20127db96d56Sopenharmony_ci{ 20137db96d56Sopenharmony_ci PyMem_GetAllocator(PYMEM_DOMAIN_OBJ, allocator); 20147db96d56Sopenharmony_ci PyMemAllocatorEx wrapper = { 20157db96d56Sopenharmony_ci .malloc = &malloc_wrapper, 20167db96d56Sopenharmony_ci .calloc = &calloc_wrapper, 20177db96d56Sopenharmony_ci .realloc = &realloc_wrapper, 20187db96d56Sopenharmony_ci .free = &free_wrapper, 20197db96d56Sopenharmony_ci .ctx = allocator, 20207db96d56Sopenharmony_ci }; 20217db96d56Sopenharmony_ci PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, &wrapper); 20227db96d56Sopenharmony_ci} 20237db96d56Sopenharmony_ci 20247db96d56Sopenharmony_cistatic void 20257db96d56Sopenharmony_ciunwrap_allocator(PyMemAllocatorEx *allocator) 20267db96d56Sopenharmony_ci{ 20277db96d56Sopenharmony_ci PyMem_SetAllocator(PYMEM_DOMAIN_OBJ, allocator); 20287db96d56Sopenharmony_ci} 20297db96d56Sopenharmony_ci 20307db96d56Sopenharmony_cistatic int 20317db96d56Sopenharmony_citest_get_incomplete_frame(void) 20327db96d56Sopenharmony_ci{ 20337db96d56Sopenharmony_ci _testembed_Py_InitializeFromConfig(); 20347db96d56Sopenharmony_ci PyMemAllocatorEx allocator; 20357db96d56Sopenharmony_ci wrap_allocator(&allocator); 20367db96d56Sopenharmony_ci // Force an allocation with an incomplete (generator) frame: 20377db96d56Sopenharmony_ci int result = PyRun_SimpleString("(_ for _ in ())"); 20387db96d56Sopenharmony_ci unwrap_allocator(&allocator); 20397db96d56Sopenharmony_ci Py_Finalize(); 20407db96d56Sopenharmony_ci return result; 20417db96d56Sopenharmony_ci} 20427db96d56Sopenharmony_ci 20437db96d56Sopenharmony_ci 20447db96d56Sopenharmony_ci/* ********************************************************* 20457db96d56Sopenharmony_ci * List of test cases and the function that implements it. 20467db96d56Sopenharmony_ci * 20477db96d56Sopenharmony_ci * Names are compared case-sensitively with the first 20487db96d56Sopenharmony_ci * argument. If no match is found, or no first argument was 20497db96d56Sopenharmony_ci * provided, the names of all test cases are printed and 20507db96d56Sopenharmony_ci * the exit code will be -1. 20517db96d56Sopenharmony_ci * 20527db96d56Sopenharmony_ci * The int returned from test functions is used as the exit 20537db96d56Sopenharmony_ci * code, and test_capi treats all non-zero exit codes as a 20547db96d56Sopenharmony_ci * failed test. 20557db96d56Sopenharmony_ci *********************************************************/ 20567db96d56Sopenharmony_cistruct TestCase 20577db96d56Sopenharmony_ci{ 20587db96d56Sopenharmony_ci const char *name; 20597db96d56Sopenharmony_ci int (*func)(void); 20607db96d56Sopenharmony_ci}; 20617db96d56Sopenharmony_ci 20627db96d56Sopenharmony_cistatic struct TestCase TestCases[] = { 20637db96d56Sopenharmony_ci // Python initialization 20647db96d56Sopenharmony_ci {"test_repeated_init_exec", test_repeated_init_exec}, 20657db96d56Sopenharmony_ci {"test_repeated_simple_init", test_repeated_simple_init}, 20667db96d56Sopenharmony_ci {"test_forced_io_encoding", test_forced_io_encoding}, 20677db96d56Sopenharmony_ci {"test_repeated_init_and_subinterpreters", test_repeated_init_and_subinterpreters}, 20687db96d56Sopenharmony_ci {"test_repeated_init_and_inittab", test_repeated_init_and_inittab}, 20697db96d56Sopenharmony_ci {"test_pre_initialization_api", test_pre_initialization_api}, 20707db96d56Sopenharmony_ci {"test_pre_initialization_sys_options", test_pre_initialization_sys_options}, 20717db96d56Sopenharmony_ci {"test_bpo20891", test_bpo20891}, 20727db96d56Sopenharmony_ci {"test_initialize_twice", test_initialize_twice}, 20737db96d56Sopenharmony_ci {"test_initialize_pymain", test_initialize_pymain}, 20747db96d56Sopenharmony_ci {"test_init_initialize_config", test_init_initialize_config}, 20757db96d56Sopenharmony_ci {"test_preinit_compat_config", test_preinit_compat_config}, 20767db96d56Sopenharmony_ci {"test_init_compat_config", test_init_compat_config}, 20777db96d56Sopenharmony_ci {"test_init_global_config", test_init_global_config}, 20787db96d56Sopenharmony_ci {"test_init_from_config", test_init_from_config}, 20797db96d56Sopenharmony_ci {"test_init_parse_argv", test_init_parse_argv}, 20807db96d56Sopenharmony_ci {"test_init_dont_parse_argv", test_init_dont_parse_argv}, 20817db96d56Sopenharmony_ci {"test_init_compat_env", test_init_compat_env}, 20827db96d56Sopenharmony_ci {"test_init_python_env", test_init_python_env}, 20837db96d56Sopenharmony_ci {"test_init_env_dev_mode", test_init_env_dev_mode}, 20847db96d56Sopenharmony_ci {"test_init_env_dev_mode_alloc", test_init_env_dev_mode_alloc}, 20857db96d56Sopenharmony_ci {"test_init_dont_configure_locale", test_init_dont_configure_locale}, 20867db96d56Sopenharmony_ci {"test_init_dev_mode", test_init_dev_mode}, 20877db96d56Sopenharmony_ci {"test_init_isolated_flag", test_init_isolated_flag}, 20887db96d56Sopenharmony_ci {"test_preinit_isolated_config", test_preinit_isolated_config}, 20897db96d56Sopenharmony_ci {"test_init_isolated_config", test_init_isolated_config}, 20907db96d56Sopenharmony_ci {"test_preinit_python_config", test_preinit_python_config}, 20917db96d56Sopenharmony_ci {"test_init_python_config", test_init_python_config}, 20927db96d56Sopenharmony_ci {"test_preinit_isolated1", test_preinit_isolated1}, 20937db96d56Sopenharmony_ci {"test_preinit_isolated2", test_preinit_isolated2}, 20947db96d56Sopenharmony_ci {"test_preinit_parse_argv", test_preinit_parse_argv}, 20957db96d56Sopenharmony_ci {"test_preinit_dont_parse_argv", test_preinit_dont_parse_argv}, 20967db96d56Sopenharmony_ci {"test_init_read_set", test_init_read_set}, 20977db96d56Sopenharmony_ci {"test_init_run_main", test_init_run_main}, 20987db96d56Sopenharmony_ci {"test_init_main", test_init_main}, 20997db96d56Sopenharmony_ci {"test_init_sys_add", test_init_sys_add}, 21007db96d56Sopenharmony_ci {"test_init_setpath", test_init_setpath}, 21017db96d56Sopenharmony_ci {"test_init_setpath_config", test_init_setpath_config}, 21027db96d56Sopenharmony_ci {"test_init_setpythonhome", test_init_setpythonhome}, 21037db96d56Sopenharmony_ci {"test_init_is_python_build", test_init_is_python_build}, 21047db96d56Sopenharmony_ci {"test_init_warnoptions", test_init_warnoptions}, 21057db96d56Sopenharmony_ci {"test_init_set_config", test_init_set_config}, 21067db96d56Sopenharmony_ci {"test_run_main", test_run_main}, 21077db96d56Sopenharmony_ci {"test_run_main_loop", test_run_main_loop}, 21087db96d56Sopenharmony_ci {"test_get_argc_argv", test_get_argc_argv}, 21097db96d56Sopenharmony_ci {"test_init_use_frozen_modules", test_init_use_frozen_modules}, 21107db96d56Sopenharmony_ci 21117db96d56Sopenharmony_ci // Audit 21127db96d56Sopenharmony_ci {"test_open_code_hook", test_open_code_hook}, 21137db96d56Sopenharmony_ci {"test_audit", test_audit}, 21147db96d56Sopenharmony_ci {"test_audit_subinterpreter", test_audit_subinterpreter}, 21157db96d56Sopenharmony_ci {"test_audit_run_command", test_audit_run_command}, 21167db96d56Sopenharmony_ci {"test_audit_run_file", test_audit_run_file}, 21177db96d56Sopenharmony_ci {"test_audit_run_interactivehook", test_audit_run_interactivehook}, 21187db96d56Sopenharmony_ci {"test_audit_run_startup", test_audit_run_startup}, 21197db96d56Sopenharmony_ci {"test_audit_run_stdin", test_audit_run_stdin}, 21207db96d56Sopenharmony_ci 21217db96d56Sopenharmony_ci // Specific C API 21227db96d56Sopenharmony_ci {"test_unicode_id_init", test_unicode_id_init}, 21237db96d56Sopenharmony_ci#ifndef MS_WINDOWS 21247db96d56Sopenharmony_ci {"test_frozenmain", test_frozenmain}, 21257db96d56Sopenharmony_ci#endif 21267db96d56Sopenharmony_ci {"test_get_incomplete_frame", test_get_incomplete_frame}, 21277db96d56Sopenharmony_ci 21287db96d56Sopenharmony_ci {NULL, NULL} 21297db96d56Sopenharmony_ci}; 21307db96d56Sopenharmony_ci 21317db96d56Sopenharmony_ci 21327db96d56Sopenharmony_ciint main(int argc, char *argv[]) 21337db96d56Sopenharmony_ci{ 21347db96d56Sopenharmony_ci main_argc = argc; 21357db96d56Sopenharmony_ci main_argv = argv; 21367db96d56Sopenharmony_ci 21377db96d56Sopenharmony_ci if (argc > 1) { 21387db96d56Sopenharmony_ci for (struct TestCase *tc = TestCases; tc && tc->name; tc++) { 21397db96d56Sopenharmony_ci if (strcmp(argv[1], tc->name) == 0) 21407db96d56Sopenharmony_ci return (*tc->func)(); 21417db96d56Sopenharmony_ci } 21427db96d56Sopenharmony_ci } 21437db96d56Sopenharmony_ci 21447db96d56Sopenharmony_ci /* No match found, or no test name provided, so display usage */ 21457db96d56Sopenharmony_ci printf("Python " PY_VERSION " _testembed executable for embedded interpreter tests\n" 21467db96d56Sopenharmony_ci "Normally executed via 'EmbeddingTests' in Lib/test/test_embed.py\n\n" 21477db96d56Sopenharmony_ci "Usage: %s TESTNAME\n\nAll available tests:\n", argv[0]); 21487db96d56Sopenharmony_ci for (struct TestCase *tc = TestCases; tc && tc->name; tc++) { 21497db96d56Sopenharmony_ci printf(" %s\n", tc->name); 21507db96d56Sopenharmony_ci } 21517db96d56Sopenharmony_ci 21527db96d56Sopenharmony_ci /* Non-zero exit code will cause test_embed.py tests to fail. 21537db96d56Sopenharmony_ci This is intentional. */ 21547db96d56Sopenharmony_ci return -1; 21557db96d56Sopenharmony_ci} 2156