[CalendarServer-changes] [5319] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 16 13:14:53 PDT 2010


Revision: 5319
          http://trac.macosforge.org/projects/calendarserver/changeset/5319
Author:   sagen at apple.com
Date:     2010-03-16 13:14:52 -0700 (Tue, 16 Mar 2010)
Log Message:
-----------
Removed the PROPFIND response cache

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/provision/root.py
    CalendarServer/trunk/calendarserver/provision/test/test_root.py
    CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist
    CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist
    CalendarServer/trunk/conf/caldavd-test.plist
    CalendarServer/trunk/conf/carddavd-test.plist
    CalendarServer/trunk/conf/resources/caldavd-resources.plist
    CalendarServer/trunk/twistedcaldav/directory/calendaruserproxy.py
    CalendarServer/trunk/twistedcaldav/directory/opendirectorybacker.py
    CalendarServer/trunk/twistedcaldav/directory/principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist
    CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py
    CalendarServer/trunk/twistedcaldav/extensions.py
    CalendarServer/trunk/twistedcaldav/notify.py
    CalendarServer/trunk/twistedcaldav/resource.py
    CalendarServer/trunk/twistedcaldav/static.py
    CalendarServer/trunk/twistedcaldav/stdconfig.py

Removed Paths:
-------------
    CalendarServer/trunk/twistedcaldav/cache.py
    CalendarServer/trunk/twistedcaldav/test/test_cache.py
    CalendarServer/trunk/twistedcaldav/test/test_static.py

Modified: CalendarServer/trunk/calendarserver/provision/root.py
===================================================================
--- CalendarServer/trunk/calendarserver/provision/root.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/calendarserver/provision/root.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -34,9 +34,6 @@
 from twistedcaldav.extensions import DirectoryPrincipalPropertySearchMixIn
 from twistedcaldav.extensions import ReadOnlyResourceMixIn
 from twistedcaldav.config import config
-from twistedcaldav.cache import _CachedResponseResource
-from twistedcaldav.cache import MemcacheResponseCache, MemcacheChangeNotifier
-from twistedcaldav.cache import DisabledCache
 from twistedcaldav.static import CalendarHomeFile
 from twistedcaldav.directory.principal import DirectoryPrincipalResource
 
@@ -63,14 +60,6 @@
 
         self.contentFilters = []
 
-        if config.Memcached.Pools.Default.ClientEnabled:
-            self.responseCache = MemcacheResponseCache(self.fp)
-
-            CalendarHomeFile.cacheNotifierFactory = MemcacheChangeNotifier
-            DirectoryPrincipalResource.cacheNotifierFactory = MemcacheChangeNotifier
-        else:
-            self.responseCache = DisabledCache()
-
         if config.ResponseCompression:
             from twext.web2.filter import gzip
             self.contentFilters.append((gzip.gzipfilter, True))
@@ -260,30 +249,6 @@
                     request.extendedLogItems = {}
                 request.extendedLogItems["xff"] = remote_ip[0]
 
-        if request.method == "PROPFIND" and not getattr(request, "notInCache", False) and len(segments) > 1:
-            try:
-                authnUser, authzUser = (yield self.authenticate(request))
-                request.authnUser = authnUser
-                request.authzUser = authzUser
-            except (UnauthorizedLogin, LoginFailed):
-                response = (yield UnauthorizedResponse.makeResponse(
-                    request.credentialFactories,
-                    request.remoteAddr
-                ))
-                raise HTTPError(response)
-
-            try:
-                if not getattr(request, "checkingCache", False):
-                    request.checkingCache = True
-                    response = (yield self.responseCache.getResponseForRequest(request))
-                    if response is None:
-                        request.notInCache = True
-                        raise KeyError("Not found in cache.")
-        
-                    returnValue((_CachedResponseResource(response), []))
-            except KeyError:
-                pass
-
         child = (yield super(RootResource, self).locateChild(request, segments))
         returnValue(child)
 

Modified: CalendarServer/trunk/calendarserver/provision/test/test_root.py
===================================================================
--- CalendarServer/trunk/calendarserver/provision/test/test_root.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/calendarserver/provision/test/test_root.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -295,79 +295,7 @@
         )
         return self.send(request, do_test)
 
-class SACLCacheTests(RootTests):
-    
-    class StubResponseCacheResource(object):
-        def __init__(self):
-            self.cache = {}
-            self.responseCache = self
-            self.cacheHitCount = 0
 
-        def getResponseForRequest(self, request):
-            if str(request) in self.cache:
-                self.cacheHitCount += 1
-                return self.cache[str(request)]
-    
-    
-        def cacheResponseForRequest(self, request, response):
-            self.cache[str(request)] = response
-            return response
-
-    def setUp(self):
-        super(SACLCacheTests, self).setUp()
-        self.root.resource.responseCache = SACLCacheTests.StubResponseCacheResource()
-
-    def test_PROPFIND(self):
-        self.root.resource.useSacls = True
-
-        body = """<?xml version="1.0" encoding="utf-8" ?>
-<D:propfind xmlns:D="DAV:">
-<D:prop>
-<D:getetag/>
-<D:displayname/>
-</D:prop>
-</D:propfind>
-"""
-
-        request = SimpleRequest(
-            self.site,
-            "PROPFIND",
-            "/principals/users/dreid/",
-            headers=http_headers.Headers({
-                    'Authorization': ['basic', '%s' % ('dreid:dierd'.encode('base64'),)],
-                    'Content-Type': 'application/xml; charset="utf-8"',
-                    'Depth':'1',
-            }),
-            content=body
-        )
-
-        def gotResponse1(response):
-            if response.code != responsecode.MULTI_STATUS:
-                self.fail("Incorrect response for PROPFIND /principals/: %s" % (response.code,))
-
-            request = SimpleRequest(
-                self.site,
-                "PROPFIND",
-                "/principals/users/dreid/",
-                headers=http_headers.Headers({
-                        'Authorization': ['basic', '%s' % ('dreid:dierd'.encode('base64'),)],
-                        'Content-Type': 'application/xml; charset="utf-8"',
-                        'Depth':'1',
-                }),
-                content=body
-            )
-
-            d = self.send(request, gotResponse2)
-            return d
-
-        def gotResponse2(response):
-            if response.code != responsecode.MULTI_STATUS:
-                self.fail("Incorrect response for PROPFIND /principals/: %s" % (response.code,))
-            self.assertEqual(self.root.resource.responseCache.cacheHitCount, 1)
-
-        d = self.send(request, gotResponse1)
-        return d
-
 class WikiTests(RootTests):
     
     @inlineCallbacks

