diff options
author | Antoine Pitrou <antoine@python.org> | 2021-03-20 19:07:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-20 19:07:44 (GMT) |
commit | 2fd16ef406bba239b1334057fb499496a84b3aa2 (patch) | |
tree | 0aca40303f31a7c1b22108eeba1afd9ae3b8ba60 /Lib | |
parent | 7cb033c423b65def1632d6c3c747111543b342a2 (diff) | |
download | cpython-2fd16ef406bba239b1334057fb499496a84b3aa2.zip cpython-2fd16ef406bba239b1334057fb499496a84b3aa2.tar.gz cpython-2fd16ef406bba239b1334057fb499496a84b3aa2.tar.bz2 |
bpo-43517: Fix false positive in detection of circular imports (#24895)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_importlib/partial/cfimport.py | 38 | ||||
-rw-r--r-- | Lib/test/test_importlib/partial/pool_in_threads.py | 27 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_threaded_import.py | 14 |
3 files changed, 78 insertions, 1 deletions
diff --git a/Lib/test/test_importlib/partial/cfimport.py b/Lib/test/test_importlib/partial/cfimport.py new file mode 100644 index 0000000..c92d2fe --- /dev/null +++ b/Lib/test/test_importlib/partial/cfimport.py @@ -0,0 +1,38 @@ +import os +import sys +import threading +import traceback + + +NLOOPS = 50 +NTHREADS = 30 + + +def t1(): + try: + from concurrent.futures import ThreadPoolExecutor + except Exception: + traceback.print_exc() + os._exit(1) + +def t2(): + try: + from concurrent.futures.thread import ThreadPoolExecutor + except Exception: + traceback.print_exc() + os._exit(1) + +def main(): + for j in range(NLOOPS): + threads = [] + for i in range(NTHREADS): + threads.append(threading.Thread(target=t2 if i % 1 else t1)) + for thread in threads: + thread.start() + for thread in threads: + thread.join() + sys.modules.pop('concurrent.futures', None) + sys.modules.pop('concurrent.futures.thread', None) + +if __name__ == "__main__": + main() diff --git a/Lib/test/test_importlib/partial/pool_in_threads.py b/Lib/test/test_importlib/partial/pool_in_threads.py new file mode 100644 index 0000000..faa7867 --- /dev/null +++ b/Lib/test/test_importlib/partial/pool_in_threads.py @@ -0,0 +1,27 @@ +import multiprocessing +import os +import threading +import traceback + + +def t(): + try: + with multiprocessing.Pool(1): + pass + except Exception: + traceback.print_exc() + os._exit(1) + + +def main(): + threads = [] + for i in range(20): + threads.append(threading.Thread(target=t)) + for thread in threads: + thread.start() + for thread in threads: + thread.join() + + +if __name__ == "__main__": + main() diff --git a/Lib/test/test_importlib/test_threaded_import.py b/Lib/test/test_importlib/test_threaded_import.py index c6a6e17..03bde96 100644 --- a/Lib/test/test_importlib/test_threaded_import.py +++ b/Lib/test/test_importlib/test_threaded_import.py @@ -17,7 +17,7 @@ from unittest import mock from test.support import (verbose, run_unittest) from test.support.import_helper import forget from test.support.os_helper import (TESTFN, unlink, rmtree) -from test.support import threading_helper +from test.support import script_helper, threading_helper def task(N, done, done_tasks, errors): try: @@ -245,6 +245,18 @@ class ThreadedImportTests(unittest.TestCase): __import__(TESTFN) del sys.modules[TESTFN] + def test_concurrent_futures_circular_import(self): + # Regression test for bpo-43515 + fn = os.path.join(os.path.dirname(__file__), + 'partial', 'cfimport.py') + script_helper.assert_python_ok(fn) + + def test_multiprocessing_pool_circular_import(self): + # Regression test for bpo-41567 + fn = os.path.join(os.path.dirname(__file__), + 'partial', 'pool_in_threads.py') + script_helper.assert_python_ok(fn) + @threading_helper.reap_threads def test_main(): |