[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