diff options
Diffstat (limited to 'tests/unit/test_util.py')
-rw-r--r-- | tests/unit/test_util.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py index d2a5906..81f8ff7 100644 --- a/tests/unit/test_util.py +++ b/tests/unit/test_util.py @@ -1,3 +1,9 @@ +import concurrent.futures +import traceback + +import pytest + +from virtualenv.util.lock import ReentrantFileLock from virtualenv.util.subprocess import run_cmd @@ -6,3 +12,25 @@ def test_run_fail(tmp_path): assert err assert not out assert code + + +def test_reentrant_file_lock_is_thread_safe(tmp_path): + lock = ReentrantFileLock(tmp_path) + target_file = tmp_path / "target" + target_file.touch() + + def recreate_target_file(): + with lock.lock_for_key("target"): + target_file.unlink() + target_file.touch() + + with concurrent.futures.ThreadPoolExecutor() as executor: + tasks = [] + for _ in range(4): + tasks.append(executor.submit(recreate_target_file)) + concurrent.futures.wait(tasks) + for task in tasks: + try: + task.result() + except Exception: + pytest.fail(traceback.format_exc()) |