]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-121973: Fix flaky test_pyrepl tests (GH-122140)
authorSam Gross <colesbury@gmail.com>
Tue, 23 Jul 2024 13:17:13 +0000 (09:17 -0400)
committerGitHub <noreply@github.com>
Tue, 23 Jul 2024 13:17:13 +0000 (15:17 +0200)
This fixes the flakiness in:
* test_inspect_keeps_globals_from_inspected_file
* test_inspect_keeps_globals_from_inspected_module

The output already includes newlines. Adding newlines for every entry in
the output list introduces non-determinism because it added '\n' in
places where stdout is flushed or some buffer becomes full.

The regex also needed to be updated because pyrepl includes control
characters -- the visible output on each line doesn't immediately follow
a newline character.

Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
Lib/test/test_pyrepl/test_pyrepl.py

index e3feeeb76f11d696687c7868988747433151c6e5..3a1bacef8a1756f8de70bd041e76f60cdda100f5 100644 (file)
@@ -963,7 +963,7 @@ class TestMain(TestCase):
             mod = blue / "calx.py"
             mod.write_text("FOO = 42", encoding="utf-8")
             commands = [
-                "print(f'{" + var + "=}')" for var in expectations
+                "print(f'^{" + var + "=}')" for var in expectations
             ] + ["exit()"]
             if as_file and as_module:
                 self.fail("as_file and as_module are mutually exclusive")
@@ -989,10 +989,10 @@ class TestMain(TestCase):
         self.assertEqual(exit_code, 0)
         for var, expected in expectations.items():
             with self.subTest(var=var, expected=expected):
-                if m := re.search(rf"[\r\n]{var}=(.+?)[\r\n]", output):
+                if m := re.search(rf"\^{var}=(.+?)[\r\n]", output):
                     self._assertMatchOK(var, expected, actual=m.group(1))
                 else:
-                    self.fail(f"{var}= not found in output")
+                    self.fail(f"{var}= not found in output: {output!r}\n\n{output}")
 
         self.assertNotIn("Exception", output)
         self.assertNotIn("Traceback", output)
@@ -1126,4 +1126,4 @@ class TestMain(TestCase):
         except subprocess.TimeoutExpired:
             process.kill()
             exit_code = process.wait()
-        return "\n".join(output), exit_code
+        return "".join(output), exit_code