Modified: CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/calendarserver/tools/test/gateway/caldavd.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -743,11 +743,7 @@
         </dict>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
 
-
     <!--
         Twisted
       -->

Modified: CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist
===================================================================
--- CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/calendarserver/tools/test/principals/caldavd.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -743,11 +743,6 @@
         </dict>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
-
-
     <!--
         Twisted
       -->

Modified: CalendarServer/trunk/conf/caldavd-test.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd-test.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/conf/caldavd-test.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -707,11 +707,7 @@
       </array>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
 
-
     <!--
         Twisted
       -->

Modified: CalendarServer/trunk/conf/carddavd-test.plist
===================================================================
--- CalendarServer/trunk/conf/carddavd-test.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/conf/carddavd-test.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -721,11 +721,7 @@
       </array>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
 
-
     <!--
         Twisted
       -->

Modified: CalendarServer/trunk/conf/resources/caldavd-resources.plist
===================================================================
--- CalendarServer/trunk/conf/resources/caldavd-resources.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/conf/resources/caldavd-resources.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -718,11 +718,7 @@
       </array>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
 
-
     <!--
         Twisted
       -->

Deleted: CalendarServer/trunk/twistedcaldav/cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cache.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/cache.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -1,350 +0,0 @@
-##
-# Copyright (c) 2008-2010 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.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-import cPickle
-import hashlib
-import uuid
-
-from zope.interface import implements
-
-from twisted.internet.defer import succeed, maybeDeferred
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http import Response
-from twext.web2.iweb import IResource
-from twext.web2.stream import MemoryStream
-
-from twext.python.log import LoggingMixIn
-
-from twistedcaldav.memcachepool import CachePoolUserMixIn, defaultCachePool
-from twistedcaldav.config import config
-
-
-class DisabledCacheNotifier(object):
-    def __init__(self, *args, **kwargs):
-        pass
-
-    def changed(self):
-        return succeed(None)
-
-
-class DisabledCache(object):
-    def getResponseForRequest(self, request):
-        return succeed(None)
-
-    def cacheResponseForRequest(self, request, response):
-        return succeed(response)
-
-
-class URINotFoundException(Exception):
-    def __init__(self, uri):
-        self.uri = uri
-
-
-    def __repr__(self):
-        return "%s: Could not find URI %r" % (
-            self.__class__.__name__,
-            self.uri)
-
-
-class MemcacheChangeNotifier(LoggingMixIn, CachePoolUserMixIn):
-
-    def __init__(self, resource, cachePool=None, cacheHandle="Default"):
-        self._resource = resource
-        self._cachePool = cachePool
-        self._cachePoolHandle = cacheHandle
-
-    def _newCacheToken(self):
-        return str(uuid.uuid4())
-
-    def changed(self):
-        """
-        Change the cache token for a resource
-
-        return: A L{Deferred} that fires when the token has been changed.
-        """
-        url = self._resource.url()
-
-        self.log_debug("Changing Cache Token for %r" % (url,))
-        return self.getCachePool().set(
-            'cacheToken:%s' % (url,),
-            self._newCacheToken(), expireTime=config.ResponseCacheTimeout*60)
-
-
-class BaseResponseCache(LoggingMixIn):
-    """
-    A base class which provides some common operations
-    """
-    def _principalURI(self, principal):
-        return str(principal.children[0])
-
-
-    def _uriNotFound(self, f, uri):
-        f.trap(AttributeError)
-        raise URINotFoundException(uri)
-
-
-    def _getRecordForURI(self, uri, request):
-        def _getRecord(resrc):
-            if hasattr(resrc, 'record'):
-                return resrc.record
-
-        try:
-            return request.locateResource(uri).addCallback(
-                _getRecord).addErrback(self._uriNotFound, uri)
-        except AssertionError:
-            raise URINotFoundException(uri)
-
-
-    def _canonicalizeURIForRequest(self, uri, request):
-        try:
-            return request.locateResource(uri).addCallback(
-                lambda resrc: resrc.url()).addErrback(self._uriNotFound, uri)
-        except AssertionError:
-            raise URINotFoundException(uri)
-
-
-    def _getURIs(self, request):
-        def _getSecondURI(rURI):
-            return self._canonicalizeURIForRequest(
-                self._principalURI(request.authnUser),
-                request).addCallback(lambda pURI: (pURI, rURI))
-
-        d = self._canonicalizeURIForRequest(request.uri, request)
-        d.addCallback(_getSecondURI)
-
-        return d
-
-
-    def _requestKey(self, request):
-        def _getBody(uris):
-            return allDataFromStream(request.stream).addCallback(
-                lambda body: (body, uris))
-
-        def _getKey((requestBody, (pURI, rURI))):
-            if requestBody is not None:
-                request.stream = MemoryStream(requestBody)
-                request.stream.doStartReading = None
-
-            request.cacheKey = (request.method,
-                                pURI,
-                                rURI,
-                                request.headers.getHeader('depth'),
-                                hash(requestBody))
-
-            return request.cacheKey
-
-        d = _getBody((self._principalURI(request.authnUser), request.uri))
-        d.addCallback(_getKey)
-        return d
-
-
-    def _getResponseBody(self, key, response):
-        d1 = allDataFromStream(response.stream)
-        d1.addCallback(lambda responseBody: (key, responseBody))
-        return d1
-
-
-class MemcacheResponseCache(BaseResponseCache, CachePoolUserMixIn):
-    def __init__(self, docroot, cachePool=None):
-        self._docroot = docroot
-        self._cachePool = cachePool
-
-
-    def _tokenForURI(self, uri, cachePoolHandle=None):
-        """
-        Get a property store for the given C{uri}.
-
-        @param uri: The URI we'd like the token for.
-        @return: A C{str} representing the token for the URI.
-        """
-
-        if cachePoolHandle:
-            return defaultCachePool(cachePoolHandle).get('cacheToken:%s' % (uri,))
-        else:
-            return self.getCachePool().get('cacheToken:%s' % (uri,))
-
-
-    def _getTokens(self, request):
-        def _tokensForURIs((pURI, rURI)):
-            tokens = []
-            d1 = self._tokenForURI(pURI, "PrincipalToken")
-            d1.addCallback(tokens.append)
-            d1.addCallback(lambda _ign: self._getRecordForURI(pURI, request))
-            d1.addCallback(lambda dToken: tokens.append(hash(dToken)))
-            d1.addCallback(lambda _ign: self._tokenForURI(rURI))
-            d1.addCallback(tokens.append)
-            d1.addCallback(lambda _ign: tokens)
-            return d1
-
-        d = self._getURIs(request)
-        d.addCallback(_tokensForURIs)
-        return d
-
-
-    def _hashedRequestKey(self, request):
-        def _hashKey(key):
-            oldkey = key
-            request.cacheKey = key = hashlib.md5(
-                ':'.join([str(t) for t in key])).hexdigest()
-            self.log_debug("hashing key for get: %r to %r" % (oldkey, key))
-            return request.cacheKey
-
-        d = self._requestKey(request)
-        d.addCallback(_hashKey)
-        return d
-
-
-    def getResponseForRequest(self, request):
-        def _checkTokens(curTokens, expectedTokens, (code, headers, body)):
-            if curTokens[0] != expectedTokens[0]:
-                self.log_debug(
-                    "Principal token doesn't match for %r: %r != %r" % (
-                        request.cacheKey,
-                        curTokens[0],
-                        expectedTokens[0]))
-                return None
-
-            if curTokens[1] != expectedTokens[1]:
-                self.log_debug(
-                    "Directory Record Token doesn't match for %r: %r != %r" % (
-                        request.cacheKey,
-                        curTokens[1],
-                        expectedTokens[1]))
-                return None
-
-            if curTokens[2] != expectedTokens[2]:
-                self.log_debug(
-                    "URI token doesn't match for %r: %r != %r" % (
-                        request.cacheKey,
-                        curTokens[1],
-                        expectedTokens[1]))
-                return None
-
-            r = Response(code,
-                         stream=MemoryStream(body))
-
-            for key, value in headers.iteritems():
-                r.headers.setRawHeaders(key, value)
-
-            return r
-
-        def _unpickleResponse((flags, value), key):
-            if value is None:
-                self.log_debug("Not in cache: %r" % (key,))
-                return None
-
-            self.log_debug("Found in cache: %r = %r" % (key, value))
-
-            (principalToken, directoryToken, uriToken,
-             resp) = cPickle.loads(value)
-            d2 = self._getTokens(request)
-
-            d2.addCallback(_checkTokens,
-                           (principalToken,
-                            directoryToken,
-                            uriToken),
-                           resp)
-
-            return d2
-
-        def _getCached(key):
-            self.log_debug("Checking cache for: %r" % (key,))
-            d1 = self.getCachePool().get(key)
-            return d1.addCallback(_unpickleResponse, key)
-
-        def _handleExceptions(f):
-            f.trap(URINotFoundException)
-            self.log_debug("Could not locate URI: %r" % (f.value,))
-            return None
-
-        d = self._hashedRequestKey(request)
-        d.addCallback(_getCached)
-        d.addErrback(_handleExceptions)
-        return d
-
-
-    def cacheResponseForRequest(self, request, response):
-        def _makeCacheEntry((pToken, dToken, uToken), (key, responseBody)):
-            cacheEntry = cPickle.dumps(
-                (pToken,
-                 dToken,
-                 uToken,
-                 (response.code,
-                  dict(list(response.headers.getAllRawHeaders())),
-                  responseBody)))
-
-            self.log_debug("Adding to cache: %r = %r" % (key, cacheEntry))
-            return self.getCachePool().set(key, cacheEntry,
-                expireTime=config.ResponseCacheTimeout*60).addCallback(
-                lambda _: response)
-
-        def _cacheResponse((key, responseBody)):
-
-            response.headers.removeHeader('date')
-            response.stream = MemoryStream(responseBody)
-
-            d1 = self._getTokens(request)
-            d1.addCallback(_makeCacheEntry, (key, responseBody))
-            return d1
-
-        def _handleExceptions(f):
-            f.trap(URINotFoundException)
-            self.log_debug("Could not locate URI: %r" % (f.value,))
-            return response
-
-        if hasattr(request, 'cacheKey'):
-            d = succeed(request.cacheKey)
-        else:
-            d = self._hashedRequestKey(request)
-
-        d.addCallback(self._getResponseBody, response)
-        d.addCallback(_cacheResponse)
-        d.addErrback(_handleExceptions)
-        return d
-
-
-class _CachedResponseResource(object):
-    implements(IResource)
-
-    def __init__(self, response):
-        self._response = response
-
-    def renderHTTP(self, request):
-        if not hasattr(request, "extendedLogItems"):
-            request.extendedLogItems = {}
-        request.extendedLogItems["cached"] = "1"
-        return self._response
-
-    def locateChild(self, request, segments):
-        return self, []
-
-
-class PropfindCacheMixin(object):
-    def renderHTTP(self, request):
-        def _cacheResponse(responseCache, response):
-            return responseCache.cacheResponseForRequest(request, response)
-
-        def _getResponseCache(response):
-            d1 = request.locateResource("/")
-            d1.addCallback(lambda resource: resource.responseCache)
-            d1.addCallback(_cacheResponse, response)
-            return d1
-
-        d = maybeDeferred(super(PropfindCacheMixin, self).renderHTTP, request)
-
-        if request.method == 'PROPFIND':
-            d.addCallback(_getResponseCache)
-        return d

