[Python-checkins] bpo-40413: test_embed tests calling Py_RunMain() multiple times (GH-28466) (GH-28471)

ambv webhook-mailer at python.org
Mon Sep 20 11:51:41 EDT 2021


https://github.com/python/cpython/commit/29e431419a0c23340099a9cd8cf23ec9c7788879
commit: 29e431419a0c23340099a9cd8cf23ec9c7788879
branch: 3.9
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: ambv <lukasz at langa.pl>
date: 2021-09-20T17:51:32+02:00
summary:

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 at python.org>

files:
M Lib/test/test_embed.py
M Programs/_testembed.c

diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index ea47004443006..cc59bf4c859d1 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -308,6 +308,14 @@ def test_run_main(self):
         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 3933b86af1194..897ce7f7ae6e5 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



More information about the Python-checkins mailing list