[CalendarServer-changes] [9049] CalendarServer/trunk/contrib/performance/loadtest

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 12 18:17:53 PDT 2012


Revision: 9049
          http://trac.macosforge.org/projects/calendarserver/changeset/9049
Author:   dre at apple.com
Date:     2012-04-12 18:17:53 -0700 (Thu, 12 Apr 2012)
Log Message:
-----------
Two new tests for client sim: testInboxReply and testInboxReplyFailedDelete

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/loadtest/profiles.py
    CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py

Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2012-04-13 01:06:25 UTC (rev 9048)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2012-04-13 01:17:53 UTC (rev 9049)
@@ -517,16 +517,17 @@
 
     def _handleReply(self, href):
         d = self._client.deleteEvent(href)
-        def finished(passthrough):
-            self._accepting.remove(href)
-            if isinstance(passthrough, Failure):
-                passthrough.trap(IncorrectResponseCode)
-                passthrough = passthrough.response
-            return passthrough
-        d.addBoth(finished)
+        d.addBoth(self._finishRemoveAccepting, href)
         return self._newOperation("reply done", d)
 
 
+    def _finishRemoveAccepting(self, passthrough, href):
+        self._accepting.remove(href)
+        if isinstance(passthrough, Failure):
+            passthrough.trap(IncorrectResponseCode)
+            passthrough = passthrough.value.response
+        return passthrough
+
     def _handleCancel(self, href):
 
         uid = self._client._events[href].getUID()
@@ -540,13 +541,7 @@
                         if uid == event.getUID():
                             return self._client.deleteEvent(event.url)
         d.addCallback(removed)
-        def finished(passthrough):
-            self._accepting.remove(href)
-            if isinstance(passthrough, Failure):
-                passthrough.trap(IncorrectResponseCode)
-                passthrough = passthrough.response
-            return passthrough
-        d.addBoth(finished)
+        d.addBoth(self._finishRemoveAccepting, href)
         return self._newOperation("cancelled", d)
 
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py	2012-04-13 01:06:25 UTC (rev 9048)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py	2012-04-13 01:17:53 UTC (rev 9049)
@@ -154,7 +154,20 @@
 END:VCALENDAR
 """
 
+INBOX_REPLY =  """\
+BEGIN:VCALENDAR
+METHOD:REPLY
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+ORGANIZER;CN="User 01":mailto:user1 at example.com
+ATTENDEE;PARTSTAT=ACCEPTED:mailto:user1 at example.com
+END:VEVENT
+END:VCALENDAR
+"""
 
+
 class AnyUser(object):
     def __getitem__(self, index):
         return _AnyRecord(index)
@@ -197,10 +210,12 @@
 
     @ivar rescheduled: A set of event URLs which will not allow
         attendee changes due to a changed schedule tag.
+    @ivar _pendingFailures: dict mapping URLs to failure objects
     """
     def __init__(self, number):
         self._events = {}
         self._calendars = {}
+        self._pendingFailures = {}
         self.record = _DirectoryRecord(
             "user%02d" % (number,), "user%02d" % (number,),
             "User %02d" % (number,), "user%02d at example.org" % (number,))
@@ -210,6 +225,13 @@
         self.started = True
 
 
+    def _failDeleteWithObject(self, href, failureObject):
+        """
+        Accessor for inserting intentional failures for deletes.
+        """
+        self._pendingFailures[href] = failureObject
+
+
     def addEvent(self, href, vevent):
         self._events[href] = Event(href, None, vevent)
         return succeed(None)
@@ -219,12 +241,16 @@
         return self.addEvent(href, vevent)
 
 
-    def deleteEvent(self, href):
+    def deleteEvent(self, href,):
         del self._events[href]
         calendar, uid = href.rsplit('/', 1)
         del self._calendars[calendar + '/'].events[uid]
+        if href in self._pendingFailures:
+            failureObject = self._pendingFailures.pop(href)
+            return fail(failureObject)
+        else:
+            return succeed(None)
 
-
     def updateEvent(self, href):
         self.rescheduled.remove(href)
         return succeed(None)
@@ -743,6 +769,58 @@
         clock.advance(randomDelay)
 
 
+    def test_inboxReply(self):
+        """
+        When an inbox item that contains a reply is seen by the client, it
+        deletes it immediately.
+        """
+        userNumber = 1
+        clock = Clock()
+        inboxURL = '/some/inbox/'
+        vevent = Component.fromString(INBOX_REPLY)
+        inbox = Calendar(
+            caldavxml.schedule_inbox, set(), u'the inbox', inboxURL, None)
+        client = StubClient(userNumber)
+        client._calendars[inboxURL] = inbox
+
+        inboxEvent = Event(inboxURL + u'4321.ics', None, vevent)
+        client._setEvent(inboxEvent.url, inboxEvent)
+        accepter = Accepter(clock, self.sim, client, userNumber) 
+        accepter.eventChanged(inboxEvent.url)
+        clock.advance(3)
+        self.assertNotIn(inboxEvent.url, client._events)
+        self.assertNotIn('4321.ics', inbox.events)
+
+
+    def test_inboxReplyFailedDelete(self):
+        """
+        When an inbox item that contains a reply is seen by the client, it
+        deletes it immediately.  If the delete fails, the appropriate response
+        code is returned.
+        """
+        userNumber = 1
+        clock = Clock()
+        inboxURL = '/some/inbox/'
+        vevent = Component.fromString(INBOX_REPLY)
+        inbox = Calendar(
+            caldavxml.schedule_inbox, set(), u'the inbox', inboxURL, None)
+        client = StubClient(userNumber)
+        client._calendars[inboxURL] = inbox
+
+        inboxEvent = Event(inboxURL + u'4321.ics', None, vevent)
+        client._setEvent(inboxEvent.url, inboxEvent)
+        client._failDeleteWithObject(inboxEvent.url, IncorrectResponseCode(
+                    NO_CONTENT,
+                    Response(
+                        ('HTTP', 1, 1), PRECONDITION_FAILED,
+                        'Precondition Failed', None, None)))
+        accepter = Accepter(clock, self.sim, client, userNumber) 
+        accepter.eventChanged(inboxEvent.url)
+        clock.advance(3)
+        self.assertNotIn(inboxEvent.url, client._events)
+        self.assertNotIn('4321.ics', inbox.events)
+
+
     def test_acceptInvitation(self):
         """
         If the client is an attendee on an event and the PARTSTAT is
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120412/d07642b3/attachment.html>


More information about the calendarserver-changes mailing list