[CalendarServer-changes] [9400] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 29 11:21:08 PDT 2012


Revision: 9400
          http://trac.macosforge.org/projects/calendarserver/changeset/9400
Author:   cdaboo at apple.com
Date:     2012-06-29 11:21:08 -0700 (Fri, 29 Jun 2012)
Log Message:
-----------
Fix propfind response caching to work with all directory service implementations.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/cache.py
    CalendarServer/trunk/twistedcaldav/directory/directory.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py
    CalendarServer/trunk/twistedcaldav/test/test_cache.py

Modified: CalendarServer/trunk/twistedcaldav/cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cache.py	2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/cache.py	2012-06-29 18:21:08 UTC (rev 9400)
@@ -1,5 +1,5 @@
 ##
-# Copyright (c) 2008-2011 Apple Inc. All rights reserved.
+# Copyright (c) 2008-2012 Apple Inc. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -239,6 +239,15 @@
             return self.getCachePool().get('cacheToken:%s' % (uri,))
 
     @inlineCallbacks
+    def _tokenForRecord(self, uri, request):
+        """
+        Get the current token for a particular principal URI's directory record.
+        """
+
+        record = (yield self._getRecordForURI(uri, request))
+        returnValue(record.cacheToken())
+
+    @inlineCallbacks
     def _tokensForChildren(self, rURI, request):
         """
         Create a dict of child resource tokens for any "recorded" during this request in the childCacheURIs attribute.
@@ -259,7 +268,7 @@
         tokens = []
         pURI, rURI = (yield self._getURIs(request))
         tokens.append((yield self._tokenForURI(pURI, "PrincipalToken")))
-        tokens.append(hash((yield self._getRecordForURI(pURI, request))))
+        tokens.append((yield self._tokenForRecord(pURI, request)))
         tokens.append((yield self._tokenForURI(rURI)))
         tokens.append((yield self._tokensForChildren(rURI, request)))
         returnValue(tokens)

Modified: CalendarServer/trunk/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/directory.py	2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/directory/directory.py	2012-06-29 18:21:08 UTC (rev 9400)
@@ -1034,6 +1034,21 @@
 
         return h
 
+    def cacheToken(self):
+        """
+        Generate a token that can be uniquely used to identify the state of this record for use
+        in a cache.
+        """
+        return hash((
+            self.__class__.__name__,
+            self.service.realmName,
+            self.recordType,
+            self.shortNames,
+            self.guid,
+            self.enabled,
+            self.enabledForCalendaring,
+        ))
+
     def addAugmentInformation(self, augment):
         
         if augment:

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py	2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py	2012-06-29 18:21:08 UTC (rev 9400)
@@ -29,6 +29,7 @@
 from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
 
 import cPickle as pickle
+import uuid
 
 def StubCheckSACL(cls, username, service):
     services = {
@@ -619,3 +620,31 @@
             record = DirectoryRecord(self.service, "users", original,
                 shortNames=("testing",))
             self.assertEquals(expected, record.guid)
+
+class DirectoryRecordTests(TestCase):
+    """
+    Test L{DirectoryRecord} apis.
+    """
+
+    def setUp(self):
+        self.service = DirectoryService()
+        self.service.setRealm("test")
+        self.service.baseGUID = "0E8E6EC2-8E52-4FF3-8F62-6F398B08A498"
+
+    def test_cacheToken(self):
+        """
+        Test that DirectoryRecord.cacheToken is different for different records, and its value changes
+        as attributes on the record change.
+        """
+
+        record1 = DirectoryRecord(self.service, "users", str(uuid.uuid4()), shortNames=("testing1",))
+        record2 = DirectoryRecord(self.service, "users", str(uuid.uuid4()), shortNames=("testing2",))
+        self.assertNotEquals(record1.cacheToken(), record2.cacheToken())
+
+        cache1 = record1.cacheToken()
+        record1.enabled = True
+        self.assertNotEquals(cache1, record1.cacheToken())
+
+        cache1 = record1.cacheToken()
+        record1.enabledForCalendaring = True
+        self.assertNotEquals(cache1, record1.cacheToken())

Modified: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py	2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py	2012-06-29 18:21:08 UTC (rev 9400)
@@ -1,5 +1,5 @@
 ##
-# Copyright (c) 2008-2010 Apple Inc. All rights reserved.
+# Copyright (c) 2008-2012 Apple Inc. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -45,6 +45,16 @@
     def __init__(self, uid):
         self.uid = uid
 
+    def cacheToken(self):
+        """
+        Generate a token that can be uniquely used to identify the state of this record for use
+        in a cache.
+        """
+        return hash((
+            self.__class__.__name__,
+            self.uid,
+        ))
+
 class StubDirectory(object):
     
     def recordWithShortName(self, recordType, recordName):
@@ -153,11 +163,11 @@
             '/calendars/users/cdaboo/': StubURLResource(
                 '/calendars/__uids__/cdaboo/'),
             '/principals/__uids__/cdaboo/': StubURLResource(
-                '/principals/__uids__/cdaboo/', record='directoryToken0'),
+                '/principals/__uids__/cdaboo/', record=StubDirectoryRecord('cdaboo')),
             '/calendars/__uids__/dreid/': StubURLResource(
                 '/calendars/__uids__/dreid/'),
             '/principals/__uids__/dreid/': StubURLResource(
-                '/principals/__uids__/dreid/', record='directoryToken0')}
+                '/principals/__uids__/dreid/', record=StubDirectoryRecord('dreid'))}
 
 
     def tearDown(self):
@@ -345,7 +355,7 @@
 
     def test_recordHashChangeInvalidatesCache(self):
         StubRequest.resources[
-            '/principals/__uids__/cdaboo/'].record = 'directoryToken1'
+            '/principals/__uids__/cdaboo/'].record = StubDirectoryRecord('cdaboo-changed')
 
         d = self.rc.getResponseForRequest(
             StubRequest(
@@ -391,7 +401,7 @@
             0, #flags
             cPickle.dumps((
             'principalToken0',
-            hash('directoryToken0'),
+            StubDirectoryRecord('cdaboo').cacheToken(),
             'uriToken0',
             {'/calendars/__uids__/cdaboo/calendars/':'childToken0'},
             (self.expected_response[0],
@@ -421,7 +431,7 @@
             0, #flags
             cPickle.dumps((
                     'principalToken0',
-                    hash('directoryToken0'),
+                    StubDirectoryRecord('cdaboo').cacheToken(),
                     'uriToken0',
                     {'/calendars/__uids__/cdaboo/calendars/':'childToken0'},
                     (expected_response[0],
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120629/d68428f6/attachment.html>


More information about the calendarserver-changes mailing list