diff options
Diffstat (limited to 'Lib/test/test_threading.py')
| -rw-r--r-- | Lib/test/test_threading.py | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 0062634..4c9f093 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -666,6 +666,36 @@ class ThreadingExceptionTests(BaseTestCase):          thread.start()          self.assertRaises(RuntimeError, setattr, thread, "daemon", True) +    def test_recursion_limit(self): +        # Issue 9670 +        # test that excessive recursion within a non-main thread causes +        # an exception rather than crashing the interpreter on platforms +        # like Mac OS X or FreeBSD which have small default stack sizes +        # for threads +        script = """if True: +            import threading + +            def recurse(): +                return recurse() + +            def outer(): +                try: +                    recurse() +                except RuntimeError: +                    pass + +            w = threading.Thread(target=outer) +            w.start() +            w.join() +            print('end of main thread') +            """ +        expected_output = "end of main thread\n" +        p = subprocess.Popen([sys.executable, "-c", script], +                             stdout=subprocess.PIPE) +        stdout, stderr = p.communicate() +        data = stdout.decode().replace('\r', '') +        self.assertEqual(p.returncode, 0, "Unexpected error") +        self.assertEqual(data, expected_output)  class LockTests(lock_tests.LockTests):      locktype = staticmethod(threading.Lock)  | 
