summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-09-20 15:51:32 (GMT)
committerGitHub <noreply@github.com>2021-09-20 15:51:32 (GMT)
commit29e431419a0c23340099a9cd8cf23ec9c7788879 (patch)
treec02c0e3f7b82b18c7a8d042f42d0f4842c25156b
parent50c0551f97f86bbf9f659e1bbe78a14df7754cbe (diff)
downloadcpython-29e431419a0c23340099a9cd8cf23ec9c7788879.zip
cpython-29e431419a0c23340099a9cd8cf23ec9c7788879.tar.gz
cpython-29e431419a0c23340099a9cd8cf23ec9c7788879.tar.bz2
bpo-40413: test_embed tests calling Py_RunMain() multiple times (GH-28466) (GH-28471)
Calling Py_InitializeFromConfig()+Py_RunMain() multiple times must not crash. Cleanup also test_get_argc_argv(). (cherry picked from commit 5e2c32e08ed77081cabd9d51f0589f81c1572732) Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Lib/test/test_embed.py8
-rw-r--r--Programs/_testembed.c20
2 files changed, 24 insertions, 4 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index ea47004..cc59bf4 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -308,6 +308,14 @@ class EmbeddingTests(EmbeddingTestsMixin, unittest.TestCase):
self.assertEqual(out.rstrip(), "Py_RunMain(): sys.argv=['-c', 'arg2']")
self.assertEqual(err, '')
+ def test_run_main_loop(self):
+ # bpo-40413: Calling Py_InitializeFromConfig()+Py_RunMain() multiple
+ # times must not crash.
+ nloop = 5
+ out, err = self.run_embedded_interpreter("test_run_main_loop")
+ self.assertEqual(out, "Py_RunMain(): sys.argv=['-c', 'arg2']\n" * nloop)
+ self.assertEqual(err, '')
+
class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
maxDiff = 4096
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index 3933b86..897ce7f 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1617,15 +1617,26 @@ static int test_run_main(void)
}
+static int test_run_main_loop(void)
+{
+ // bpo-40413: Calling Py_InitializeFromConfig()+Py_RunMain() multiple
+ // times must not crash.
+ for (int i=0; i<5; i++) {
+ int exitcode = test_run_main();
+ if (exitcode != 0) {
+ return exitcode;
+ }
+ }
+ return 0;
+}
+
+
static int test_get_argc_argv(void)
{
PyConfig config;
PyConfig_InitPythonConfig(&config);
- wchar_t *argv[] = {L"python3", L"-c",
- (L"import sys; "
- L"print(f'Py_RunMain(): sys.argv={sys.argv}')"),
- L"arg2"};
+ wchar_t *argv[] = {L"python3", L"-c", L"pass", L"arg2"};
config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv);
config_set_string(&config, &config.program_name, L"./python3");
@@ -1749,6 +1760,7 @@ static struct TestCase TestCases[] = {
{"test_init_setpythonhome", test_init_setpythonhome},
{"test_init_warnoptions", test_init_warnoptions},
{"test_run_main", test_run_main},
+ {"test_run_main_loop", test_run_main_loop},
{"test_get_argc_argv", test_get_argc_argv},
// Audit