21388: Add rpm instructions to Python READMEs
[arvados.git] / services / fuse / tests / mount_test_base.py
index c7ba4d4fdadc94bbc7394029bce7dd4db30cc9a5..d69cdf1c1a42afdb66b70716d8e23402c4134f2a 100644 (file)
@@ -26,16 +26,20 @@ from .integration_test import workerPool
 
 logger = logging.getLogger('arvados.arv-mount')
 
-def make_block_cache(disk_cache):
-    if disk_cache:
-        disk_cache_dir = os.path.join(os.path.expanduser("~"), ".cache", "arvados", "keep")
-        shutil.rmtree(disk_cache_dir, ignore_errors=True)
-    block_cache = arvados.keep.KeepBlockCache(disk_cache=disk_cache)
-    return block_cache
-
 class MountTestBase(unittest.TestCase):
     disk_cache = False
 
+    @classmethod
+    def setUpClass(cls):
+        if cls.disk_cache:
+            cls._disk_cache_dir = tempfile.mkdtemp(prefix='MountTest-')
+        else:
+            cls._disk_cache_dir = None
+        cls._keep_block_cache = arvados.keep.KeepBlockCache(
+            disk_cache=cls.disk_cache,
+            disk_cache_dir=cls._disk_cache_dir,
+        )
+
     def setUp(self, api=None, local_store=True):
         # The underlying C implementation of open() makes a fstat() syscall
         # with the GIL still held.  When the GETATTR message comes back to
@@ -57,11 +61,16 @@ class MountTestBase(unittest.TestCase):
 
         self.api = api if api else arvados.safeapi.ThreadSafeApiCache(
             arvados.config.settings(),
-            keep_params={"block_cache": make_block_cache(self.disk_cache)},
+            keep_params={"block_cache": self._keep_block_cache},
             version='v1',
         )
         self.llfuse_thread = None
 
+    @classmethod
+    def tearDownClass(cls):
+        if cls._disk_cache_dir:
+            shutil.rmtree(cls._disk_cache_dir)
+
     # This is a copy of Mount's method.  TODO: Refactor MountTestBase
     # to use a Mount instead of copying its code.
     def _llfuse_main(self):
@@ -105,10 +114,16 @@ class MountTestBase(unittest.TestCase):
             t0 = time.time()
             self.llfuse_thread.join(timeout=60)
             if self.llfuse_thread.is_alive():
-                logger.warning("MountTestBase.tearDown():"
-                               " llfuse thread still alive 60s after umount"
-                               " -- ending test suite to avoid deadlock")
-                pytest.exit("llfuse thread outlived test", os.EX_TEMPFAIL)
+                # pytest uses exit status 2 when test collection failed.
+                # A UnitTest failing in setup/teardown counts as a
+                # collection failure, so pytest will exit with status 2
+                # no matter what status you specify here. run-tests.sh
+                # looks for this status, so specify 2 just to keep
+                # everything as consistent as possible.
+                # TODO: If we refactor these tests so they're not built
+                # on unittest, consider using a dedicated, non-pytest
+                # exit code like TEMPFAIL.
+                pytest.exit("llfuse thread outlived test - aborting test suite to avoid deadlock", 2)
             waited = time.time() - t0
             if waited > 0.1:
                 logger.warning("MountTestBase.tearDown(): waited %f s for llfuse thread to end", waited)