Modified: CalendarServer/trunk/twistedcaldav/directory/calendaruserproxy.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/calendaruserproxy.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/calendaruserproxy.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -194,20 +194,10 @@
 
         # Get the old set of UIDs
         oldUIDs = (yield self._index().getMembers(self.uid))
-        
+
         # Change membership
         yield self.setGroupMemberSetPrincipals(principals)
-        
-        # Invalidate the primary principal's cache, and any principal's whose
-        # membership status changed
-        yield self.parent.cacheNotifier.changed()
-        
-        changedUIDs = newUIDs.symmetric_difference(oldUIDs)
-        for uid in changedUIDs:
-            principal = self.pcollection.principalForUID(uid)
-            if principal:
-                yield principal.cacheNotifier.changed()
-            
+
         returnValue(True)
 
     def setGroupMemberSetPrincipals(self, principals):

Modified: CalendarServer/trunk/twistedcaldav/directory/opendirectorybacker.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/opendirectorybacker.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/opendirectorybacker.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -453,11 +453,6 @@
                         self.directoryBackedAddressBook.fp.restat()
                         
                         self.directoryBackedAddressBook.writeDeadProperty(newAddressBookCTag)
-                        if hasattr(self.directoryBackedAddressBook, 'cacheNotifier'):
-                            yield self.directoryBackedAddressBook.cacheNotifier.changed()
-                        #else:
-                        #    self.log_info("%r does not have a cacheNotifier but the CTag changed"
-                        #                              % (self.directoryBackedAddressBook,))
                     finally:
                         self.log_debug("unlocking: \"%s\")" % self._tmpDirAddressBookLockPath)
                         yield tmpDirLock.release()

