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

source_changes at macosforge.org source_changes at macosforge.org
Thu May 26 15:03:05 PDT 2011


Revision: 7534
          http://trac.macosforge.org/projects/calendarserver/changeset/7534
Author:   exarkun at twistedmatrix.com
Date:     2011-05-26 15:03:05 -0700 (Thu, 26 May 2011)
Log Message:
-----------
Put common name and email into the accounts file too, and use them in the inviter profile.

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/loadtest/config.plist
    CalendarServer/trunk/contrib/performance/loadtest/ical.py
    CalendarServer/trunk/contrib/performance/loadtest/population.py
    CalendarServer/trunk/contrib/performance/loadtest/profiles.py
    CalendarServer/trunk/contrib/performance/loadtest/sim.py
    CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
    CalendarServer/trunk/contrib/performance/loadtest/test_sim.py

Added Paths:
-----------
    CalendarServer/trunk/contrib/performance/loadtest/accounts.csv

Removed Paths:
-------------
    CalendarServer/trunk/contrib/performance/loadtest/accounts.txt

Added: CalendarServer/trunk/contrib/performance/loadtest/accounts.csv
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/accounts.csv	                        (rev 0)
+++ CalendarServer/trunk/contrib/performance/loadtest/accounts.csv	2011-05-26 22:03:05 UTC (rev 7534)
@@ -0,0 +1,99 @@
+user01,user01,User 01,user01 at example.com
+user02,user02,User 02,user02 at example.com
+user03,user03,User 03,user03 at example.com
+user04,user04,User 04,user04 at example.com
+user05,user05,User 05,user05 at example.com
+user06,user06,User 06,user06 at example.com
+user07,user07,User 07,user07 at example.com
+user08,user08,User 08,user08 at example.com
+user09,user09,User 09,user09 at example.com
+user10,user10,User 10,user10 at example.com
+user11,user11,User 11,user11 at example.com
+user12,user12,User 12,user12 at example.com
+user13,user13,User 13,user13 at example.com
+user14,user14,User 14,user14 at example.com
+user15,user15,User 15,user15 at example.com
+user16,user16,User 16,user16 at example.com
+user17,user17,User 17,user17 at example.com
+user18,user18,User 18,user18 at example.com
+user19,user19,User 19,user19 at example.com
+user20,user20,User 20,user20 at example.com
+user21,user21,User 21,user21 at example.com
+user22,user22,User 22,user22 at example.com
+user23,user23,User 23,user23 at example.com
+user24,user24,User 24,user24 at example.com
+user25,user25,User 25,user25 at example.com
+user26,user26,User 26,user26 at example.com
+user27,user27,User 27,user27 at example.com
+user28,user28,User 28,user28 at example.com
+user29,user29,User 29,user29 at example.com
+user30,user30,User 30,user30 at example.com
+user31,user31,User 31,user31 at example.com
+user32,user32,User 32,user32 at example.com
+user33,user33,User 33,user33 at example.com
+user34,user34,User 34,user34 at example.com
+user35,user35,User 35,user35 at example.com
+user36,user36,User 36,user36 at example.com
+user37,user37,User 37,user37 at example.com
+user38,user38,User 38,user38 at example.com
+user39,user39,User 39,user39 at example.com
+user40,user40,User 40,user40 at example.com
+user41,user41,User 41,user41 at example.com
+user42,user42,User 42,user42 at example.com
+user43,user43,User 43,user43 at example.com
+user44,user44,User 44,user44 at example.com
+user45,user45,User 45,user45 at example.com
+user46,user46,User 46,user46 at example.com
+user47,user47,User 47,user47 at example.com
+user48,user48,User 48,user48 at example.com
+user49,user49,User 49,user49 at example.com
+user50,user50,User 50,user50 at example.com
+user51,user51,User 51,user51 at example.com
+user52,user52,User 52,user52 at example.com
+user53,user53,User 53,user53 at example.com
+user54,user54,User 54,user54 at example.com
+user55,user55,User 55,user55 at example.com
+user56,user56,User 56,user56 at example.com
+user57,user57,User 57,user57 at example.com
+user58,user58,User 58,user58 at example.com
+user59,user59,User 59,user59 at example.com
+user60,user60,User 60,user60 at example.com
+user61,user61,User 61,user61 at example.com
+user62,user62,User 62,user62 at example.com
+user63,user63,User 63,user63 at example.com
+user64,user64,User 64,user64 at example.com
+user65,user65,User 65,user65 at example.com
+user66,user66,User 66,user66 at example.com
+user67,user67,User 67,user67 at example.com
+user68,user68,User 68,user68 at example.com
+user69,user69,User 69,user69 at example.com
+user70,user70,User 70,user70 at example.com
+user71,user71,User 71,user71 at example.com
+user72,user72,User 72,user72 at example.com
+user73,user73,User 73,user73 at example.com
+user74,user74,User 74,user74 at example.com
+user75,user75,User 75,user75 at example.com
+user76,user76,User 76,user76 at example.com
+user77,user77,User 77,user77 at example.com
+user78,user78,User 78,user78 at example.com
+user79,user79,User 79,user79 at example.com
+user80,user80,User 80,user80 at example.com
+user81,user81,User 81,user81 at example.com
+user82,user82,User 82,user82 at example.com
+user83,user83,User 83,user83 at example.com
+user84,user84,User 84,user84 at example.com
+user85,user85,User 85,user85 at example.com
+user86,user86,User 86,user86 at example.com
+user87,user87,User 87,user87 at example.com
+user88,user88,User 88,user88 at example.com
+user89,user89,User 89,user89 at example.com
+user90,user90,User 90,user90 at example.com
+user91,user91,User 91,user91 at example.com
+user92,user92,User 92,user92 at example.com
+user93,user93,User 93,user93 at example.com
+user94,user94,User 94,user94 at example.com
+user95,user95,User 95,user95 at example.com
+user96,user96,User 96,user96 at example.com
+user97,user97,User 97,user97 at example.com
+user98,user98,User 98,user98 at example.com
+user99,user99,User 99,user99 at example.com

