[Zodb-checkins] SVN: ZODB/branches/blob-merge-branch/src/ZEO/ Add a test for loadBlob.

Chris McDonough chrism at plope.com
Sat Feb 25 17:55:55 EST 2006


Log message for revision 65484:
  Add a test for loadBlob.
  

Changed:
  U   ZODB/branches/blob-merge-branch/src/ZEO/ClientStorage.py
  U   ZODB/branches/blob-merge-branch/src/ZEO/tests/testZEO.py

-=-
Modified: ZODB/branches/blob-merge-branch/src/ZEO/ClientStorage.py
===================================================================
--- ZODB/branches/blob-merge-branch/src/ZEO/ClientStorage.py	2006-02-25 22:26:30 UTC (rev 65483)
+++ ZODB/branches/blob-merge-branch/src/ZEO/ClientStorage.py	2006-02-25 22:55:55 UTC (rev 65484)
@@ -314,6 +314,11 @@
         # is executing.
         self._lock = threading.Lock()
 
+        # XXX need to check for POSIX-ness here
+        if (os.stat(blob_dir).st_mode & 077) != 0:
+            log2('Blob dir %s has insecure mode setting' % blob_dir,
+                 level=logging.WARNING)
+
         self.blob_dir = blob_dir
 
         # Initialize locks
@@ -950,7 +955,8 @@
             tempfile.write(chunk)
 
         tempfile.close()
-        utils.best_rename(tempfilename, blob_filename)
+        # XXX will fail on Windows if file is open
+        os.rename(tempfilename, blob_filename)
         return blob_filename
 
     def loadBlob(self, oid, serial, version):
@@ -968,7 +974,7 @@
         blob_filename = self._getCleanFilename(oid, serial)
         # Case 1: Blob is available already, just use it
         if os.path.exists(blob_filename):
-                return blob_filename
+            return blob_filename
 
         # Case 2,3: Blob might still be downloading or not there yet
 
@@ -981,7 +987,7 @@
         self.blob_status_lock.acquire()
         try:
             if not self.blob_status.has_key(oid):
-                self.blob_status[lock_key] = Lock()
+                self.blob_status[lock_key] = self.getBlobLock()
             lock = self.blob_status[lock_key]
         finally:
             self.blob_status_lock.release()
@@ -1006,11 +1012,14 @@
             # making the creation of this status lock non-atomic (see above)
             self.blob_status_lock.acquire()
             try:
-                del self.blob_status_lock[lock_key]
+                del self.blob_status[lock_key]
             finally:
                 self.blob_status_lock.release()
-        
 
+    def getBlobLock(self):
+        # indirection to support unit testing
+        return Lock()
+
     def tpc_vote(self, txn):
         """Storage API: vote on a transaction."""
         if txn is not self._transaction:

Modified: ZODB/branches/blob-merge-branch/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/blob-merge-branch/src/ZEO/tests/testZEO.py	2006-02-25 22:26:30 UTC (rev 65483)
+++ ZODB/branches/blob-merge-branch/src/ZEO/tests/testZEO.py	2006-02-25 22:55:55 UTC (rev 65484)
@@ -252,7 +252,58 @@
         self.assert_(os.path.exists(filename))
         self.assertEqual(somedata, open(filename).read())
         
+    def checkLoadBlob(self):
+        from ZODB.tests.StorageTestBase import zodb_pickle, ZERO, \
+             handle_serials
+        oid = self._storage.new_oid()
+        serial = ZERO
+        version = ''
+        filename = self._storage._getCleanFilename(oid, serial)
 
+        class Dummy:
+            def __init__(self):
+                self.acquired = 0
+                self.released = 0
+            def acquire(self):
+                self.acquired += 1
+            def release(self):
+                self.released += 1
+
+        class statusdict(dict):
+            def __init__(self):
+                self.added = []
+                self.removed = []
+                
+            def __setitem__(self, k, v):
+                self.added.append(k)
+                super(dict, self).__setitem__(k, v)
+
+            def __delitem__(self, k):
+                self.removed.append(k)
+                super(dict, self).__delitem__(k)
+
+        # ensure that we do locking properly
+        thestatuslock = self._storage.blob_status_lock = Dummy()
+        thebloblock = Dummy()
+
+        def getBlobLock(self):
+            return thebloblock
+
+        # override getBlobLock to test that locking is performed
+        self._storage.getBlobLock = getBlobLock
+        thestatusdict = self._storage.blob_status = statusdict()
+
+        filename = self._storage.loadBlob(oid, serial, version)
+
+        self.assertEqual(thestatuslock.acquired, 2)
+        self.assertEqual(thestatuslock.released, 2)
+        
+        self.assertEqual(thebloblock.acquired, 1)
+        self.assertEqual(thebloblock.released, 1)
+
+        self.assertEqual(thestatusdict.added, (oid, serial))
+        self.assertEqual(thestatusdict.removed, (oid, serial))
+
 test_classes = [FileStorageTests, MappingStorageTests,
                 BlobAdaptedFileStorageTests]
 



More information about the Zodb-checkins mailing list