Modified: CalendarServer/trunk/twistedcaldav/directory/principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/principal.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/principal.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -54,7 +54,6 @@
 
 from twistedcaldav.authkerb import NegotiateCredentials
 from twistedcaldav.config import config
-from twistedcaldav.cache import DisabledCacheNotifier, PropfindCacheMixin
 from twistedcaldav.directory import calendaruserproxy
 from twistedcaldav.directory import augment
 from twistedcaldav.directory.calendaruserproxy import CalendarUserProxyPrincipalResource
@@ -510,7 +509,7 @@
     def principalCollections(self):
         return self.parent.principalCollections()
 
-class DirectoryPrincipalResource (PropfindCacheMixin, PermissionsMixIn, DAVPrincipalResource, DAVFile):
+class DirectoryPrincipalResource (PermissionsMixIn, DAVPrincipalResource, DAVFile):
     """
     Directory principal resource.
     """
@@ -521,8 +520,6 @@
         (calendarserver_namespace, "email-address-set"),
     )
 
-    cacheNotifierFactory = DisabledCacheNotifier
-
     def __init__(self, parent, record):
         """
         @param parent: the parent of this resource.
@@ -530,8 +527,6 @@
         """
         super(DirectoryPrincipalResource, self).__init__(NotFilePath(isdir=True))
 
-        self.cacheNotifier = self.cacheNotifierFactory(self, cacheHandle="PrincipalToken")
-
         if self.isCollection():
             slash = "/"
         else:

Modified: CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/test/resources/caldavd.plist	2010-03-16 20:14:52 UTC (rev 5319)
@@ -719,11 +719,7 @@
       </array>
     </dict>
 
-    <!-- Response Caching -->
-    <key>ResponseCacheTimeout</key>
-    <integer>30</integer> <!-- in minutes -->
 
-
     <!--
         Twisted
       -->

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_principal.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -34,8 +34,6 @@
 from twistedcaldav.directory.principal import DirectoryPrincipalResource
 from twistedcaldav.directory.principal import DirectoryCalendarPrincipalResource
 
-from twistedcaldav.cache import DisabledCacheNotifier
-
 import twistedcaldav.test.util
 
 
@@ -297,15 +295,6 @@
     # DirectoryPrincipalResource
     ##
 
