summaryrefslogtreecommitdiff
path: root/setuptools/tests/contexts.py
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools/tests/contexts.py')
-rw-r--r--setuptools/tests/contexts.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/setuptools/tests/contexts.py b/setuptools/tests/contexts.py
index 51ce8984..58948824 100644
--- a/setuptools/tests/contexts.py
+++ b/setuptools/tests/contexts.py
@@ -7,6 +7,7 @@ import site
import io
import pkg_resources
+from filelock import FileLock
@contextlib.contextmanager
@@ -96,3 +97,29 @@ def suppress_exceptions(*excs):
yield
except excs:
pass
+
+
+def multiproc(request):
+ """
+ Return True if running under xdist and multiple
+ workers are used.
+ """
+ try:
+ worker_id = request.getfixturevalue('worker_id')
+ except Exception:
+ return False
+ return worker_id != 'master'
+
+
+@contextlib.contextmanager
+def session_locked_tmp_dir(request, tmp_path_factory, name):
+ """Uses a file lock to guarantee only one worker can access a temp dir"""
+ # get the temp directory shared by all workers
+ base = tmp_path_factory.getbasetemp()
+ shared_dir = base.parent if multiproc(request) else base
+
+ locked_dir = shared_dir / name
+ with FileLock(locked_dir.with_suffix(".lock")):
+ # ^-- prevent multiple workers to access the directory at once
+ locked_dir.mkdir(exist_ok=True, parents=True)
+ yield locked_dir