[CalendarServer-changes] [2298] CalendarServer/branches/propfind-cache/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 10 15:59:13 PDT 2008


Revision: 2298
          http://trac.macosforge.org/projects/calendarserver/changeset/2298
Author:   dreid at apple.com
Date:     2008-04-10 15:59:12 -0700 (Thu, 10 Apr 2008)

Log Message:
-----------
Refactor so changed returns a deferred, add test for the CalDAVFile implementation of changed which calls updateCTag then delegates to parent.

Modified Paths:
--------------
    CalendarServer/branches/propfind-cache/twistedcaldav/resource.py
    CalendarServer/branches/propfind-cache/twistedcaldav/static.py
    CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py
    CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/resource.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/resource.py	2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/resource.py	2008-04-10 22:59:12 UTC (rev 2298)
@@ -507,6 +507,9 @@
         Locates the parent resource of the resource with the given URI.
         @param request: an L{IRequest} object for the request being processed.
         @param uri: the URI whose parent resource is desired.
+
+        @return: A L{Deferred} that fires with an L{IResource} provider that is
+            the parent of the current URL.
         """
         return request.locateResource(parentForURL(uri))
 
@@ -522,13 +525,20 @@
         @param properties: A C{bool} indicating that properties on C{uri} have
             changed.
         @param data: A C{bool} indicating that data at C{uri} has changed.
+
+        @return: A L{Deferred} that fires with None.
         """
-        return self.locateParent(request, uri).changed(request,
-                                                       uri,
-                                                       properties=properties,
-                                                       data=data)
+        def _gotParentResource(resource):
+            return resource.changed(request,
+                                    uri,
+                                    properties=properties,
+                                    data=data)
 
+        d = self.locateParent(request, uri)
+        d.addCallback(_gotParentResource)
+        return d
 
+
 class CalendarPrincipalCollectionResource (DAVPrincipalCollectionResource, CalDAVResource):
     """
     CalDAV principal collection.

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/static.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/static.py	2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/static.py	2008-04-10 22:59:12 UTC (rev 2298)
@@ -288,6 +288,16 @@
         assert self.isCollection()
         self.writeDeadProperty(customxml.GETCTag(str(datetime.datetime.now())))
 
+    def changed(self, request, uri, properties=False, data=False):
+        if self.isCollection() and data:
+            self.updateCTag()
+
+        return super(CalDAVFile, self).changed(
+            request,
+            uri,
+            properties=properties,
+            data=data)
+
     ##
     # Quota
     ##
@@ -585,8 +595,8 @@
 
         self.writeDeadProperty(
             CacheTokensProperty.fromString('%s:%s' % (propToken, dataToken)))
+        return succeed(None)
 
-
 class ScheduleFile (AutoProvisioningFileMixIn, CalDAVFile):
     def __init__(self, path, parent):
         super(ScheduleFile, self).__init__(path, principalCollections=parent.principalCollections())

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py	2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/test/test_resource.py	2008-04-10 22:59:12 UTC (rev 2298)
@@ -21,6 +21,7 @@
 from twisted.trial.unittest import TestCase
 from twistedcaldav.resource import CalDAVResource
 
+from twisted.internet.defer import succeed
 
 class StubLocatingRequest(object):
     """
@@ -31,7 +32,7 @@
         self.resources = resources or {}
 
     def locateResource(self, uri):
-        return self.resources.get(uri)
+        return succeed(self.resources.get(uri))
 
 
 
@@ -45,6 +46,7 @@
     def changed(self, *args, **kwargs):
         self.changedArgs = args
         self.changedKwArgs = kwargs
+        return succeed(None)
 
 
 class ChangedNotificationTestCase(TestCase):
@@ -59,30 +61,33 @@
         self.myCalendar = CalDAVResource()
         self.myCalendarURI = '/calendars/users/dreid/calendar'
 
+
     def _test(self, changedArgs, changedKwargs,
               expectedArgs, expectedKwargs):
-        self.myCalendar.changed(*changedArgs, **changedKwargs)
+        def _ranTest(result):
+            self.assertEquals(self.calendarHome.changedArgs,
+                              expectedArgs)
+            self.assertEquals(self.calendarHome.changedKwArgs,
+                              expectedKwargs)
 
-        self.assertEquals(self.calendarHome.changedArgs,
-                          expectedArgs)
-        self.assertEquals(self.calendarHome.changedKwArgs,
-                          expectedKwargs)
+        d = self.myCalendar.changed(*changedArgs, **changedKwargs)
+        d.addCallback(_ranTest)
+        return d
 
-
     def test_notifiesParentResource(self):
-        self._test((self.request, self.myCalendarURI),
-                   {},
-                   (self.request, self.myCalendarURI),
-                   {'properties': False, 'data': False})
+        return self._test((self.request, self.myCalendarURI),
+                          {},
+                          (self.request, self.myCalendarURI),
+                          {'properties': False, 'data': False})
 
     def test_propertiesChanged(self):
-        self._test((self.request, self.myCalendarURI),
-                   {'properties': True},
-                   (self.request, self.myCalendarURI),
-                   {'properties': True, 'data': False})
+        return self._test((self.request, self.myCalendarURI),
+                          {'properties': True},
+                          (self.request, self.myCalendarURI),
+                          {'properties': True, 'data': False})
 
     def test_dataChanged(self):