-    def test_cacheNotifier(self):
-        """
-        Each DirectoryPrincipalResource should have a cacheNotifier attribute
-        that is an instance of XattrCacheChangeNotifier
-        """
-        for provisioningResource, recordType, recordResource, record in self._allRecords():
-            self.failUnless(isinstance(recordResource.cacheNotifier,
-                                       DisabledCacheNotifier))
-
     def test_displayName(self):
         """
         DirectoryPrincipalResource.displayName()

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_proxyprincipalmembers.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -299,37 +299,7 @@
             set(["5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1",
                  "8B4288F6-CC82-491D-8EF9-642EF4F3E7D0"]))
 
-    @inlineCallbacks
-    def test_setGroupMemberSetNotifiesPrincipalCaches(self):
-        class StubCacheNotifier(object):
-            changedCount = 0
-            def changed(self):
-                self.changedCount += 1
-                return succeed(None)
 
-        user = self._getPrincipalByShortName(self.directoryService.recordType_users, "cdaboo")
-
-        proxyGroup = user.getChild("calendar-proxy-write")
-
-        notifier = StubCacheNotifier()
-
-        oldCacheNotifier = DirectoryPrincipalResource.cacheNotifierFactory
-
-        try:
-            DirectoryPrincipalResource.cacheNotifierFactory = (lambda _1, _2, **kwargs: notifier)
-
-            self.assertEquals(notifier.changedCount, 0)
-
-            yield proxyGroup.setGroupMemberSet(
-                davxml.GroupMemberSet(
-                    davxml.HRef.fromString(
-                        "/XMLDirectoryService/__uids__/5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1/")),
-                None)
-
-            self.assertEquals(notifier.changedCount, 1)
-        finally:
-            DirectoryPrincipalResource.cacheNotifierFactory = oldCacheNotifier
-
     def test_proxyFor(self):
 
         return self._proxyForTest(

Modified: CalendarServer/trunk/twistedcaldav/extensions.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/extensions.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/extensions.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -259,26 +259,7 @@
             result = (yield super(SudoSACLMixin, self).authorizationPrincipal(request, authID, authnPrincipal))
             returnValue(result)
 
-def updateCacheTokenOnCallback(f):
-    def wrapper(self, *args, **kwargs):
-        if hasattr(self, "cacheNotifier"):
-            def updateToken(response):
-                d = self.cacheNotifier.changed()
-                d.addCallback(lambda _: response)
-                return d
 
-            d = maybeDeferred(f, self, *args, **kwargs)
-
-            if hasattr(self, "cacheNotifier"):
-                d.addCallback(updateToken)
-
-            return d
-        else:
-            return f(self, *args, **kwargs)
-
-    return wrapper
-
-
 class DirectoryPrincipalPropertySearchMixIn(object):
 
     @inlineCallbacks
@@ -457,21 +438,6 @@
         log.info("%s %s %s" % (request.method, urllib.unquote(request.uri), "HTTP/%s.%s" % request.clientproto))
         return super(DAVResource, self).renderHTTP(request)
 
-    @updateCacheTokenOnCallback
-    def http_PROPPATCH(self, request):
-        return super(DAVResource, self).http_PROPPATCH(request)
-
-
-    @updateCacheTokenOnCallback
-    def http_DELETE(self, request):
-        return super(DAVResource, self).http_DELETE(request)
-
-
-    @updateCacheTokenOnCallback
-    def http_ACL(self, request):
-        return super(DAVResource, self).http_ACL(request)
-
-    
     http_REPORT = http_REPORT
 
 

Modified: CalendarServer/trunk/twistedcaldav/notify.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/notify.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/notify.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -29,7 +29,6 @@
 
 The icalserver tap creates a NotificationClient object at startup;
 it deals with passing along notifications to the notification server.
-These notifications originate from cache.py:MemcacheChangeNotifier.changed().
 """
 
 # TODO: add CalDAVTester test for examining new xmpp-uri property

Modified: CalendarServer/trunk/twistedcaldav/resource.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/resource.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/resource.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -96,22 +96,6 @@
         return tuple(super(CalDAVComplianceMixIn, self).davComplianceClasses()) + extra_compliance
 
 