Deleted: CalendarServer/trunk/contrib/performance/loadtest/accounts.txt
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/accounts.txt	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/accounts.txt	2011-05-26 22:03:05 UTC (rev 7534)
@@ -1,99 +0,0 @@
-user01 user01
-user02 user02
-user03 user03
-user04 user04
-user05 user05
-user06 user06
-user07 user07
-user08 user08
-user09 user09
-user10 user10
-user11 user11
-user12 user12
-user13 user13
-user14 user14
-user15 user15
-user16 user16
-user17 user17
-user18 user18
-user19 user19
-user20 user20
-user21 user21
-user22 user22
-user23 user23
-user24 user24
-user25 user25
-user26 user26
-user27 user27
-user28 user28
-user29 user29
-user30 user30
-user31 user31
-user32 user32
-user33 user33
-user34 user34
-user35 user35
-user36 user36
-user37 user37
-user38 user38
-user39 user39
-user40 user40
-user41 user41
-user42 user42
-user43 user43
-user44 user44
-user45 user45
-user46 user46
-user47 user47
-user48 user48
-user49 user49
-user50 user50
-user51 user51
-user52 user52
-user53 user53
-user54 user54
-user55 user55
-user56 user56
-user57 user57
-user58 user58
-user59 user59
-user60 user60
-user61 user61
-user62 user62
-user63 user63
-user64 user64
-user65 user65
-user66 user66
-user67 user67
-user68 user68
-user69 user69
-user70 user70
-user71 user71
-user72 user72
-user73 user73
-user74 user74
-user75 user75
-user76 user76
-user77 user77
-user78 user78
-user79 user79
-user80 user80
-user81 user81
-user82 user82
-user83 user83
-user84 user84
-user85 user85
-user86 user86
-user87 user87
-user88 user88
-user89 user89
-user90 user90
-user91 user91
-user92 user92
-user93 user93
-user94 user94
-user95 user95
-user96 user96
-user97 user97
-user98 user98
-user99 user99