-        self._test((self.request, self.myCalendarURI),
-                   {'data': True},
-                   (self.request, self.myCalendarURI),
-                   {'properties': False, 'data': True})
+        return self._test((self.request, self.myCalendarURI),
+                          {'data': True},
+                          (self.request, self.myCalendarURI),
+                          {'properties': False, 'data': True})

Modified: CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py
===================================================================
--- CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py	2008-04-10 21:10:30 UTC (rev 2297)
+++ CalendarServer/branches/propfind-cache/twistedcaldav/test/test_static.py	2008-04-10 22:59:12 UTC (rev 2298)
@@ -24,9 +24,13 @@
 from twistedcaldav.test.test_resource import StubParentResource
 
 from twistedcaldav.static import CalendarHomeFile
+from twistedcaldav.static import CalDAVFile
 from twistedcaldav.static import CacheTokensProperty
+from twistedcaldav.customxml import GETCTag
+
 from twisted.web2.http import HTTPError, StatusResponse
 
+
 class InMemoryPropertyStore(object):
     def __init__(self, resource):
         self.resource = resource
@@ -57,6 +61,10 @@
 
 
 class CalendarHomeChangedTests(TestCase):
+    """
+    Ensure that CalendarHomeFile's changed method updates the cache tokens when
+    called.
+    """
     def setUp(self):
         self.parent = StubParentResource()
         self.parent.principalCollections = (lambda: [])
@@ -80,34 +88,95 @@
 
 
     def test_doesntPropogateToParent(self):
-        self.myCalendarHome.changed(self.request, '/calendars/users/dreid')
-        self.assertEquals(self.parent.changedArgs, None)
-        self.assertEquals(self.parent.changedKwArgs, None)
+        def _checkChanged(result):
+            self.assertEquals(self.parent.changedArgs, None)
+            self.assertEquals(self.parent.changedKwArgs, None)
+            self.assertEquals(result, None)
 
+        d = self.myCalendarHome.changed(self.request, '/calendars/users/dreid')
+        d.addCallback(_checkChanged)
+        return d
 
     def _test(self, properties=False, data=False, expectedTokens=None):
-        self.myCalendarHome.changed(self.request, '/calendars/users/dreid',
+        def _checkChanged(result):
+            tokens = self.properties._properties[CacheTokensProperty.qname()]
+            self.assertEquals(tokens.children[0].data, expectedTokens)
+            self.assertEquals(result, None)
+
+        d = self.myCalendarHome.changed(self.request, '/calendars/users/dreid',
                                     properties=properties, data=data)
+        d.addCallback(_checkChanged)
+        return d
 
-        tokens = self.properties._properties[CacheTokensProperty.qname()]
-        self.assertEquals(tokens.children[0].data, expectedTokens)
-
-
     def test_changesPropertyToken(self):
-        self._test(properties=True, expectedTokens='propertyToken1:dataToken0')
+        return self._test(properties=True,
+                          expectedTokens='propertyToken1:dataToken0')
 
 
     def test_changesDataToken(self):
-        self._test(data=True, expectedTokens='propertyToken0:dataToken1')
+        return self._test(data=True, expectedTokens='propertyToken0:dataToken1')
 
 
     def test_changesBothTokens(self):
-        self._test(properties=True, data=True,
+        return self._test(properties=True, data=True,
                    expectedTokens='propertyToken1:dataToken1')
 
 
     def test_initializesNonExistantProperty(self):
         self.properties._properties = {}
         self.myCalendarHome._called = [0,0]
-        self._test(properties=False, data=False,
-                   expectedTokens='propertyToken0:dataToken0')
+        return self._test(properties=False, data=False,
+                          expectedTokens='propertyToken0:dataToken0')
+
+
+
+class CalDAVFileChangedTests(TestCase):
+    """
+    Ensure that CalDAVFile's changed method updates the ctag on collections
+    and delegates to the parent.
+    """
+    def setUp(self):
+        self.parent = StubParentResource()
+        self.parent.principalCollections = (lambda: [])
+        self.request = StubLocatingRequest({'/calendars/users/': self.parent})
+
+        self.myCalDAVFile = CalDAVFile(self.mktemp())
+        self.properties = InMemoryPropertyStore(self.myCalDAVFile)
+        self.myCalDAVFile._dead_properties = self.properties
+
+
+    def test_propogatesToParent(self):
+        def _checkParentChanged(result):
+            self.assertEquals(self.parent.changedArgs,
+                              (self.request, '/calendars/users/dreid'))
+            self.assertEquals(self.parent.changedKwArgs,
+                              {'properties': False, 'data': False})
+
+        d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid')
+        d.addCallback(_checkParentChanged)
+        return d
+
+
+    def test_updatesCTagOnCollection(self):
+        def _checkCTag(result):
+            ctag = self.properties._properties.get(GETCTag.qname())
+            self.failUnless(isinstance(ctag, GETCTag))
+
+        self.myCalDAVFile.isCollection = (lambda: True)
+        d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid',
+                                      data=True)
+        d.addCallback(_checkCTag)
+        return d
+
+
+    def test_doesNotUpdateCTagOnNonCollection(self):
+        self.myCalDAVFile.isCollection = (lambda: False)
+        d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid')
+        return d
+
+
+    def test_doesNotUpdateCTagOnPropertyChange(self):
+        self.myCalDAVFile.isCollection = (lambda: True)
+        d = self.myCalDAVFile.changed(self.request, '/calendars/users/dreid',
+                                      properties=True)
+        return d

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080410/e2acca1c/attachment-0001.html


More information about the calendarserver-changes mailing list