-def updateCacheTokenOnCallback(f):
-    def fun(self, *args, **kwargs):
-        def _updateToken(response):
-            return self.cacheNotifier.changed().addCallback(
-                lambda _: response)
-
-        d = maybeDeferred(f, self, *args, **kwargs)
-
-        if hasattr(self, 'cacheNotifier'):
-            d.addCallback(_updateToken)
-
-        return d
-
-    return fun
-
-
 class CalDAVResource (CalDAVComplianceMixIn, DAVResource, LoggingMixIn):
     """
     CalDAV resource.
@@ -179,19 +163,7 @@
 
         return response
 
-    @updateCacheTokenOnCallback
-    def http_PROPPATCH(self, request):
-        return super(CalDAVResource, self).http_PROPPATCH(request)
 
-    @updateCacheTokenOnCallback
-    def http_DELETE(self, request):
-        return super(CalDAVResource, self).http_DELETE(request)
-
-    @updateCacheTokenOnCallback
-    def http_ACL(self, request):
-        return super(CalDAVResource, self).http_ACL(request)
-
-
     ##
     # WebDAV
     ##

Modified: CalendarServer/trunk/twistedcaldav/static.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/static.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/static.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -93,7 +93,6 @@
 from twistedcaldav.directory.resource import AutoProvisioningResourceMixIn
 from twistedcaldav.timezoneservice import TimezoneServiceResource
 from twistedcaldav.vcardindex import AddressBookIndex
-from twistedcaldav.cache import DisabledCacheNotifier, PropfindCacheMixin
 from twistedcaldav.notify import getPubSubConfiguration, getPubSubXMPPURI
 from twistedcaldav.notify import getPubSubHeartbeatURI, getPubSubPath
 from twistedcaldav.notify import ClientNotifier, getNodeCacher
@@ -562,12 +561,6 @@
             log.debug("%r does not have a clientNotifier but the CTag changed"
                       % (self,))
 
-        if hasattr(self, 'cacheNotifier'):
-            return self.cacheNotifier.changed()
-        else:
-            log.debug("%r does not have a cacheNotifier but the CTag changed"
-                      % (self,))
-
         return succeed(True)
 
     ##
@@ -913,12 +906,10 @@
     def url(self):
         return joinURL(self.parent.url(), self.record.uid)
 
-class CalendarHomeFile (PropfindCacheMixin, AutoProvisioningFileMixIn, DirectoryCalendarHomeResource, CalDAVFile):
+class CalendarHomeFile (AutoProvisioningFileMixIn, DirectoryCalendarHomeResource, CalDAVFile):
     """
     Calendar home collection resource.
     """
-    cacheNotifierFactory = DisabledCacheNotifier
-
     liveProperties = CalDAVFile.liveProperties + (
         (customxml.calendarserver_namespace, "xmpp-uri"),
         (customxml.calendarserver_namespace, "xmpp-heartbeat-uri"),
@@ -929,7 +920,6 @@
         """
         @param path: the path to the file which will back the resource.
         """
-        self.cacheNotifier = self.cacheNotifierFactory(self)
         self.clientNotifier = ClientNotifier(self)
         CalDAVFile.__init__(self, path)
         DirectoryCalendarHomeResource.__init__(self, parent, record)
@@ -954,7 +944,6 @@
 
         if cls is not None:
             child = cls(self.fp.child(name).path, self)
-            child.cacheNotifier = self.cacheNotifier
             child.clientNotifier = self.clientNotifier
             return child
 
@@ -965,7 +954,6 @@
             return self
         else:
             similar = CalDAVFile(path, principalCollections=self.principalCollections())
-            similar.cacheNotifier = self.cacheNotifier
             similar.clientNotifier = self.clientNotifier
             return similar
 
@@ -1417,12 +1405,10 @@
     def createSimilarFile(self, path):
         raise HTTPError(responsecode.NOT_FOUND)
 
-class AddressBookHomeFile (PropfindCacheMixin, AutoProvisioningFileMixIn, DirectoryAddressBookHomeResource, CalDAVFile):
+class AddressBookHomeFile (AutoProvisioningFileMixIn, DirectoryAddressBookHomeResource, CalDAVFile):
     """
     Address book home collection resource.
     """
-    cacheNotifierFactory = DisabledCacheNotifier
-
     liveProperties = CalDAVFile.liveProperties + (
         (customxml.calendarserver_namespace, "xmpp-uri"),
     )
@@ -1431,7 +1417,6 @@
         """
         @param path: the path to the file which will back the resource.
         """
-        self.cacheNotifier = self.cacheNotifierFactory(self)
         self.clientNotifier = ClientNotifier(self)
         CalDAVFile.__init__(self, path)
         DirectoryAddressBookHomeResource.__init__(self, parent, record)
@@ -1452,7 +1437,6 @@
 
         if cls is not None:
             child = cls(self.fp.child(name).path, self)
-            child.cacheNotifier = self.cacheNotifier
             child.clientNotifier = self.clientNotifier
             return child
 
@@ -1463,7 +1447,6 @@
             return self
         else:
             similar = CalDAVFile(path, principalCollections=self.principalCollections())
-            similar.cacheNotifier = self.cacheNotifier
             similar.clientNotifier = self.clientNotifier
             return similar
 

Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/stdconfig.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/stdconfig.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -532,7 +532,6 @@
     },
 
     "EnableKeepAlive": True,
-    "ResponseCacheTimeout": 30, # Minutes
     
     "Includes": [],     # Other plists to parse after this one
 }

Deleted: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -1,479 +0,0 @@
-##
-# Copyright (c) 2008-2010 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.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-from new import instancemethod
-import hashlib
-import cPickle
-
-from twisted.internet.defer import succeed, maybeDeferred
-
-from twext.web2.dav import davxml
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.stream import MemoryStream
-from twext.web2.http_headers import Headers
-
-from twistedcaldav.cache import MemcacheResponseCache
-from twistedcaldav.cache import MemcacheChangeNotifier
-from twistedcaldav.cache import PropfindCacheMixin
-
-from twistedcaldav.test.util import InMemoryMemcacheProtocol
-from twistedcaldav.test.util import TestCase
-
-
-def _newCacheToken(self):
-    called = getattr(self, '_called', 0)
-
-    token = 'token%d' % (called,)
-    setattr(self, '_called', called + 1)
-    return token
-
-
-
-class StubRequest(object):
-    resources = {}
-
-    def __init__(self, method, uri, authnUser, depth='1', body=None):
-        self.method = method
-        self.uri = uri
-        self.authnUser = davxml.Principal(davxml.HRef.fromString(authnUser))
-        self.headers = Headers({'depth': depth})
-
-        if body is None:
-            body = "foobar"
-
-        self.body = body
-        self.stream = MemoryStream(body)
-
-
-    def locateResource(self, uri):
-        assert uri[0] == '/', "URI path didn't begin with '/': %s" % (uri,)
-        return succeed(self.resources.get(uri))
-
-
-
-class StubResponse(object):
-    def __init__(self, code, headers, body):
-        self.code = code
-        self.headers = Headers(headers)
-        self.body = body
-        self.stream = MemoryStream(body)
-
-
-
-class StubURLResource(object):
-    def __init__(self, url, record=None):
-        self._url = url
-
-        if record is not None:
-            self.record = record
-
-    def url(self):
-        return self._url
-
-
-
-class MemCacheChangeNotifierTests(TestCase):
-    def setUp(self):
-        TestCase.setUp(self)
-        self.memcache = InMemoryMemcacheProtocol()
-        self.ccn = MemcacheChangeNotifier(
-            StubURLResource(':memory:'),
-            cachePool=self.memcache)
-
-        self.ccn._newCacheToken = instancemethod(_newCacheToken,
-                                                 self.ccn,
-                                                 MemcacheChangeNotifier)
-
-    def assertToken(self, expectedToken):
-        token = self.memcache._cache['cacheToken::memory:'][1]
-        self.assertEquals(token, expectedToken)
-
-
-    def test_cacheTokenPropertyIsProvisioned(self):
-        d = self.ccn.changed()
-        d.addCallback(lambda _: self.assertToken('token0'))
-        return d
-
-
-    def test_changedChangesToken(self):
-        d = self.ccn.changed()
-        d.addCallback(lambda _: self.ccn.changed())
-        d.addCallback(lambda _: self.assertToken('token1'))
-        return d
-
-
-    def tearDown(self):
-        for call in self.memcache._timeouts.itervalues():
-            call.cancel()
-        MemcacheChangeNotifier._memcacheProtocol = None
-
-
-
-class BaseCacheTestMixin(object):
-    def setUp(self):
-        StubRequest.resources = {
-            '/calendars/__uids__/cdaboo/': StubURLResource(
-                '/calendars/__uids__/cdaboo/'),
-            '/calendars/users/cdaboo/': StubURLResource(
-                '/calendars/__uids__/cdaboo/'),
-            '/principals/__uids__/cdaboo/': StubURLResource(
-                '/principals/__uids__/cdaboo/', record='directoryToken0'),
-            '/calendars/__uids__/dreid/': StubURLResource(
-                '/calendars/__uids__/dreid/'),
-            '/principals/__uids__/dreid/': StubURLResource(
-                '/principals/__uids__/dreid/', record='directoryToken0')}
-
-
-    def tearDown(self):
-        StubRequest.resources = {}
-
-
-    def assertResponse(self, response, expected):
-        self.assertNotEquals(response, None, "Got None instead of a response.")
-        self.assertEquals(response.code, expected[0])
-        self.assertEquals(set(response.headers.getAllRawHeaders()),
-                          set(expected[1].getAllRawHeaders()))
-
-        d = allDataFromStream(response.stream)
-        d.addCallback(self.assertEquals, expected[2])
-        return d
-
-
-    def test_getResponseForRequestMultiHomedRequestURI(self):
-        request = StubRequest(
-            'PROPFIND',
-            '/calendars/users/cdaboo/',
-            '/principals/__uids__/cdaboo/')
-
-        d = self.rc.getResponseForRequest(request)
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForRequestURINotFound(self):
-        request = StubRequest(
-            'PROPFIND',
-            '/calendars/__uids__/wsanchez/',
-            '/calendars/__uids__/dreid/')
-
-        d = self.rc.getResponseForRequest(request)
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForRequestMultiHomedPrincipalURI(self):
-        request = StubRequest(
-            'PROPFIND',
-            '/calendars/__uids__/cdaboo/',
-            '/principals/users/cdaboo/')
-
-        d = self.rc.getResponseForRequest(request)
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForRequestNotInCache(self):
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/dreid/',
-                '/principals/__uids__/dreid/'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForRequestInCache(self):
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/'))
-
-        d.addCallback(self.assertResponse, self.expected_response)
-        return d
-
-
-    def test_getResponseForRequestPrincipalTokenChanged(self):
-        self.tokens['/principals/__uids__/cdaboo/'] = 'principalToken1'
-
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForRequestUriTokenChanged(self):
-        self.tokens['/calendars/__uids__/cdaboo/'] = 'uriToken1'
-
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForDepthZero(self):
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/',
-                depth='0'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForBody(self):
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/',
-                body='bazbax'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_getResponseForUnauthenticatedRequest(self):
-        d = self.rc.getResponseForRequest(StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '{DAV:}unauthenticated',
-                body='bazbax'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-    def test_cacheUnauthenticatedResponse(self):
-        expected_response = StubResponse(401, {}, "foobar")
-
-        d = self.rc.cacheResponseForRequest(
-            StubRequest('PROPFIND',
-                        '/calendars/__uids__/cdaboo/',
-                        '{DAV:}unauthenticated'),
-            expected_response)
-
-        d.addCallback(self.assertResponse,
-                      (expected_response.code,
-                       expected_response.headers,
-                       expected_response.body))
-
-        return d
-
-
-    def test_cacheResponseForRequest(self):
-        expected_response = StubResponse(200, {}, "Foobar")
-
-        def _assertResponse(ign):
-            d1 = self.rc.getResponseForRequest(StubRequest(
-                    'PROPFIND',
-                    '/principals/__uids__/dreid/',
-                    '/principals/__uids__/dreid/'))
-
-
-            d1.addCallback(self.assertResponse,
-                           (expected_response.code,
-                            expected_response.headers,
-                            expected_response.body))
-            return d1
-
-
-        d = self.rc.cacheResponseForRequest(
-            StubRequest('PROPFIND',
-                        '/principals/__uids__/dreid/',
-                        '/principals/__uids__/dreid/'),
-            expected_response)
-
-        d.addCallback(_assertResponse)
-        return d
-
-
-    def test_recordHashChangeInvalidatesCache(self):
-        StubRequest.resources[
-            '/principals/__uids__/cdaboo/'].record = 'directoryToken1'
-
-        d = self.rc.getResponseForRequest(
-            StubRequest(
-                'PROPFIND',
-                '/calendars/__uids__/cdaboo/',
-                '/principals/__uids__/cdaboo/'))
-
-        d.addCallback(self.assertEquals, None)
-        return d
-
-
-
-class MemcacheResponseCacheTests(BaseCacheTestMixin, TestCase):
-    def setUp(self):
-        super(MemcacheResponseCacheTests, self).setUp()
-
-        memcacheStub = InMemoryMemcacheProtocol()
-        self.rc = MemcacheResponseCache(None, cachePool=memcacheStub)
-        self.rc.logger.setLevel('debug')
-        self.tokens = {}
-
-        self.tokens['/calendars/__uids__/cdaboo/'] = 'uriToken0'
-        self.tokens['/principals/__uids__/cdaboo/'] = 'principalToken0'
-        self.tokens['/principals/__uids__/dreid/'] = 'principalTokenX'
-
-        def _getToken(uri, cachePoolHandle=None):
-            return succeed(self.tokens.get(uri))
-
-        self.rc._tokenForURI = _getToken
-
-        self.expected_response = (200, Headers({}), "Foo")
-
-        expected_key = hashlib.md5(':'.join([str(t) for t in (
-                'PROPFIND',
-                '/principals/__uids__/cdaboo/',
-                '/calendars/__uids__/cdaboo/',
-                '1',
-                hash('foobar'),
-                )])).hexdigest()
-
-        memcacheStub._cache[expected_key] = (
-            0, #flags
-            cPickle.dumps((
-            'principalToken0',
-            hash('directoryToken0'),
-            'uriToken0',
-            (self.expected_response[0],
-             dict(list(self.expected_response[1].getAllRawHeaders())),
-             self.expected_response[2]))))
-
-        self.memcacheStub = memcacheStub
-
-    def tearDown(self):
-        for call in self.memcacheStub._timeouts.itervalues():
-            call.cancel()
-
-    def test_givenURIsForKeys(self):
-        expected_response = (200, Headers({}), "Foobarbaz")
-
-        _key = (
-                'PROPFIND',
-                '/principals/__uids__/cdaboo/',
-                '/calendars/users/cdaboo/',
-                '1',
-                hash('foobar'),
-                )
-
-        expected_key = hashlib.md5(':'.join([str(t) for t in _key])).hexdigest()
-
-        self.memcacheStub._cache[expected_key] = (
-            0, #flags
-            cPickle.dumps((
-                    'principalToken0',
-                    hash('directoryToken0'),
-                    'uriToken0',
-                    (expected_response[0],
-                     dict(list(expected_response[1].getAllRawHeaders())),
-                     expected_response[2]))))
-
-        d = self.rc.getResponseForRequest(
-            StubRequest('PROPFIND',
-                        '/calendars/users/cdaboo/',
-                        '/principals/__uids__/cdaboo/'))
-
-        d.addCallback(self.assertResponse, expected_response)
-        return d
-
-
-
-class StubResponseCacheResource(object):
-    def __init__(self):
-        self.cache = {}
-        self.responseCache = self
-
-
-    def getResponseForRequest(self, request):
-        if request in self.cache:
-            return self.cache[request]
-
-
-    def cacheResponseForRequest(self, request, response):
-        self.cache[request] = response
-        return response
-
-
-
-class TestRenderMixin(object):
-    davHeaders = ('foo',)
-
-    def renderHTTP(self, request):
-        self.response.headers.setHeader('dav', self.davHeaders)
-
-        return self.response
-
-
-
-class TestCachingResource(PropfindCacheMixin, TestRenderMixin):
-    def __init__(self, response):
-        self.response = response
-
-
-
-class PropfindCacheMixinTests(TestCase):
-    """
-    Test the PropfindCacheMixin
-    """
-    def setUp(self):
-        TestCase.setUp(self)
-        self.resource = TestCachingResource(StubResponse(200, {}, "foobar"))
-        self.responseCache = StubResponseCacheResource()
-
-    def test_DAVHeaderCached(self):
-        """
-        Test that the DAV header set in renderHTTP is cached.
-        """
-        def _checkCache(response):
-            self.assertEquals(response.headers.getHeader('dav'),
-                              ('foo',))
-            self.assertEquals(
-                self.responseCache.cache[request].headers.getHeader('dav'),
-                ('foo',))
-
-        request = StubRequest('PROPFIND', '/', '/')
-        request.resources['/'] = self.responseCache
-
-        d = maybeDeferred(self.resource.renderHTTP, request)
-        d.addCallback(_checkCache)
-
-        return d
-
-
-    def test_onlyCachePropfind(self):
-        """
-        Test that we only cache the result of a propfind request.
-        """
-        def _checkCache(response):
-            self.assertEquals(self.responseCache.getResponseForRequest(request),
-                              None)
-
-        request = StubRequest('GET', '/', '/')
-        request.resources['/'] = self.responseCache
-
-        d = maybeDeferred(self.resource.renderHTTP, request)
-        d.addCallback(_checkCache)
-
-        return d

Deleted: CalendarServer/trunk/twistedcaldav/test/test_static.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_static.py	2010-03-16 20:08:00 UTC (rev 5318)
+++ CalendarServer/trunk/twistedcaldav/test/test_static.py	2010-03-16 20:14:52 UTC (rev 5319)
@@ -1,67 +0,0 @@
-##
-# Copyright (c) 2008 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.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##
-
-from twistedcaldav.static import CalendarHomeFile, CalDAVFile
-from twistedcaldav.cache import DisabledCacheNotifier
-from twistedcaldav.test.util import StubCacheChangeNotifier
-from twistedcaldav.test.util import TestCase
-
-class StubParentResource(object):
-    def principalCollections(self):
-        return set([])
-
-
-class CalendarHomeFileTests(TestCase):
-    def setUp(self):
-        TestCase.setUp(self)
-        self.calendarHome = CalendarHomeFile(self.mktemp(),
-                                             StubParentResource(),
-                                             object())
-
-
-    def test_hasCacheNotifier(self):
-        self.failUnless(isinstance(self.calendarHome.cacheNotifier,
-                                   DisabledCacheNotifier))
-
-
-    def test_childrenHaveCacheNotifier(self):
-        child = self.calendarHome.createSimilarFile('/fake/path')
-        self.assertEquals(child.cacheNotifier, self.calendarHome.cacheNotifier)
-
-
-class CalDAVFileTests(TestCase):
-    def setUp(self):
-        TestCase.setUp(self)
-        self.caldavFile = CalDAVFile(self.mktemp())
-        self.caldavFile.fp.createDirectory()
-        self.caldavFile.cacheNotifier = StubCacheChangeNotifier()
-        self.assertEquals(self.caldavFile.cacheNotifier.changedCount, 0)
-        self.caldavFile.isCollection = (lambda: True)
-
-
-    def test_updateCTagNotifiesCache(self):
-        d = self.caldavFile.updateCTag()
-        d.addCallback(
-            lambda _:
-                self.assertEquals(self.caldavFile.cacheNotifier.changedCount, 1)
-            )
-        return d
-
-
-    def test_updateCTagDoesntFailWithoutACacheNotifier(self):
-        del self.caldavFile.cacheNotifier
-        d = self.caldavFile.updateCTag()
-        return d
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100316/8a85583b/attachment-0001.html>


More information about the calendarserver-changes mailing list