Modified: CalendarServer/trunk/contrib/performance/loadtest/config.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/config.plist	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/config.plist	2011-05-26 22:03:05 UTC (rev 7534)
@@ -32,11 +32,11 @@
     <key>accounts</key>
     <dict>
       <key>loader</key>
-      <string>loadtest.sim.recordsFromTextFile</string>
+      <string>loadtest.sim.recordsFromCSVFile</string>
       <key>params</key>
       <dict>
 	<key>path</key>
-	<string>loadtest/accounts.txt</string>
+	<string>loadtest/accounts.csv</string>
       </dict>
     </dict>
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/ical.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/ical.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/ical.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -268,7 +268,7 @@
         d = self._request(
             MULTI_STATUS,
             'PROPFIND',
-            self.root + principalURL[1:],
+            self.root + principalURL[1:].encode('utf-8'),
             Headers({
                     'content-type': ['text/xml'],
                     'depth': ['0']}),
@@ -565,8 +565,9 @@
             start = vevent.contents[u'vevent'][0].contents[u'dtstart'][0].value
             end = vevent.contents[u'vevent'][0].contents[u'dtend'][0].value
             now = datetime.now()
+            uri = self.root + 'calendars/__uids__/' + self.user.encode('utf-8') + '/outbox/'
             d = self._request(
-                OK, 'POST', self.root + 'calendars/__uids__/' + self.user + '/outbox/',
+                OK, 'POST', uri,
                 Headers({
                         'content-type': ['text/calendar'],
                         'originator': [self.email],

Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -49,8 +49,8 @@
         self.params = params
 
 
-    def __call__(self, reactor, client, number):
-        return self.profileType(reactor, client, number, **self.params)
+    def __call__(self, reactor, simulator, client, number):
+        return self.profileType(reactor, simulator, client, number, **self.params)
 
 
 
@@ -146,6 +146,10 @@
         self._user = 0
 
 
+    def getUserRecord(self, index):
+        return self._records[index]
+
+
     def _nextUserNumber(self):
         result = self._user
         self._user += 1
@@ -160,8 +164,8 @@
         auth.add_password(
             realm="Test Realm",
             uri="http://%s:%d/" % (self.host, self.port),
-            user=user,
-            passwd=record.password)
+            user=user.encode('utf-8'),
+            passwd=record.password.encode('utf-8'))
         return user, auth
 
 
@@ -178,7 +182,7 @@
             d.addErrback(self._clientFailure, reactor)
 
             for profileType in clientType.profileTypes:
-                d = profileType(reactor, client, number).run()
+                d = profileType(reactor, self, client, number).run()
                 d.addErrback(self._profileFailure, profileType, reactor)
         msg(type="status", clientCount=self._user - 1)
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -49,8 +49,9 @@
     """
     random = random
 
-    def __init__(self, reactor, client, userNumber, **params):
+    def __init__(self, reactor, simulator, client, userNumber, **params):
         self._reactor = reactor
+        self._sim = simulator
         self._client = client
         self._number = userNumber
         self.setParameters(**params)
@@ -130,26 +131,25 @@
         Create a new attendee to add to the list of attendees for the
         given event.
         """
-        invitees = set([u'urn:uuid:user%02d' % (self._number,)])
+        selfRecord = self._sim.getUserRecord(self._number)
+        invitees = set([u'urn:uuid:%s' % (selfRecord.uid,)])
         for att in attendees:
             invitees.add(att.value)
 
         for i in range(10):
             invitee = max(1, int(self.random.gauss(self._number, self._spread)))
-            uuid = u'urn:uuid:user%02d' % (invitee,)
+            record = self._sim.getUserRecord(invitee)
+            uuid = u'urn:uuid:%s' % (record.uid,)
             if uuid not in invitees:
                 break
         else:
             return fail(CannotAddAttendee("Can't find uninvited user to invite."))
 
-        user = u'User %02d' % (invitee,)
-        email = u'user%02d at example.com' % (invitee,)
-
         attendee = ContentLine(
             name=u'ATTENDEE', params=[
-                [u'CN', user],
+                [u'CN', record.commonName],
                 [u'CUTYPE', u'INDIVIDUAL'],
-                [u'EMAIL', email],
+                [u'EMAIL', record.email],
                 [u'PARTSTAT', u'NEEDS-ACTION'],
                 [u'ROLE', u'REQ-PARTICIPANT'],
                 [u'RSVP', u'TRUE'],

Modified: CalendarServer/trunk/contrib/performance/loadtest/sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/sim.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/sim.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -35,14 +35,16 @@
 
 
 class _DirectoryRecord(object):
-    def __init__(self, uid, password):
+    def __init__(self, uid, password, commonName, email):
         self.uid = uid
         self.password = password
+        self.commonName = commonName
+        self.email = email
 
 
-def recordsFromTextFile(path):
+def recordsFromCSVFile(path):
     return [
-        _DirectoryRecord(*line.split())
+        _DirectoryRecord(*line.decode('utf-8').split(u','))
         for line
         in FilePath(path).getContent().splitlines()]
 

Modified: CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -30,6 +30,7 @@
 from twisted.web.client import Response
 
 from loadtest.profiles import Eventer, Inviter, Accepter
+from loadtest.population import Populator, CalendarClientSimulator
 from loadtest.ical import IncorrectResponseCode, Calendar, Event, BaseClient
 
 SIMPLE_EVENT = """\
@@ -150,7 +151,19 @@
 """
 
 
+class AnyUser(object):
+    def __getitem__(self, index):
+        return _AnyRecord(index)
 
+
+class _AnyRecord(object):
+    def __init__(self, index):
+        self.uid = u"user%02d" % (index,)
+        self.password = u"user%02d" % (index,)
+        self.commonName = u"User %02d" % (index,)
+        self.email = u"user%02d at example.com" % (index,)
+
+
 class Deterministic(object):
     def gauss(self, mean, stddev):
         """
@@ -223,6 +236,11 @@
     """
     Tests for loadtest.profiles.Inviter.
     """
+    def setUp(self):
+        self.sim = CalendarClientSimulator(
+            AnyUser(), Populator(None), None, None, None, None)
+
+
     def _simpleAccount(self, userNumber, eventText):
         vevent = list(readComponents(eventText))[0]
         calendar = Calendar(
@@ -245,7 +263,7 @@
         vevent, event, calendar, client = self._simpleAccount(
             userNumber, SIMPLE_EVENT)
         calendar.resourceType = caldavxml.schedule_inbox
-        inviter = Inviter(None, client, userNumber)
+        inviter = Inviter(None, self.sim, client, userNumber)
         inviter._invite()
         self.assertNotIn(u'attendee', vevent.contents[u'vevent'][0].contents)
 
@@ -257,7 +275,7 @@
         """
         userNumber = 13
         client = StubClient(userNumber)
-        inviter = Inviter(None, client, userNumber)
+        inviter = Inviter(None, self.sim, client, userNumber)
         inviter._invite()
         self.assertEquals(client._events, {})
         self.assertEquals(client._calendars, {})
@@ -273,7 +291,7 @@
         vevent, event, calendar, client = self._simpleAccount(
             userNumber, SIMPLE_EVENT)
         event.vevent = event.etag = event.scheduleTag = None
-        inviter = Inviter(None, client, userNumber)
+        inviter = Inviter(None, self.sim, client, userNumber)
         inviter._invite()
         self.assertEquals(client._events, {event.url: event})
         self.assertEquals(client._calendars, {calendar.url: calendar})
@@ -287,7 +305,7 @@
         userNumber = 16
         vevent, event, calendar, client = self._simpleAccount(
             userNumber, SIMPLE_EVENT)
-        inviter = Inviter(Clock(), client, userNumber)
+        inviter = Inviter(Clock(), self.sim, client, userNumber)
         inviter.random = Deterministic()
         inviter._invite()
         attendees = vevent.contents[u'vevent'][0].contents[u'attendee']
@@ -314,7 +332,7 @@
         otherNumber = 20
         values = [selfNumber, otherNumber]
 
-        inviter = Inviter(Clock(), client, selfNumber)
+        inviter = Inviter(Clock(), self.sim, client, selfNumber)
         inviter.random = Deterministic()
         inviter.random.gauss = lambda mu, sigma: values.pop(0)
         inviter._invite()
@@ -344,7 +362,7 @@
         anotherNumber = inviteeNumber + 5
         values = [inviteeNumber, anotherNumber]
 
-        inviter = Inviter(Clock(), client, selfNumber)
+        inviter = Inviter(Clock(), self.sim, client, selfNumber)
         inviter.random = Deterministic()
         inviter.random.gauss = lambda mu, sigma: values.pop(0)
         inviter._invite()
@@ -368,7 +386,7 @@
         selfNumber = 1
         vevent, event, calendar, client = self._simpleAccount(
             selfNumber, INVITED_EVENT)
-        inviter = Inviter(Clock(), client, selfNumber)
+        inviter = Inviter(Clock(), self.sim, client, selfNumber)
         inviter.random = Deterministic()
         # Always return a user number which has already been invited.
         inviter.random.gauss = lambda mu, sigma: 2
@@ -386,7 +404,7 @@
         selfNumber = 2
         vevent, event, calendar, client = self._simpleAccount(
             selfNumber, INVITED_EVENT)
-        inviter = Inviter(None, client, selfNumber)
+        inviter = Inviter(None, self.sim, client, selfNumber)
         # Try to send an invitation, but with only one event on the
         # calendar, of which we are not the organizer.  It should be
         # unchanged afterwards.
@@ -402,13 +420,18 @@
     """
     Tests for loadtest.profiles.Accepter.
     """
+    def setUp(self):
+        self.sim = CalendarClientSimulator(
+            AnyUser(), Populator(None), None, None, None, None)
+
+
     def test_ignoreEventOnUnknownCalendar(self):
         """
         If an event on an unknown calendar changes, it is ignored.
         """
         userNumber = 13
         client = StubClient(userNumber)
-        accepter = Accepter(None, client, userNumber)
+        accepter = Accepter(None, self.sim, client, userNumber)
         accepter.eventChanged('/some/calendar/1234.ics')
 
 
@@ -423,7 +446,7 @@
             caldavxml.schedule_inbox, u'inbox', calendarURL, None)
         client = StubClient(userNumber)
         client._calendars[calendarURL] = calendar
-        accepter = Accepter(None, client, userNumber)
+        accepter = Accepter(None, self.sim, client, userNumber)
         accepter.eventChanged(calendarURL + '1234.ics')
 
 
@@ -442,7 +465,7 @@
         client._calendars[calendarURL] = calendar
         event = Event(calendarURL + u'1234.ics', None, vevent)
         client._events[event.url] = event
-        accepter = Accepter(None, client, userNumber)
+        accepter = Accepter(None, self.sim, client, userNumber)
         accepter.eventChanged(event.url)
 
 
@@ -465,7 +488,7 @@
         client._calendars[calendarURL] = calendar
         event = Event(calendarURL + u'1234.ics', None, vevent)
         client._events[event.url] = event
-        accepter = Accepter(clock, client, userNumber)
+        accepter = Accepter(clock, self.sim, client, userNumber)
         accepter.random = Deterministic()
         accepter.random.gauss = lambda mu, sigma: randomDelay
         accepter.eventChanged(event.url)
@@ -503,7 +526,7 @@
         inboxEvent = Event(inboxURL + u'4321.ics', None, vevent)
         client._setEvent(inboxEvent.url, inboxEvent)
 
-        accepter = Accepter(clock, client, userNumber)
+        accepter = Accepter(clock, self.sim, client, userNumber)
         accepter.random = Deterministic()
         accepter.random.gauss = lambda mu, sigma: randomDelay
         accepter.eventChanged(event.url)
@@ -540,7 +563,7 @@
         client._calendars[calendarURL] = calendar
         event = Event(calendarURL + u'1234.ics', None, vevent)
         client._events[event.url] = event
-        accepter = Accepter(clock, client, userNumber)
+        accepter = Accepter(clock, self.sim, client, userNumber)
         accepter.random = Deterministic()
         accepter.random.gauss = lambda mu, sigma: randomDelay
         accepter.eventChanged(event.url)
@@ -584,7 +607,7 @@
         event = Event(calendarURL + u'1234.ics', None, vevent)
         client._setEvent(event.url, event)
 
-        accepter = Accepter(clock, client, userNumber)
+        accepter = Accepter(clock, self.sim, client, userNumber)
         accepter.random = Deterministic()
         accepter.random.gauss = lambda mu, sigma: randomDelay
 
@@ -602,6 +625,11 @@
     Tests for loadtest.profiles.Eventer, a profile which adds new
     events on calendars.
     """
+    def setUp(self):
+        self.sim = CalendarClientSimulator(
+            AnyUser(), Populator(None), None, None, None, None)
+
+
     def test_doNotAddEventOnInbox(self):
         """
         When the only calendar is a schedule inbox, no attempt is made
@@ -612,7 +640,7 @@
         client = StubClient(21)
         client._calendars.update({calendar.url: calendar})
 
-        eventer = Eventer(None, client, None)
+        eventer = Eventer(None, self.sim, client, None)
         eventer._addEvent()
 
         self.assertEquals(client._events, {})
@@ -628,7 +656,7 @@
         client = StubClient(31)
         client._calendars.update({calendar.url: calendar})
 
-        eventer = Eventer(Clock(), client, None)
+        eventer = Eventer(Clock(), self.sim, client, None)
         eventer._addEvent()
 
         self.assertEquals(len(client._events), 1)

Modified: CalendarServer/trunk/contrib/performance/loadtest/test_sim.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_sim.py	2011-05-26 20:20:55 UTC (rev 7533)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_sim.py	2011-05-26 22:03:05 UTC (rev 7534)
@@ -219,10 +219,10 @@
         L{LoadSimulator.
         """
         accounts = FilePath(self.mktemp())
-        accounts.setContent("foo bar\nbaz quux\n")
+        accounts.setContent("foo,bar,baz,quux\nfoo2,bar2,baz2,quux2\n")
         config = VALID_CONFIG.copy()
         config["accounts"] = {
-            "loader": "loadtest.sim.recordsFromTextFile",
+            "loader": "loadtest.sim.recordsFromCSVFile",
             "params": {
                 "path": accounts.path},
             }
@@ -232,8 +232,12 @@
         self.assertEqual(2, len(sim.records))
         self.assertEqual(sim.records[0].uid, 'foo')
         self.assertEqual(sim.records[0].password, 'bar')
-        self.assertEqual(sim.records[1].uid, 'baz')
-        self.assertEqual(sim.records[1].password, 'quux')
+        self.assertEqual(sim.records[0].commonName, 'baz')
+        self.assertEqual(sim.records[0].email, 'quux')
+        self.assertEqual(sim.records[1].uid, 'foo2')
+        self.assertEqual(sim.records[1].password, 'bar2')
+        self.assertEqual(sim.records[1].commonName, 'baz2')
+        self.assertEqual(sim.records[1].email, 'quux2')
 
 
     def test_loadServerConfig(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110526/2639f34a/attachment-0001.html>


More information about the calendarserver-changes mailing list