[CalendarServer-changes] [15300] CalendarServer/trunk/contrib/performance/loadtest
source_changes at macosforge.org
source_changes at macosforge.org
Mon Nov 9 16:00:49 PST 2015
Revision: 15300
http://trac.calendarserver.org//changeset/15300
Author: sagen at apple.com
Date: 2015-11-09 16:00:49 -0800 (Mon, 09 Nov 2015)
Log Message:
-----------
Client sim fixes: don't try to modify or attach to a scheduled event; adds an AlarmAcknowledger profile that stampedes at specified times past the hour
Modified Paths:
--------------
CalendarServer/trunk/contrib/performance/loadtest/clients.plist
CalendarServer/trunk/contrib/performance/loadtest/profiles.py
CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
Modified: CalendarServer/trunk/contrib/performance/loadtest/clients.plist
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/clients.plist 2015-11-07 04:54:31 UTC (rev 15299)
+++ CalendarServer/trunk/contrib/performance/loadtest/clients.plist 2015-11-10 00:00:49 UTC (rev 15300)
@@ -80,7 +80,7 @@
<!-- Define the interval (in seconds) at which this profile will use
its client to create a new event. -->
<key>interval</key>
- <integer>60</integer>
+ <integer>120</integer>
<!-- Define how start times (DTSTART) for the randomly generated events
will be selected. This is an example of a "Distribution" parameter. The value
@@ -172,23 +172,30 @@
<!-- This profile will create a new event, and then periodically update the ACKNOWLEDGED property. -->
- <!-- Rather than use EventUpdater which always updates the same event,
- you can use Eventer to create events and TitleChanger or Attacher to change
- random events -->
<dict>
<key>class</key>
- <string>contrib.performance.loadtest.profiles.EventUpdater</string>
+ <string>contrib.performance.loadtest.profiles.AlarmAcknowledger</string>
<key>params</key>
<dict>
<key>enabled</key>
- <false/>
+ <true/>
- <!-- Define the interval (in seconds) at which this profile will use
- its client to create a new event. -->
+ <!-- Define how often to check (in seconds) whether it's
+ time to do an alarm acknowledgement -->
<key>interval</key>
- <integer>5</integer>
+ <integer>15</integer>
+ <!-- Acknowledgements will only actually occur at one of these
+ minutes past the hour: -->
+ <key>pastTheHour</key>
+ <array>
+ <integer>0</integer>
+ <integer>15</integer>
+ <integer>30</integer>
+ <integer>45</integer>
+ </array>
+
<!-- Define how start times (DTSTART) for the randomly generated events
will be selected. This is an example of a "Distribution" parameter. The value
for most "Distribution" parameters are interchangeable and extensible. -->
@@ -290,7 +297,7 @@
<!-- Define the interval (in seconds) at which this profile will use
its client to create a new event. -->
<key>interval</key>
- <integer>60</integer>
+ <integer>120</integer>
</dict>
</dict>
@@ -308,7 +315,7 @@
<!-- Define the interval (in seconds) at which this profile will use
its client to create a new event. -->
<key>interval</key>
- <integer>60</integer>
+ <integer>120</integer>
<!-- Define the attachment size distribution. -->
<key>fileSizeDistribution</key>
@@ -373,12 +380,12 @@
<!-- This profile invites some number of new attendees to new events. -->
<dict>
<key>class</key>
- <string>contrib.performance.loadtest.profiles.RealisticInviter</string>
+ <string>contrib.performance.loadtest.profiles.Inviter</string>
<key>params</key>
<dict>
<key>enabled</key>
- <false/>
+ <true/>
<!-- Define the frequency at which new invitations will be sent out. -->
<key>sendInvitationDistribution</key>
@@ -389,7 +396,7 @@
<dict>
<!-- mu gives the mean of the normal distribution (in seconds). -->
<key>mu</key>
- <integer>10</integer>
+ <integer>120</integer>
<!-- and sigma gives its standard deviation. -->
<key>sigma</key>
Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py 2015-11-07 04:54:31 UTC (rev 15299)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py 2015-11-10 00:00:49 UTC (rev 15300)
@@ -31,7 +31,7 @@
from twisted.python import context
from twisted.python.log import msg
from twisted.python.failure import Failure
-from twisted.internet.defer import Deferred, succeed, fail, inlineCallbacks, returnValue
+from twisted.internet.defer import Deferred, succeed, inlineCallbacks, returnValue
from twisted.internet.task import LoopingCall
from twisted.web.http import PRECONDITION_FAILED
@@ -45,6 +45,8 @@
from pycalendar.datetime import DateTime
from pycalendar.duration import Duration
+from datetime import datetime
+
class ProfileBase(object):
"""
Base class which provides some conveniences for profile
@@ -114,6 +116,9 @@
event = calendar.events[href]
if not event.component:
continue
+ if event.scheduleTag:
+ continue
+
return event
return None
@@ -213,125 +218,9 @@
+
class Inviter(ProfileBase):
"""
- A Calendar user who invites and de-invites other users to events.
- """
- def setParameters(
- self,
- enabled=True,
- sendInvitationDistribution=NormalDistribution(600, 60),
- inviteeDistribution=UniformDiscreteDistribution(range(-10, 11))
- ):
- self.enabled = enabled
- self._sendInvitationDistribution = sendInvitationDistribution
- self._inviteeDistribution = inviteeDistribution
-
-
- def run(self):
- return loopWithDistribution(
- self._reactor, self._sendInvitationDistribution, self._invite)
-
-
- def _addAttendee(self, event, attendees):
- """
- Create a new attendee to add to the list of attendees for the
- given event.
- """
- selfRecord = self._sim.getUserRecord(self._number)
- invitees = set([u'mailto:%s' % (selfRecord.email,)])
- for att in attendees:
- invitees.add(att.value())
-
- for _ignore_i in range(10):
- invitee = max(
- 0, self._number + self._inviteeDistribution.sample())
- try:
- record = self._sim.getUserRecord(invitee)
- except IndexError:
- continue
- cuaddr = u'mailto:%s' % (record.email,)
- uuidx = u'urn:x-uid:%s' % (record.guid,)
- uuid = u'urn:uuid:%s' % (record.guid,)
- if cuaddr not in invitees and uuidx not in invitees and uuid not in invitees:
- break
- else:
- return fail(CannotAddAttendee("Can't find uninvited user to invite."))
-
- attendee = Property(
- name=u'ATTENDEE',
- value=cuaddr.encode("utf-8"),
- params={
- 'CN': record.commonName,
- 'CUTYPE': 'INDIVIDUAL',
- 'PARTSTAT': 'NEEDS-ACTION',
- 'ROLE': 'REQ-PARTICIPANT',
- 'RSVP': 'TRUE',
- },
- )
-
- return succeed(attendee)
-
-
- def _invite(self):
- """
- Try to add a new attendee to an event, or perhaps remove an
- existing attendee from an event.
-
- @return: C{None} if there are no events to play with,
- otherwise a L{Deferred} which fires when the attendee
- change has been made.
- """
-
- if not self._client.started:
- return succeed(None)
-
- # Find calendars which are eligible for invites
- calendars = self._calendarsOfType(caldavxml.calendar, "VEVENT")
-
- while calendars:
- # Pick one at random from which to try to select an event
- # to modify.
- calendar = self.random.choice(calendars)
- calendars.remove(calendar)
-
- if not calendar.events:
- continue
-
- events = calendar.events.keys()
- while events:
- uuid = self.random.choice(events)
- events.remove(uuid)
- event = calendar.events[uuid].component
- if event is None:
- continue
-
- component = event.mainComponent()
- organizer = component.getOrganizerProperty()
- if organizer is not None and not self._isSelfAttendee(organizer):
- # This event was organized by someone else, don't try to invite someone to it.
- continue
-
- href = calendar.url + uuid
-
- # Find out who might attend
- attendees = tuple(component.properties('ATTENDEE'))
-
- d = self._addAttendee(event, attendees)
- d.addCallbacks(
- lambda attendee:
- self._client.addEventAttendee(
- href, attendee),
- lambda reason: reason.trap(CannotAddAttendee))
- return self._newOperation("invite", d)
-
- # Oops, either no events or no calendars to play with.
- return succeed(None)
-
-
-
-class RealisticInviter(ProfileBase):
- """
A Calendar user who invites other users to new events.
"""
_eventTemplate = Component.fromString("""\
@@ -473,8 +362,7 @@
try:
self._addAttendee(vevent, attendees)
except CannotAddAttendee:
- self._failedOperation("invite", "Cannot add attendee")
- return succeed(None)
+ continue
href = '%s%s.ics' % (calendar.url, uid)
d = self._client.addInvite(href, vcalendar)
@@ -868,10 +756,7 @@
-# Is the purpose of this profile "EventUpdater" simply to keep updating the same
-# resource over and over?
-
-class EventUpdater(ProfileBase):
+class AlarmAcknowledger(ProfileBase):
"""
A Calendar user who creates a new event, and then updates its alarm.
"""
@@ -903,7 +788,8 @@
def setParameters(
self,
enabled=True,
- interval=25,
+ interval=5,
+ pastTheHour=[0, 15, 30, 45],
eventStartDistribution=NearFutureDistribution(),
eventDurationDistribution=UniformDiscreteDistribution([
15 * 60, 30 * 60,
@@ -914,9 +800,11 @@
):
self.enabled = enabled
self._interval = interval
+ self._pastTheHour = pastTheHour
self._eventStartDistribution = eventStartDistribution
self._eventDurationDistribution = eventDurationDistribution
self._recurrenceDistribution = recurrenceDistribution
+ self._lastMinuteChecked = -1
def initialize(self):
@@ -925,6 +813,7 @@
@return: a L{Deferred} that fires when initialization is done
"""
+
return self._initEvent()
@@ -968,16 +857,35 @@
return self._newOperation("create", d)
+ def _shouldUpdate(self, minutePastTheHour):
+ """
+ We want to only acknowledge our alarm at the "past the hour" minutes
+ we've been configured for.
+ """
+ should = False
+ if minutePastTheHour in self._pastTheHour:
+ # This is one of the minutes we should update on, but only update
+ # as we pass into this minute, and not subsequent times
+ if minutePastTheHour != self._lastMinuteChecked:
+ should = True
+
+ self._lastMinuteChecked = minutePastTheHour
+ return should
+
+
def _updateEvent(self):
"""
- Try to add a new attendee to an event, or perhaps remove an
- existing attendee from an event.
+ Set the ACKNOWLEDGED property on an event.
@return: C{None} if there are no events to play with,
- otherwise a L{Deferred} which fires when the attendee
+ otherwise a L{Deferred} which fires when the acknowledged
change has been made.
"""
+ # Only do updates when we reach of the designated minutes past the hour
+ if not self._shouldUpdate(datetime.now().minute):
+ return succeed(None)
+
if not self._client.started:
return succeed(None)
Modified: CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py 2015-11-07 04:54:31 UTC (rev 15299)
+++ CalendarServer/trunk/contrib/performance/loadtest/test_profiles.py 2015-11-10 00:00:49 UTC (rev 15300)
@@ -31,8 +31,7 @@
from twistedcaldav.ical import Component, Property
-from contrib.performance.loadtest.profiles import Eventer, Inviter, Accepter, OperationLogger
-from contrib.performance.loadtest.profiles import RealisticInviter
+from contrib.performance.loadtest.profiles import Eventer, Inviter, Accepter, OperationLogger, AlarmAcknowledger
from contrib.performance.loadtest.population import Populator, CalendarClientSimulator
from contrib.performance.loadtest.ical import IncorrectResponseCode, Calendar, Event, BaseClient
from contrib.performance.loadtest.sim import _DirectoryRecord
@@ -340,209 +339,212 @@
return self.values.pop(0)
+# These were for the old Inviter class, before RealisticInviter was renamed
+# to Inviter. Keeping them around in case there are some we want to copy
+# over to the new Inviter:
+#
+# class InviterTests(TestCase):
+# """
+# Tests for loadtest.profiles.Inviter.
+# """
+# def setUp(self):
+# self.sim = CalendarClientSimulator(
+# AnyUser(), Populator(None), None, None, None, None, None, None)
-class InviterTests(TestCase):
- """
- Tests for loadtest.profiles.Inviter.
- """
- def setUp(self):
- self.sim = CalendarClientSimulator(
- AnyUser(), Populator(None), None, None, None, None, None, None)
+# def _simpleAccount(self, userNumber, eventText):
+# client = StubClient(userNumber, self.mktemp())
- def _simpleAccount(self, userNumber, eventText):
- client = StubClient(userNumber, self.mktemp())
+# vevent = Component.fromString(eventText)
+# calendar = Calendar(
+# caldavxml.calendar, set(('VEVENT',)), u'calendar', u'/cal/', None)
+# client._calendars.update({calendar.url: calendar})
- vevent = Component.fromString(eventText)
- calendar = Calendar(
- caldavxml.calendar, set(('VEVENT',)), u'calendar', u'/cal/', None)
- client._calendars.update({calendar.url: calendar})
+# event = Event(client.serializeLocation(), calendar.url + u'1234.ics', None, vevent)
- event = Event(client.serializeLocation(), calendar.url + u'1234.ics', None, vevent)
+# client._events.update({event.url: event})
+# calendar.events = {u'1234.ics': event}
- client._events.update({event.url: event})
- calendar.events = {u'1234.ics': event}
+# return vevent, event, calendar, client
- return vevent, event, calendar, client
+# def test_enabled(self):
+# userNumber = 13
+# client = StubClient(userNumber, self.mktemp())
- def test_enabled(self):
- userNumber = 13
- client = StubClient(userNumber, self.mktemp())
+# inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": False})
+# self.assertEqual(inviter.enabled, False)
- inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": False})
- self.assertEqual(inviter.enabled, False)
+# inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": True})
+# self.assertEqual(inviter.enabled, True)
- inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": True})
- self.assertEqual(inviter.enabled, True)
+# def test_doNotAddAttendeeToInbox(self):
+# """
+# When the only calendar with any events is a schedule inbox, no
+# attempt is made to add attendees to an event on that calendar.
+# """
+# userNumber = 10
+# vevent, _ignore_event, calendar, client = self._simpleAccount(
+# userNumber, SIMPLE_EVENT)
+# calendar.resourceType = caldavxml.schedule_inbox
+# inviter = Inviter(None, self.sim, client, userNumber)
+# inviter._invite()
+# self.assertFalse(vevent.mainComponent().hasProperty('ATTENDEE'))
- def test_doNotAddAttendeeToInbox(self):
- """
- When the only calendar with any events is a schedule inbox, no
- attempt is made to add attendees to an event on that calendar.
- """
- userNumber = 10
- vevent, _ignore_event, calendar, client = self._simpleAccount(
- userNumber, SIMPLE_EVENT)
- calendar.resourceType = caldavxml.schedule_inbox
- inviter = Inviter(None, self.sim, client, userNumber)
- inviter._invite()
- self.assertFalse(vevent.mainComponent().hasProperty('ATTENDEE'))
+# def test_doNotAddAttendeeToNoCalendars(self):
+# """
+# When there are no calendars and no events at all, the inviter
+# does nothing.
+# """
+# userNumber = 13
+# client = StubClient(userNumber, self.mktemp())
+# inviter = Inviter(None, self.sim, client, userNumber)
+# inviter._invite()
+# self.assertEquals(client._events, {})
+# self.assertEquals(client._calendars, {})
- def test_doNotAddAttendeeToNoCalendars(self):
- """
- When there are no calendars and no events at all, the inviter
- does nothing.
- """
- userNumber = 13
- client = StubClient(userNumber, self.mktemp())
- inviter = Inviter(None, self.sim, client, userNumber)
- inviter._invite()
- self.assertEquals(client._events, {})
- self.assertEquals(client._calendars, {})
+# def test_doNotAddAttendeeToUninitializedEvent(self):
+# """
+# When there is an L{Event} on a calendar but the details of the
+# event have not yet been retrieved, no attempt is made to add
+# invitees to that event.
+# """
+# userNumber = 19
+# _ignore_vevent, event, calendar, client = self._simpleAccount(
+# userNumber, SIMPLE_EVENT)
+# event.component = event.etag = event.scheduleTag = None
+# inviter = Inviter(None, self.sim, client, userNumber)
+# inviter._invite()
+# self.assertEquals(client._events, {event.url: event})
+# self.assertEquals(client._calendars, {calendar.url: calendar})
- def test_doNotAddAttendeeToUninitializedEvent(self):
- """
- When there is an L{Event} on a calendar but the details of the
- event have not yet been retrieved, no attempt is made to add
- invitees to that event.
- """
- userNumber = 19
- _ignore_vevent, event, calendar, client = self._simpleAccount(
- userNumber, SIMPLE_EVENT)
- event.component = event.etag = event.scheduleTag = None
- inviter = Inviter(None, self.sim, client, userNumber)
- inviter._invite()
- self.assertEquals(client._events, {event.url: event})
- self.assertEquals(client._calendars, {calendar.url: calendar})
+# def test_addAttendeeToEvent(self):
+# """
+# When there is a normal calendar with an event, inviter adds an
+# attendee to it.
+# """
+# userNumber = 16
+# _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
+# userNumber, SIMPLE_EVENT)
+# inviter = Inviter(Clock(), self.sim, client, userNumber)
+# inviter.setParameters(inviteeDistribution=Deterministic(1))
+# inviter._invite()
+# attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
+# self.assertEquals(len(attendees), 1)
+# for paramname, paramvalue in {
+# 'CN': 'User %d' % (userNumber + 1,),
+# 'CUTYPE': 'INDIVIDUAL',
+# 'PARTSTAT': 'NEEDS-ACTION',
+# 'ROLE': 'REQ-PARTICIPANT',
+# 'RSVP': 'TRUE'
+# }.items():
+# self.assertTrue(attendees[0].hasParameter(paramname))
+# self.assertEqual(attendees[0].parameterValue(paramname), paramvalue)
- def test_addAttendeeToEvent(self):
- """
- When there is a normal calendar with an event, inviter adds an
- attendee to it.
- """
- userNumber = 16
- _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
- userNumber, SIMPLE_EVENT)
- inviter = Inviter(Clock(), self.sim, client, userNumber)
- inviter.setParameters(inviteeDistribution=Deterministic(1))
- inviter._invite()
- attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
- self.assertEquals(len(attendees), 1)
- for paramname, paramvalue in {
- 'CN': 'User %d' % (userNumber + 1,),
- 'CUTYPE': 'INDIVIDUAL',
- 'PARTSTAT': 'NEEDS-ACTION',
- 'ROLE': 'REQ-PARTICIPANT',
- 'RSVP': 'TRUE'
- }.items():
- self.assertTrue(attendees[0].hasParameter(paramname))
- self.assertEqual(attendees[0].parameterValue(paramname), paramvalue)
+# def test_doNotAddSelfToEvent(self):
+# """
+# If the inviter randomly selects its own user to be added to
+# the attendee list, a different user is added instead.
+# """
+# selfNumber = 12
+# _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
+# selfNumber, SIMPLE_EVENT)
- def test_doNotAddSelfToEvent(self):
- """
- If the inviter randomly selects its own user to be added to
- the attendee list, a different user is added instead.
- """
- selfNumber = 12
- _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
- selfNumber, SIMPLE_EVENT)
+# otherNumber = 20
+# values = [selfNumber - selfNumber, otherNumber - selfNumber]
- otherNumber = 20
- values = [selfNumber - selfNumber, otherNumber - selfNumber]
+# inviter = Inviter(Clock(), self.sim, client, selfNumber)
+# inviter.setParameters(inviteeDistribution=SequentialDistribution(values))
+# inviter._invite()
+# attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
+# self.assertEquals(len(attendees), 1)
+# for paramname, paramvalue in {
+# 'CN': 'User %d' % (otherNumber,),
+# 'CUTYPE': 'INDIVIDUAL',
+# 'PARTSTAT': 'NEEDS-ACTION',
+# 'ROLE': 'REQ-PARTICIPANT',
+# 'RSVP': 'TRUE'
+# }.items():
+# self.assertTrue(attendees[0].hasParameter(paramname))
+# self.assertEqual(attendees[0].parameterValue(paramname), paramvalue)
- inviter = Inviter(Clock(), self.sim, client, selfNumber)
- inviter.setParameters(inviteeDistribution=SequentialDistribution(values))
- inviter._invite()
- attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
- self.assertEquals(len(attendees), 1)
- for paramname, paramvalue in {
- 'CN': 'User %d' % (otherNumber,),
- 'CUTYPE': 'INDIVIDUAL',
- 'PARTSTAT': 'NEEDS-ACTION',
- 'ROLE': 'REQ-PARTICIPANT',
- 'RSVP': 'TRUE'
- }.items():
- self.assertTrue(attendees[0].hasParameter(paramname))
- self.assertEqual(attendees[0].parameterValue(paramname), paramvalue)
+# def test_doNotAddExistingToEvent(self):
+# """
+# If the inviter randomly selects a user which is already an
+# invitee on the event, a different user is added instead.
+# """
+# selfNumber = 1
+# _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
+# selfNumber, INVITED_EVENT)
- def test_doNotAddExistingToEvent(self):
- """
- If the inviter randomly selects a user which is already an
- invitee on the event, a different user is added instead.
- """
- selfNumber = 1
- _ignore_vevent, event, _ignore_calendar, client = self._simpleAccount(
- selfNumber, INVITED_EVENT)
+# invitee = tuple(event.component.mainComponent().properties('ATTENDEE'))[0]
+# inviteeNumber = int(invitee.parameterValue('CN').split()[1])
+# anotherNumber = inviteeNumber + 5
+# values = [inviteeNumber - selfNumber, anotherNumber - selfNumber]
- invitee = tuple(event.component.mainComponent().properties('ATTENDEE'))[0]
- inviteeNumber = int(invitee.parameterValue('CN').split()[1])
- anotherNumber = inviteeNumber + 5
- values = [inviteeNumber - selfNumber, anotherNumber - selfNumber]
+# inviter = Inviter(Clock(), self.sim, client, selfNumber)
+# inviter.setParameters(inviteeDistribution=SequentialDistribution(values))
+# inviter._invite()
+# attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
+# self.assertEquals(len(attendees), 3)
+# for paramname, paramvalue in {
+# 'CN': 'User %02d' % (anotherNumber,),
+# 'CUTYPE': 'INDIVIDUAL',
+# 'PARTSTAT': 'NEEDS-ACTION',
+# 'ROLE': 'REQ-PARTICIPANT',
+# 'RSVP': 'TRUE'
+# }.items():
+# self.assertTrue(attendees[2].hasParameter(paramname))
+# self.assertEqual(attendees[2].parameterValue(paramname), paramvalue)
- inviter = Inviter(Clock(), self.sim, client, selfNumber)
- inviter.setParameters(inviteeDistribution=SequentialDistribution(values))
- inviter._invite()
- attendees = tuple(event.component.mainComponent().properties('ATTENDEE'))
- self.assertEquals(len(attendees), 3)
- for paramname, paramvalue in {
- 'CN': 'User %02d' % (anotherNumber,),
- 'CUTYPE': 'INDIVIDUAL',
- 'PARTSTAT': 'NEEDS-ACTION',
- 'ROLE': 'REQ-PARTICIPANT',
- 'RSVP': 'TRUE'
- }.items():
- self.assertTrue(attendees[2].hasParameter(paramname))
- self.assertEqual(attendees[2].parameterValue(paramname), paramvalue)
+# def test_everybodyInvitedAlready(self):
+# """
+# If the first so-many randomly selected users we come across
+# are already attendees on the event, the invitation attempt is
+# abandoned.
+# """
+# selfNumber = 1
+# vevent, _ignore_event, _ignore_calendar, client = self._simpleAccount(
+# selfNumber, INVITED_EVENT)
+# inviter = Inviter(Clock(), self.sim, client, selfNumber)
+# # Always return a user number which has already been invited.
+# inviter.setParameters(inviteeDistribution=Deterministic(2 - selfNumber))
+# inviter._invite()
+# attendees = tuple(vevent.mainComponent().properties('ATTENDEE'))
+# self.assertEquals(len(attendees), 2)
- def test_everybodyInvitedAlready(self):
- """
- If the first so-many randomly selected users we come across
- are already attendees on the event, the invitation attempt is
- abandoned.
- """
- selfNumber = 1
- vevent, _ignore_event, _ignore_calendar, client = self._simpleAccount(
- selfNumber, INVITED_EVENT)
- inviter = Inviter(Clock(), self.sim, client, selfNumber)
- # Always return a user number which has already been invited.
- inviter.setParameters(inviteeDistribution=Deterministic(2 - selfNumber))
- inviter._invite()
- attendees = tuple(vevent.mainComponent().properties('ATTENDEE'))
- self.assertEquals(len(attendees), 2)
+# def test_doNotInviteToSomeoneElsesEvent(self):
+# """
+# If there are events on our calendar which are being organized
+# by someone else, the inviter does not attempt to invite new
+# users to them.
+# """
+# selfNumber = 2
+# vevent, _ignore_event, _ignore_calendar, client = self._simpleAccount(
+# selfNumber, INVITED_EVENT)
+# 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.
+# inviter._invite()
+# attendees = tuple(vevent.mainComponent().properties('ATTENDEE'))
+# self.assertEqual(len(attendees), 2)
+# self.assertEqual(attendees[0].parameterValue('CN'), 'User 01')
+# self.assertEqual(attendees[1].parameterValue('CN'), 'User 02')
- def test_doNotInviteToSomeoneElsesEvent(self):
- """
- If there are events on our calendar which are being organized
- by someone else, the inviter does not attempt to invite new
- users to them.
- """
- selfNumber = 2
- vevent, _ignore_event, _ignore_calendar, client = self._simpleAccount(
- selfNumber, INVITED_EVENT)
- 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.
- inviter._invite()
- attendees = tuple(vevent.mainComponent().properties('ATTENDEE'))
- self.assertEqual(len(attendees), 2)
- self.assertEqual(attendees[0].parameterValue('CN'), 'User 01')
- self.assertEqual(attendees[1].parameterValue('CN'), 'User 02')
-
-class RealisticInviterTests(TestCase):
+class InviterTests(TestCase):
"""
- Tests for loadtest.profiles.RealisticInviter.
+ Tests for loadtest.profiles.Inviter.
"""
def setUp(self):
self.sim = CalendarClientSimulator(
@@ -566,10 +568,10 @@
userNumber = 13
client = StubClient(userNumber, self.mktemp())
- inviter = RealisticInviter(None, self.sim, client, userNumber, **{"enabled": False})
+ inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": False})
self.assertEqual(inviter.enabled, False)
- inviter = RealisticInviter(None, self.sim, client, userNumber, **{"enabled": True})
+ inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": True})
self.assertEqual(inviter.enabled, True)
@@ -584,7 +586,7 @@
client = StubClient(userNumber, self.mktemp())
client._calendars.update({calendar.url: calendar})
- inviter = RealisticInviter(None, self.sim, client, userNumber, **{"enabled": False})
+ inviter = Inviter(None, self.sim, client, userNumber, **{"enabled": False})
inviter._invite()
self.assertEquals(client._events, {})
@@ -597,7 +599,7 @@
"""
userNumber = 13
client = StubClient(userNumber, self.mktemp())
- inviter = RealisticInviter(None, self.sim, client, userNumber)
+ inviter = Inviter(None, self.sim, client, userNumber)
inviter._invite()
self.assertEquals(client._events, {})
self.assertEquals(client._calendars, {})
@@ -614,7 +616,7 @@
os.mkdir(serializePath)
client = StubClient(userNumber, self.mktemp())
client._calendars.update({calendar.url: calendar})
- inviter = RealisticInviter(Clock(), self.sim, client, userNumber)
+ inviter = Inviter(Clock(), self.sim, client, userNumber)
inviter.setParameters(
inviteeDistribution=Deterministic(1),
inviteeCountDistribution=Deterministic(1)
@@ -642,7 +644,7 @@
otherNumber = 20
values = [selfNumber - selfNumber, otherNumber - selfNumber]
- inviter = RealisticInviter(Clock(), self.sim, client, selfNumber)
+ inviter = Inviter(Clock(), self.sim, client, selfNumber)
inviter.setParameters(
inviteeDistribution=SequentialDistribution(values),
inviteeCountDistribution=Deterministic(1)
@@ -671,7 +673,7 @@
anotherNumber = inviteeNumber + 5
values = [inviteeNumber - selfNumber, inviteeNumber - selfNumber, anotherNumber - selfNumber]
- inviter = RealisticInviter(Clock(), self.sim, client, selfNumber)
+ inviter = Inviter(Clock(), self.sim, client, selfNumber)
inviter.setParameters(
inviteeDistribution=SequentialDistribution(values),
inviteeCountDistribution=Deterministic(2)
@@ -700,7 +702,7 @@
userNumber = 1
client = StubClient(userNumber, self.mktemp())
client._calendars.update({calendar.url: calendar})
- inviter = RealisticInviter(Clock(), self.sim, client, userNumber)
+ inviter = Inviter(Clock(), self.sim, client, userNumber)
inviter.setParameters(
inviteeDistribution=Deterministic(1),
inviteeCountDistribution=Deterministic(2)
@@ -1089,3 +1091,22 @@
self.assertEqual(
["Greater than 1% TESTING failed"],
logger.failures())
+
+
+class AlarmAcknowledgerTests(TestCase):
+
+ def test_pastTheHour(self):
+ acknowledger = AlarmAcknowledger(None, None, None, {})
+ self.assertTrue(acknowledger._shouldUpdate(0))
+ self.assertFalse(acknowledger._shouldUpdate(0))
+ self.assertFalse(acknowledger._shouldUpdate(1))
+ self.assertFalse(acknowledger._shouldUpdate(1))
+ self.assertFalse(acknowledger._shouldUpdate(14))
+ self.assertTrue(acknowledger._shouldUpdate(15))
+ self.assertFalse(acknowledger._shouldUpdate(15))
+ self.assertFalse(acknowledger._shouldUpdate(16))
+ self.assertTrue(acknowledger._shouldUpdate(30))
+ self.assertFalse(acknowledger._shouldUpdate(30))
+ self.assertFalse(acknowledger._shouldUpdate(59))
+ self.assertTrue(acknowledger._shouldUpdate(0))
+ self.assertFalse(acknowledger._shouldUpdate(0))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20151109/0acc5081/attachment-0001.html>
More information about the calendarserver-changes
mailing list