<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12142] CalendarServer/branches/users/gaya/sharedgroupfixes</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/12142">12142</a></dd>
<dt>Author</dt> <dd>gaya@apple.com</dd>
<dt>Date</dt> <dd>2013-12-18 20:51:29 -0800 (Wed, 18 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>merge in 12017 to 12131 from trunk</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVcalendaruserproxyxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVprivatecommentsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharingcreatexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharinginvitesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterverifiersmultistatusItemspy">CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesbinproxyclean">CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesbintrial">CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserver__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserveraccesslogpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisionrootpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisiontesttest_rootpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverpushapplepushpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertapcaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertaptesttest_caldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertaputilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsagentpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsanonymizepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsbackup_pgpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsconfigpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsdkimtoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsgatewaypy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsprincipalspy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstestgatewaycaldavdplist">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_gatewaypy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purgepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purge_old_eventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadminresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadmintesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebcalresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfauthaugmentstestxml">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfauthresourcestestxml">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdappleplist">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdtestplist">CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformanceloadtestsimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsinvitepy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsmultigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsputpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestssyncpy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagesqlusagepy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixescontribperformancestatspy">CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixespyflakes">CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessetuppy">CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessupportbuildsh">CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixessupportpysh">CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestest">CalendarServer/branches/users/gaya/sharedgroupfixes/test</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginscaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldav__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavauthkerbpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbackuppy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbindpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavcachepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclient__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientpoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientreverseproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclienttesttest_reverseproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersperuserdatapy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersprivateeventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafilterstesttest_privateeventspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaddressbookpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryappleopendirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaugmentpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycachingdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendaruserproxypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydigestpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryinternalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryldapdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryopendirectorybackerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryprincipalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_aggregatepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_digestpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_guidchangepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_ldapdirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_opendirectorypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_principalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_wikipy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_xmlfilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorywikipy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlaccountsparserpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlfilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorybackedaddressbookpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdropboxpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavextensionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavfreebusyurlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicalpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicaldavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavlinkresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepoolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepropspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodaclpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodgetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcolpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpostpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpropfindpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreportpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_addressbook_querypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_calendar_querypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_commonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_freebusypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_multiget_commonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_sync_collectionpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavnotificationspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsharingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsimpleresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstdconfigpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstorebridgepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_accountingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookmultigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_cachepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_calendarquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_collectioncontentspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_configpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_extensionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_freebusyquerypy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_icalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_kerberospy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_linkpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachelockpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachepropspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_mkcalendarpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_multigetpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_optionspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_propspy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_sharingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_utilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_wrappingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezoneservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezonestdservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavupgradepy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavvcardpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdav__init__py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastoresubpostgrespy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorebasepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorexattrpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavdeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipdeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimiptesttest_deliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimplicitpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledeliverypy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledkimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_dkimpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_localserverspy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_resourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingitippy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingprocessingpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingschedulerpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingtesttest_implicitpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestcommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_attachmentspy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_filepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_sqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_utilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavicalendarstorepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavresourcepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoretestcommonpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastorefilepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoresqlpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoretestutilpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradetesttest_migratepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavcommonidirectoryservicepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavidavpy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmlbasepy">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmlrfc2518py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxdavxmltesttest_xml_rfc3744py">CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/implicit/auto11/</li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCalDAVprivatecomments44ics">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics</a></li>
<li>CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV-pod/</li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARveventxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARvtodoxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharedasxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingdecline2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite1xml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2ropodxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite23podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingremove2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply2podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply3podxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDinvitexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDnotificationtypexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDpropsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVimplicitauto11xml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcachexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcalendarsxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcreatexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdirectxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdropboxxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingfreebusyxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharinginvitesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmovesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmultiplexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingnotificationsyncxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserdataxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserpropertiesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingpropfindxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingproxiesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingrepliesxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingreportsmultigetxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingsyncxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingunsharexml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml</a></li>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingwebcalxml">CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml</a></li>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/test/</li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcacheclientpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py</a></li>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/</li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>CalendarServer/branches/users/gaya/sharedgroupfixes/twext/</li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginskqueuereactorpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestwistedpluginsmasterchildpy">CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py</a></li>
</ul>

<h3>Property Changed</h3>
<ul>
<li><a href="#CalDAVTesterbranchesusersgayasharedgroupfixestester">CalDAVTester/branches/users/gaya/sharedgroupfixestester/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixes">CalendarServer/branches/users/gaya/sharedgroupfixes/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2auth">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/auth/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2channel">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/channel/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2client">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/client/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2dav">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/dav/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2davmethod">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/dav/method/</a></li>
<li><a href="#CalendarServerbranchesusersgayasharedgroupfixestxweb2filter">CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2/filter/</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestester"></a>
<div class="propset"><h4>Property changes: CalDAVTester/branches/users/gaya/sharedgroupfixestester</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalDAVTester/branches/release/CalDAVTester-4.3-dev:10193
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/managed-attachments:9986-10145
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
</span><span class="cx">/CalDAVTester/branches/users/gaya/sharedgroupstester-3:11181-11204
</span><span class="cx">/CalDAVTester/trunk:11742-12016
</span><span class="cx">   + /CalDAVTester/branches/release/CalDAVTester-3.0-dev:7584
</span><span class="cx">/CalDAVTester/branches/release/CalDAVTester-4.3-dev:10193
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/managed-attachments:9986-10145
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
</span><span class="cx">/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
</span><span class="cx">/CalDAVTester/branches/users/gaya/sharedgroupstester-3:11181-11204
</span><span class="cx">/CalDAVTester/trunk:11742-12016,12018-12132
</span><a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCalDAVprivatecomments44icsfromrev12132CalDAVTestertrunkResourceCalDAVprivatecomments44ics"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics (from rev 12132, CalDAVTester/trunk/Resource/CalDAV/privatecomments/44.ics) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/CalDAV/privatecomments/44.ics        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,38 @@
</span><ins>+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+BEGIN:VTIMEZONE
+TZID:US/Eastern
+LAST-MODIFIED:20040110T032845Z
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:event3@ninevah.local
+DTSTART;TZID=US/Eastern:$now.year.1:0101T100000
+DURATION:PT1H
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED:$cuaddr1:
+ATTENDEE;CN=$username2:;PARTSTAT=ACCEPTED;RSVP=TRUE:$cuaddr2:
+CREATED:20060101T150000Z
+DTSTAMP:20051222T205953Z
+ORGANIZER;CN=$username1::$cuaddr1:
+SUMMARY:event 3
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;$cuaddrurn2:
+ &quot;;X-CALENDARSERVER-DTSTAMP=20080827T171052Z:I have accepted.
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;$cuaddrurn2:
+ &quot;;X-CALENDARSERVER-DTSTAMP=20080828T171052Z:I have accepted again.
+END:VEVENT
+END:VCALENDAR
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARveventxmlfromrev12132CalDAVTestertrunkResourceCommonMKCALENDARveventxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/MKCALENDAR/vevent.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vevent.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;C:mkcalendar xmlns:D=&quot;DAV:&quot; xmlns:C=&quot;urn:ietf:params:xml:ns:caldav&quot;&gt;
+&lt;D:set&gt;
+&lt;D:prop&gt;
+&lt;C:supported-calendar-component-set&gt;
+&lt;C:comp name=&quot;VEVENT&quot;/&gt;
+&lt;/C:supported-calendar-component-set&gt;
+&lt;/D:prop&gt;
+&lt;/D:set&gt;
+&lt;/C:mkcalendar&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonMKCALENDARvtodoxmlfromrev12132CalDAVTestertrunkResourceCommonMKCALENDARvtodoxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/MKCALENDAR/vtodo.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/MKCALENDAR/vtodo.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;C:mkcalendar xmlns:D=&quot;DAV:&quot; xmlns:C=&quot;urn:ietf:params:xml:ns:caldav&quot;&gt;
+&lt;D:set&gt;
+&lt;D:prop&gt;
+&lt;C:supported-calendar-component-set&gt;
+&lt;C:comp name=&quot;VTODO&quot;/&gt;
+&lt;/C:supported-calendar-component-set&gt;
+&lt;/D:prop&gt;
+&lt;/D:set&gt;
+&lt;/C:mkcalendar&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharedasxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharedasxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharedas.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharedas.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+&lt;?xml version='1.0' encoding='UTF-8'?&gt;
+&lt;shared-as xmlns='http://calendarserver.org/ns/'&gt;
+  &lt;href xmlns='DAV:'&gt;&lt;/href&gt;
+&lt;/shared-as&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingdecline2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingdecline2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingdecline2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingdecline2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;?xml version='1.0' encoding='UTF-8'?&gt;
+&lt;invite-reply xmlns='http://calendarserver.org/ns/'&gt;
+  &lt;href xmlns='DAV:'&gt;mailto:$pemail2:&lt;/href&gt;
+  &lt;invite-declined/&gt;
+  &lt;hosturl&gt;
+    &lt;href xmlns='DAV:'&gt;$calendarhome1:/shared&lt;/href&gt;
+  &lt;/hosturl&gt;
+  &lt;in-reply-to&gt;$inviteuid2:&lt;/in-reply-to&gt;
+  &lt;summary&gt;The Shared Calendar&lt;/summary&gt;
+  &lt;common-name&gt;$pusername2:&lt;/common-name&gt;
+  &lt;first-name&gt;$pfirstname2:&lt;/first-name&gt;
+  &lt;last-name&gt;$plastname2:&lt;/last-name&gt;
+&lt;/invite-reply&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite1xmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite1xml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite1.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite1.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;CS:share xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+    &lt;CS:set&gt;
+        &lt;D:href&gt;$cuaddr1:&lt;/D:href&gt;
+        &lt;CS:summary&gt;My Shared Calendar&lt;/CS:summary&gt;
+        &lt;CS:read-write/&gt;
+    &lt;/CS:set&gt;
+&lt;/CS:share&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;CS:share xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+    &lt;CS:set&gt;
+        &lt;D:href&gt;$pcuaddr2:&lt;/D:href&gt;
+        &lt;CS:summary&gt;My Shared Calendar&lt;/CS:summary&gt;
+        &lt;CS:read-write/&gt;
+    &lt;/CS:set&gt;
+&lt;/CS:share&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite2ropodxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite2ropodxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite2-ro-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite2-ro-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;CS:share xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+    &lt;CS:set&gt;
+        &lt;D:href&gt;$pcuaddr2:&lt;/D:href&gt;
+        &lt;CS:summary&gt;My Shared Calendar&lt;/CS:summary&gt;
+        &lt;CS:read/&gt;
+    &lt;/CS:set&gt;
+&lt;/CS:share&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharinginvite23podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharinginvite23podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharinginvite23-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharinginvite23-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;CS:share xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+    &lt;CS:set&gt;
+        &lt;D:href&gt;$pcuaddr2:&lt;/D:href&gt;
+        &lt;CS:summary&gt;My Shared Calendar&lt;/CS:summary&gt;
+        &lt;CS:read-write/&gt;
+    &lt;/CS:set&gt;
+    &lt;CS:set&gt;
+        &lt;D:href&gt;$pcuaddr3:&lt;/D:href&gt;
+        &lt;CS:summary&gt;My Shared Calendar&lt;/CS:summary&gt;
+        &lt;CS:read/&gt;
+    &lt;/CS:set&gt;
+&lt;/CS:share&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingremove2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingremove2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingremove2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingremove2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;CS:share xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+    &lt;CS:remove&gt;
+        &lt;D:href&gt;$pcuaddr2:&lt;/D:href&gt;
+        &lt;CS:read-write/&gt;
+    &lt;/CS:remove&gt;
+&lt;/CS:share&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply2podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingreply2podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingreply2-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply2-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;?xml version='1.0' encoding='UTF-8'?&gt;
+&lt;invite-reply xmlns='http://calendarserver.org/ns/'&gt;
+  &lt;href xmlns='DAV:'&gt;mailto:$pemail2:&lt;/href&gt;
+  &lt;invite-accepted/&gt;
+  &lt;hosturl&gt;
+    &lt;href xmlns='DAV:'&gt;$hosturl2:&lt;/href&gt;
+  &lt;/hosturl&gt;
+  &lt;in-reply-to&gt;$inviteuid2:&lt;/in-reply-to&gt;
+  &lt;summary&gt;The Shared Calendar&lt;/summary&gt;
+  &lt;common-name&gt;$pusername2:&lt;/common-name&gt;
+  &lt;first-name&gt;$pfirstname2:&lt;/first-name&gt;
+  &lt;last-name&gt;$plastname2:&lt;/last-name&gt;
+&lt;/invite-reply&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPOSTsharingreply3podxmlfromrev12132CalDAVTestertrunkResourceCommonPOSTsharingreply3podxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/POST/sharingreply3-pod.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/POST/sharingreply3-pod.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;?xml version='1.0' encoding='UTF-8'?&gt;
+&lt;invite-reply xmlns='http://calendarserver.org/ns/'&gt;
+  &lt;href xmlns='DAV:'&gt;mailto:$pemail3:&lt;/href&gt;
+  &lt;invite-accepted/&gt;
+  &lt;hosturl&gt;
+    &lt;href xmlns='DAV:'&gt;$hosturl3:&lt;/href&gt;
+  &lt;/hosturl&gt;
+  &lt;in-reply-to&gt;$inviteuid3:&lt;/in-reply-to&gt;
+  &lt;summary&gt;The Shared Calendar&lt;/summary&gt;
+  &lt;common-name&gt;$pusername3:&lt;/common-name&gt;
+  &lt;first-name&gt;$pfirstname3:&lt;/first-name&gt;
+  &lt;last-name&gt;$plastname3:&lt;/last-name&gt;
+&lt;/invite-reply&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDinvitexmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDinvitexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/invite.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/invite.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;D:propfind xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+&lt;D:prop&gt;
+&lt;CS:invite/&gt;
+&lt;/D:prop&gt;
+&lt;/D:propfind&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDnotificationtypexmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDnotificationtypexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/notificationtype.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/notificationtype.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;D:propfind xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+&lt;D:prop&gt;
+&lt;CS:notificationtype/&gt;
+&lt;/D:prop&gt;
+&lt;/D:propfind&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterResourceCommonPROPFINDpropsxmlfromrev12132CalDAVTestertrunkResourceCommonPROPFINDpropsxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml (from rev 12132, CalDAVTester/trunk/Resource/Common/PROPFIND/props.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/Resource/Common/PROPFIND/props.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+&lt;D:propfind xmlns:D=&quot;DAV:&quot; xmlns:CS=&quot;http://calendarserver.org/ns/&quot;&gt;
+&lt;D:prop&gt;
+&lt;D:creationdate/&gt;
+&lt;D:current-user-privilege-set/&gt;
+&lt;D:displayname/&gt;
+&lt;D:getcontenttype/&gt;
+&lt;CS:getctag/&gt;
+&lt;D:getetag/&gt;
+&lt;D:getlastmodified/&gt;
+&lt;D:resource-id/&gt;
+&lt;D:resourcetype/&gt;
+&lt;D:supported-report-set/&gt;
+&lt;D:sync-token/&gt;
+&lt;/D:prop&gt;
+&lt;/D:propfind&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVcalendaruserproxyxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/calendaruserproxy.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -148,11 +148,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -171,11 +171,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -223,11 +223,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-member-set$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri2:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -246,11 +246,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -269,11 +269,10 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-membership$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri1:calendar-proxy-read/&lt;/D:href&gt;]]&gt;&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[=$principaluri1:calendar-proxy-read/]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -339,11 +338,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -362,11 +361,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -385,11 +384,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -437,11 +436,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-member-set$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri2:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -460,11 +459,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -483,11 +482,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-membership$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri1:calendar-proxy-write/&lt;/D:href&gt;]]&gt;&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[$principaluri1:calendar-proxy-write/]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -581,11 +580,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -604,11 +603,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -627,11 +626,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set$&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -700,11 +699,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-member-set$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri1:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -723,10 +722,10 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;dataString&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;contains&lt;/name&gt;
-                                                &lt;value&gt;&amp;lt;href&amp;gt;$rprincipaluri1:calendar-proxy-write/&amp;lt;/href&amp;gt;&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[$rprincipaluri1:calendar-proxy-write/]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -745,11 +744,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;&lt;![CDATA[{DAV:}group-member-set$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri3:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri3:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -768,10 +767,10 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;dataString&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;contains&lt;/name&gt;
-                                                &lt;value&gt;&amp;lt;href&amp;gt;$rprincipaluri1:calendar-proxy-read/&amp;lt;/href&amp;gt;&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership/{DAV:}href[=$rprincipaluri1:calendar-proxy-read/]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -808,21 +807,14 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/2.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
-                                                &lt;value&gt;{DAV:}group-membership$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri2:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-member-set/{DAV:}href[=$principaluri3:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}group-membership[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><del>-                                &lt;verify&gt;
-                                        &lt;callback&gt;dataString&lt;/callback&gt;
-                                        &lt;arg&gt;
-                                                &lt;name&gt;contains&lt;/name&gt;
-                                                &lt;value&gt;&amp;lt;href&amp;gt;$principaluri2:&amp;lt;/href&amp;gt;&lt;/value&gt;
-                                                &lt;value&gt;&amp;lt;href&amp;gt;$principaluri3:&amp;lt;/href&amp;gt;&lt;/value&gt;
-                                        &lt;/arg&gt;
-                                &lt;/verify&gt;
</del><span class="cx">                         &lt;/request&gt;
</span><span class="cx">                 &lt;/test&gt;
</span><span class="cx">                 &lt;test name='2'&gt;
</span><span class="lines">@@ -873,7 +865,7 @@
</span><span class="cx">                         &lt;description&gt;Default setup&lt;/description&gt;
</span><span class="cx">                         &lt;request print-response=&quot;no&quot;&gt;
</span><span class="cx">                                 &lt;method&gt;PROPFIND&lt;/method&gt;
</span><del>-                                &lt;ruri&gt;$principal1:/&lt;/ruri&gt;
</del><ins>+                                &lt;ruri&gt;$principal1:&lt;/ruri&gt;
</ins><span class="cx">                                 &lt;header&gt;
</span><span class="cx">                                         &lt;name&gt;Depth&lt;/name&gt;
</span><span class="cx">                                         &lt;value&gt;0&lt;/value&gt;
</span><span class="lines">@@ -883,11 +875,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/10.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{http://calendarserver.org/ns/}calendar-proxy-read-for$&lt;/value&gt;
-                                                &lt;value&gt;{http://calendarserver.org/ns/}calendar-proxy-write-for$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -926,7 +918,7 @@
</span><span class="cx">                         &lt;/request&gt;
</span><span class="cx">                         &lt;request print-response=&quot;no&quot;&gt;
</span><span class="cx">                                 &lt;method&gt;PROPFIND&lt;/method&gt;
</span><del>-                                &lt;ruri&gt;$principal1:/&lt;/ruri&gt;
</del><ins>+                                &lt;ruri&gt;$principal1:&lt;/ruri&gt;
</ins><span class="cx">                                 &lt;header&gt;
</span><span class="cx">                                         &lt;name&gt;Depth&lt;/name&gt;
</span><span class="cx">                                         &lt;value&gt;0&lt;/value&gt;
</span><span class="lines">@@ -936,11 +928,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/10.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindValues&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;&lt;![CDATA[{http://calendarserver.org/ns/}calendar-proxy-read-for$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri2:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
-                                                &lt;value&gt;&lt;![CDATA[{http://calendarserver.org/ns/}calendar-proxy-write-for$&lt;D:href xmlns:D=&quot;DAV:&quot;&gt;$principaluri3:&lt;/D:href&gt;]]&gt;&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for/{DAV:}href[=$principaluri2:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for/{DAV:}href[=$principaluri3:]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="lines">@@ -979,7 +971,7 @@
</span><span class="cx">                         &lt;/request&gt;
</span><span class="cx">                         &lt;request print-response=&quot;no&quot;&gt;
</span><span class="cx">                                 &lt;method&gt;PROPFIND&lt;/method&gt;
</span><del>-                                &lt;ruri&gt;$principal1:/&lt;/ruri&gt;
</del><ins>+                                &lt;ruri&gt;$principal1:&lt;/ruri&gt;
</ins><span class="cx">                                 &lt;header&gt;
</span><span class="cx">                                         &lt;name&gt;Depth&lt;/name&gt;
</span><span class="cx">                                         &lt;value&gt;0&lt;/value&gt;
</span><span class="lines">@@ -989,11 +981,11 @@
</span><span class="cx">                                         &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/10.xml&lt;/filepath&gt;
</span><span class="cx">                                 &lt;/data&gt;
</span><span class="cx">                                 &lt;verify&gt;
</span><del>-                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
</del><ins>+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
</ins><span class="cx">                                         &lt;arg&gt;
</span><del>-                                                &lt;name&gt;okprops&lt;/name&gt;
-                                                &lt;value&gt;{http://calendarserver.org/ns/}calendar-proxy-read-for$&lt;/value&gt;
-                                                &lt;value&gt;{http://calendarserver.org/ns/}calendar-proxy-write-for$&lt;/value&gt;
</del><ins>+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-read-for[|]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}calendar-proxy-write-for[|]&lt;/value&gt;
</ins><span class="cx">                                         &lt;/arg&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVimplicitauto11xmlfromrev12132CalDAVTestertrunkscriptstestsCalDAVimplicitauto11xml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml (from rev 12132, CalDAVTester/trunk/scripts/tests/CalDAV/implicitauto11.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/implicitauto11.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,256 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test implicit scheduling for auto-accept location where hidden instances are used&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;auto-accept&lt;/feature&gt;
+                &lt;feature&gt;implicit-scheduling&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;GET&lt;/method&gt;
+                        &lt;ruri&gt;$calendarpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                        &lt;method&gt;GET&lt;/method&gt;
+                        &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$inboxpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$rinboxpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$rcalendarpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='#1 Non-recurring' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Create recurring event - resource invited to two instances only&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/implicit/auto11/suite1/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;One item in user01 Inbox&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;WAITDELETEALL 1&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;One item in user01 Calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/implicit/auto11/suite1/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;No items in resource01 Inbox&lt;/description&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$rinboxpath1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;One item in resource01 Calendar&lt;/description&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$rcalendarpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/implicit/auto11/suite1/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;graburi&gt;$r1:&lt;/graburi&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Proxy removes first instance to decline it&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$r1:&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/implicit/auto11/suite1/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;One item in resource01 Calendar&lt;/description&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$r1:&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/implicit/auto11/suite1/4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;One item in user01 Inbox&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;WAITDELETEALL 1&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;One item in user01 Calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/implicit/auto11/suite1/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;Organizer cancels second instance&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/implicit/auto11/suite1/6.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11' ignore='no'&gt;
+                        &lt;description&gt;One item in user01 Calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/implicit/auto11/suite1/7.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12' ignore='no'&gt;
+                        &lt;description&gt;No item in resource01 Calendar&lt;/description&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$r1:&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='-1' ignore='no'&gt;
+                        &lt;description&gt;Clean-up inboxes&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$rinboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$calendarpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$inboxpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$rinboxpath1:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$rcalendarpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVprivatecommentsxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/privatecomments.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1124,8 +1124,175 @@
</span><span class="cx">                                 &lt;/verify&gt;
</span><span class="cx">                         &lt;/request&gt;
</span><span class="cx">                 &lt;/test&gt;
</span><ins>+                &lt;test name='-1'&gt;
+                        &lt;description&gt;Clean-up&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
</ins><span class="cx">         &lt;/test-suite&gt;
</span><span class="cx"> 
</span><ins>+        &lt;test-suite name='No duplicates' ignore='no'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Organizer invites Attendee&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/privatecomments/26.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Organizer checks data&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/privatecomments/27.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Attendee Inbox Item&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITDELETEALL 1&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Attendee has data&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/privatecomments/28.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Attendee -&gt; Accepts with comment&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/privatecomments/29.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Attendee has data&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/privatecomments/30.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Organizer Inbox Item&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;WAITDELETEALL 1&lt;/method&gt;
+                                &lt;ruri&gt;$inboxpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9'&gt;
+                        &lt;description&gt;Organizer data changed&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/privatecomments/35.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10'&gt;
+                        &lt;description&gt;Organizer duplicates comment&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/privatecomments/44.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}no-duplicate-private-comments&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11'&gt;
+                        &lt;description&gt;Organizer checks data&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/privatecomments/35.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
</ins><span class="cx">         &lt;end&gt;
</span><span class="cx">                 &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
</span><span class="cx">                         &lt;method&gt;DELETEALL&lt;/method&gt;
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharingcreatexml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-create.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">  limitations under the License.
</span><span class="cx">  --&gt;
</span><span class="cx"> 
</span><del>-&lt;caldavtest ignore-all='yes'&gt;
</del><ins>+&lt;caldavtest&gt;
</ins><span class="cx">         &lt;description&gt;Test calendar sharing replies&lt;/description&gt;
</span><span class="cx"> 
</span><span class="cx">         &lt;require-feature&gt;
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestsCalDAVsharinginvitesxml"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CalDAV/sharing-invites.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -526,10 +526,6 @@
</span><span class="cx">                         &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
</span><span class="cx">                                 &lt;method&gt;DELETE&lt;/method&gt;
</span><span class="cx">                                 &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
</span><del>-                                &lt;data substitutions='yes'&gt;
-                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
-                                        &lt;filepath&gt;Resource/CalDAV/sharing/invites/double/5.xml&lt;/filepath&gt;
-                                &lt;/data&gt;
</del><span class="cx">                                 &lt;verify&gt;
</span><span class="cx">                                         &lt;callback&gt;statusCode&lt;/callback&gt;
</span><span class="cx">                                 &lt;/verify&gt;
</span></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcachexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcachexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-cache.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-cache.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,412 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest ignore-all='yes'&gt;
+        &lt;description&gt;Test calendar sharing interaction with cache&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Generate invite' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Create&lt;/description&gt;
+                        &lt;request end-delete=&quot;yes&quot;&gt;
+                                &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home to cache it&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;user02&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;contains&lt;/name&gt;
+                                                &lt;value&gt;puser02&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;POST uninvite&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;puser02&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Send first reply'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Delete shared&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;nohrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED - need to do this cycle of accept/delete twice to regress properly&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;Delete shared&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND Home check&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;nohrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcalendarsxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcalendarsxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-calendars.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-calendars.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,574 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing calendars&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Read-write calendar'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{DAV:}collection&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:caldav}calendar&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4a'&gt;
+                        &lt;description&gt;Shared calendar exists Depth:1&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;parent&lt;/name&gt;
+                                                &lt;value&gt;$multistatus-response-prefix:[^{DAV:}href=$sharedcalendar:/]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}resourcetype/{DAV:}collection&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:caldav}calendar&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4b'&gt;
+                        &lt;description&gt;Shared calendar has invite property&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}invite&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}organizer/{http://calendarserver.org/ns/}common-name[=$username1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{DAV:}href[=$pcuaddrurn2:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{http://calendarserver.org/ns/}access/{http://calendarserver.org/ns/}read-write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}invite/{http://calendarserver.org/ns/}user/{http://calendarserver.org/ns/}invite-accepted&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Original calendar unchanged&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharee creates event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharer sees event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharer changes event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9'&gt;
+                        &lt;description&gt;Sharee sees changed event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11'&gt;
+                        &lt;description&gt;Sharee sees new event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12'&gt;
+                        &lt;description&gt;Sharee changes event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13'&gt;
+                        &lt;description&gt;Sharer sees changed event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Default calendar cannot be shared calendar' ignore='no'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Set property on Inbox&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pinboxpath2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/defaultcalendar/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Verify property on inbox&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pinboxpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/defaultcalendar/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;&lt;![CDATA[{urn:ietf:params:xml:ns:caldav}schedule-default-calendar-URL$&lt;href xmlns=&quot;DAV:&quot;&gt;$pcalendarpath2:&lt;/href&gt;]]&gt;&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Change to read-only calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-ro-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-only/1.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Create event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-only/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/4.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-only/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharee sees new event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/4.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-only/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharee cannot change event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/4.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-only/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingcreatexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingcreatexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-create.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-create.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,220 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing replies&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Create calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request end-delete=&quot;yes&quot;&gt;
+                                &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Change the color&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/direct/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{http://apple.com/ns/ical/}calendar-color&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Generate invite' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Accept' ignore='no'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Check accept status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationreply2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Shared calendar exists without color&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/direct/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badprops&lt;/name&gt;
+                                                &lt;value&gt;{http://apple.com/ns/ical/}calendar-color&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdirectxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingdirectxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-direct.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-direct.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,762 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing calendars&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request print-response='no'&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Read-write calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Add puser02 as read write for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/direct/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Sharee does direct share&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/?action=share&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;pause/&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Original calendar unchanged&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}opaque&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee creates event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharer sees event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharer changes event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharee sees changed event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10'&gt;
+                        &lt;description&gt;Sharee sees new event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11'&gt;
+                        &lt;description&gt;Sharee changes event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12'&gt;
+                        &lt;description&gt;Sharer sees changed event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/calendars/read-write/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13'&gt;
+                        &lt;description&gt;Sharee does direct share again&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/?action=share&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='14'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Change to read-only calendar' ignore='yes'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Clear user02 as read-write proxy for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Add user02 as read-only for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-read/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Create event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/4.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/6.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharee sees new event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/4.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/calendars/read-only/6.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharee cannot change event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/4.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/7.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Removal of direct share' ignore='yes'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Remove direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Shared calendar does not exist&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharer calendar does exist&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-only/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;3&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Direct share not allowed' ignore='yes'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Clear user02 as read-only proxy for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-read/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Sharee does direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/?action=share&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Using non __uids__ path' ignore='yes'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Add user02 as read write for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Sharee does direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhomealt1:/shared/?action=share&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-write/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp/{urn:ietf:params:xml:ns:caldav}transparent&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee creates event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/9.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/calendars/read-write/9.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharer sees event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/9.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/calendars/read-write/9.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Remove direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Clear user02 as read-write proxy for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Calendar color' ignore='yes'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Add user02 as read write for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Change the color&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhomealt1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/direct/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{http://apple.com/ns/ical/}calendar-color&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee does direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhomealt1:/shared/?action=share&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Shared calendar exists with color&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/direct/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://apple.com/ns/ical/}calendar-color[=#00112233]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;Remove direct share&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Clear user02 as read-write proxy for user01&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$principal1:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/calendaruserproxy/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end/&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingdropboxxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingdropboxxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-dropbox.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-dropbox.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,323 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest ignore-all=&quot;no&quot;&gt;
+        &lt;description&gt;Test Quota support on the server for shared calendars&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;dropbox&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath4:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome2:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Setup two sharees'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome2:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite234.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee 2 notification collection&lt;/description&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid23:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl23:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee 2 replies ACCEPTED&lt;/description&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome3:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply23.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Check Sharee 3 notification collection&lt;/description&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath4:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath4:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid24:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl24:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee 3 replies ACCEPTED&lt;/description&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome4:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply24.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Clean out notifications&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath4:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='PUT by User 2' ignore='no'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;PUT event by user 2&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome2:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/dropbox/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;PUT attachment by user 2&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/2.xml&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/dropbox/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;Attachment exists for User 2&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Attachment exists for User 3&lt;/description&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;PUT attachment by user 3&lt;/description&gt;
+                        &lt;request user=&quot;$userid3:&quot; pswd=&quot;$pswd3:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/3.xml&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/dropbox/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Attachments exists for User 4&lt;/description&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;PUT attachment by user 4&lt;/description&gt;
+                        &lt;request user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/3.xml&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/dropbox/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;DELETE attachment by user 2&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/2.xml&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9'&gt;
+                        &lt;description&gt;DELETE attachment by user 2&lt;/description&gt;
+                        &lt;request user=&quot;$userid2:&quot; pswd=&quot;$pswd2:&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$dropboxpath2:/54E181BC7CCC373042B28842/3.xml&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$notificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$notificationpath3:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$notificationpath4:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingfreebusyxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingfreebusyxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-freebusy.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-freebusy.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,419 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest ignore-all='no'&gt;
+        &lt;description&gt;Test calendar sharing per-user data&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharinginvite23-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;GETNEW&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                        &lt;data substitutions='yes'&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;GETNEW&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                &lt;variable&gt;$inviteuid3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$hosturl3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$pcalendarhome3:/&lt;/ruri&gt;
+                        &lt;data substitutions='yes'&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharingreply3-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$sharedcalendar3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$sharedcalendar3:/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Initial event'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;User01 store to shared&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;User01 freebusy&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$outboxpath1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;User02 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;User03 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath3:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.0:T230000Z/$now.1:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Changed event'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;User02 store to shared&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/1.ics&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;User01 freebusy&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$outboxpath1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;User02 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;User03 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath3:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/freebusy/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.1:T230000Z/$now.2:T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharinginvitesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharinginvitesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-invites.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-invites.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,575 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing invitations&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared3/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Send new invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Notification type property&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/notificationtype.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}notificationtype/{http://calendarserver.org/ns/}invite-notification[@shared-type=&quot;calendar&quot;]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Update new invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-ro-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2-ro.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Notification type property&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/notificationtype.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{http://calendarserver.org/ns/}notificationtype/{http://calendarserver.org/ns/}invite-notification[@shared-type=&quot;calendar&quot;]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Uninvite new invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Attempt broken invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/invites/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;424&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;403&lt;/name&gt;
+                                                &lt;value&gt;mailto:bogus@example.net&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Delete new invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;DELETE collection&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Uninvite invalid invite'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request end-delete=&quot;yes&quot;&gt;
+                                &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST valid invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;POST single invalid uninvitate&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/invites/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;POST invalid and valid uninvitate&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/invites/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;200&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;403&lt;/name&gt;
+                                                &lt;value&gt;mailto:bogus@example.com&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;DELETE collection&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Double invites'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation #2&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2-2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;POST invitation #3&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;DELAY&lt;/method&gt;
+                                &lt;ruri&gt;1&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared3/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 2&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2-3.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED #2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharee deletes shared calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Remove invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;Remove invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared3/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmovesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingmovesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-moves.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-moves.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,546 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest ignore-all='no'&gt;
+        &lt;description&gt;Test calendar sharing and MOVE&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request print-response='no'&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharinginvite2.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;GETNEW&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                        &lt;data substitutions='yes'&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharingreply2.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='OK event to shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User02 store to personal calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 moves event to shared calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/1.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$sharedcalendar2:/1.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        
+        &lt;test-suite name='Bad event to shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User02 store to personal calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; end-delete=&quot;yes&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 moves event to shared calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/2.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$sharedcalendar2:/2.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='OK event from shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 moves event from shared calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/3.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarpath2:/3.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath2:/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees no event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        
+        &lt;test-suite name='Bad event to shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared calendar&lt;/description&gt;
+                        &lt;request end-delete=&quot;yes&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/4.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 moves event from shared calendar&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/4.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarpath2:/4.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='OK owner event to shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to personal calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/5.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 moves event to shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/5.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarhome1:/shared/5.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/5.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/5.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/5.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        
+        &lt;test-suite name='OK owner event with organizer to shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to personal calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/6.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/6.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 moves event to shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/6.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarhome1:/shared/6.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/6.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/6.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/6.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/6.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/6.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='OK owner event from shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/7.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/7.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 moves event from shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/7.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarpath1:/7.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 does not see event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/7.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/7.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/7.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/7.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        
+        &lt;test-suite name='OK owner event with organizer from shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/8.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/moves/8.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 moves event from shared calendar&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;MOVE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/8.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Destination&lt;/name&gt;
+                                        &lt;value&gt;$host:$calendarpath1:/8.ics&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 does not see event&lt;/description&gt;
+                        &lt;request user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/8.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/8.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/moves/8.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/8.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingmultiplexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingmultiplexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-multiple.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-multiple.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,429 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing invitations&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared1/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Send new invite #1'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Initial collection count&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabcount&gt;$calendarhome2count:&lt;/grabcount&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared1/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;One more calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;$calendarhome2count:+1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;One more calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Send new invite #2'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Initial collection count&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabcount&gt;$calendarhome2count:&lt;/grabcount&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 2&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;One more calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;$calendarhome2count:+1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;One more calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Uninvite #2'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Initial collection count&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabcount&gt;$calendarhome2count:&lt;/grabcount&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared2/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;One less calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;$calendarhome2count:-1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;One less calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Existing calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingnotificationsyncxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingnotificationsyncxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-notification-sync.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-notification-sync.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1410 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing calendars&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+                &lt;feature&gt;sync-report&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request print-response='no'&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='initial tokens - depth 1' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Read-write calendar - depth 1' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;new resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}response/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$href2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Remove notification&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;new resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$href2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='initial tokens - depth infinity' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;require-feature&gt;
+                                &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                        &lt;/require-feature&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$dropbox:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;require-feature&gt;
+                                &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                        &lt;/require-feature&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$dropbox:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Read-write calendar - depth infinity - sharee delete'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;new resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;graburi&gt;basename($notification2:)&lt;/graburi&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Remove notification&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;deleted resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/$notification2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;new calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharee removes calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;removed calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Read-write calendar - depth infinity - sharer removes'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;new resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;graburi&gt;basename($notification2:)&lt;/graburi&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Remove notification&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;deleted resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/$notification2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;new calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;removed calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;no calendar change&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;totalcount&lt;/name&gt;
+                                                &lt;value&gt;0&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Shared calendar data - depth infinity'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/notification-sync/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;new resource&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Remove notification&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;new calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Grab sharer's sync token'&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharer creates event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/notification-sync/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;Sharer change&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;shared/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;Sharee change&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11'&gt;
+                        &lt;description&gt;Sharee creates event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/3.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/notification-sync/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12' ignore='no'&gt;
+                        &lt;description&gt;Sharer change&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;shared/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13' ignore='no'&gt;
+                        &lt;description&gt;Sharee change&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='14'&gt;
+                        &lt;description&gt;Sharer deletes event&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/3.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='15' ignore='no'&gt;
+                        &lt;description&gt;Sharer change&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='16' ignore='no'&gt;
+                        &lt;description&gt;Sharee change&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='17'&gt;
+                        &lt;description&gt;Sharee deletes event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='18' ignore='no'&gt;
+                        &lt;description&gt;Sharer change&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='19' ignore='no'&gt;
+                        &lt;description&gt;Sharee change&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='20'&gt;
+                        &lt;description&gt;Sharee removes calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='21' ignore='no'&gt;
+                        &lt;description&gt;removed calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Response cache' ignore='no'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of current sync-token - direct&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;$verify-property-prefix:/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;contains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home again - to cache it&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;contains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home - token changed&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of new sync-token - direct&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;$verify-property-prefix:/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;contains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home again - to cache it&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;contains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9'&gt;
+                        &lt;description&gt;Remove notification&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of home - token changed&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/sync-token.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;dataString&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notcontains&lt;/name&gt;
+                                                &lt;value&gt;$synctoken1:&lt;/value&gt;
+                                                &lt;value&gt;$synctoken2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserdataxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingperuserdataxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-peruser-data.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-data.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,711 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest ignore-all='no'&gt;
+        &lt;description&gt;Test calendar sharing per-user data&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request print-response='no'&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharinginvite23-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;GETNEW&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                        &lt;data substitutions='yes'&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$sharedcalendar2:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                        &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                        &lt;method&gt;GETNEW&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                &lt;variable&gt;$inviteuid3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$hosturl3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                        &lt;method&gt;POST&lt;/method&gt;
+                        &lt;ruri&gt;$pcalendarhome3:/&lt;/ruri&gt;
+                        &lt;data substitutions='yes'&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/POST/sharingreply3-pod.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;grabelement&gt;
+                                &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                &lt;variable&gt;$sharedcalendar3:&lt;/variable&gt;
+                        &lt;/grabelement&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Initial event' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/simple-put/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-put/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-put/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='User01 changed event' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/simple-change01/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-change01/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-change01/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='User02 changed event' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User02 store to shared&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/simple-change02/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-change02/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/simple-change02/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Different freebusy' ignore='no'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Set properties on new calendars&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 freebusy&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$outboxpath1:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User02 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;User03 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath3:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='User01 complex recurring store' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 store to shared&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/complex-put/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/complex-put/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/complex-put/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='User02 complex recurring store' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User02 store to shared&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar2:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/complex-change02/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 sees event&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/complex-change02/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 sees event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar3:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/peruser-data/complex-change02/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Complex freebusy' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 freebusy&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$outboxpath1:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User02 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User03 freebusy&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$poutboxpath3:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/peruser-data/simple-freebusy/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$cuaddr1:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr2:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;postFreeBusy&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;attendee&lt;/name&gt;
+                                                &lt;value&gt;$pcuaddr3:&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;busy&lt;/name&gt;
+                                                &lt;value&gt;$now.year.1:0101T130000Z/$now.year.1:0101T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0101T230000Z/$now.year.1:0102T000000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0102T130000Z/$now.year.1:0102T140000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0103T140000Z/$now.year.1:0103T150000Z&lt;/value&gt;
+                                                &lt;value&gt;$now.year.1:0104T130000Z/$now.year.1:0104T140000Z&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Prevent per-user data injection' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;User01 new event with injected per-user data&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; end-delete=&quot;yes&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/inject/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}valid-calendar-data&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;User01 new event with valid data&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; end-delete=&quot;yes&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/inject/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;User01 existing event with injected per-user data&lt;/description&gt;
+                        &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarpath1:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-data/inject/3.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}valid-calendar-data&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingperuserpropertiesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingperuserpropertiesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-peruser-properties.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,394 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test per-user WebDAV properties&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Read-write calendar'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;PROPPATCH of displayname before share&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$Changed Name #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;PROPPATCH of calendar-description before share&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$sharedcalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Shared calendar exists&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/calendars/read-write/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}resourcetype/{http://calendarserver.org/ns/}shared&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;notexists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='prop patches - non-global' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of shared displayname&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$The Shared Calendar&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;PROPPATCH of displayname&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$Shared Name #2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of shared displayname&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/nonglobal/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$Changed Name #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='prop patches - shadowable' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of shared calendar-description&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;PROPPATCH of calendar-description&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description$Sharee Description #2&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;PROPFIND of shared calendar-description&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/peruser-properties/shadowable/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{urn:ietf:params:xml:ns:caldav}calendar-description$Description #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingpropfindxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingpropfindxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-propfind.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-propfind.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,371 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/1.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/2.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/3.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/3.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/4.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/4.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/5.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/5.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Set up share'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($shareecalendar2:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendarpath2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='regular home prop finds'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=0&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=1&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$calendar:/&lt;/value&gt;
+                                                &lt;value&gt;$shareecalendar2:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=infinity&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;infinity&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}propfind-finite-depth&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='regular calendar prop finds'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=0&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=1&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;&lt;/value&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                                &lt;value&gt;5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=infinity&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;infinity&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}propfind-finite-depth&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='regular calendar resource prop finds'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=0&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/1.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}creationdate&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}getcontenttype&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}getetag&lt;/value&gt;
+                                                &lt;value&gt;$verify-property-prefix:/{DAV:}getlastmodified&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=1&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/1.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;PROPFIND of basic properties depth=infinity&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/1.ics&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;infinity&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/props.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;prepostcondition&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;error&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}propfind-finite-depth&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingproxiesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingproxiesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-proxies.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-proxies.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,569 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing with proxies&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+                &lt;feature&gt;proxy&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$userid4:&quot; pswd=&quot;$pswd4:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Setup proxies' ignore=&quot;no&quot;&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Add user03 as read proxy for user02&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pprincipal2:calendar-proxy-read/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Add user04 as write proxy for user02&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pprincipal2:calendar-proxy-write/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}group-member-set&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Set up share'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/Common/POST/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Check accept status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/4.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationreply2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharer adds event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Proxies see calendar and contents'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Read proxy lists calendar home&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Write proxy lists calendar home&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid4:&quot; pswd=&quot;$ppswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;prefix&lt;/name&gt;
+                                                &lt;value/&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$shareecalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Read proxy lists calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Write proxy lists calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid4:&quot; pswd=&quot;$ppswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Proxy data changes'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Read proxy cannot write new data&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/proxies/put/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Read proxy cannot write existing data&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/5.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Write proxy can write new data&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid4:&quot; pswd=&quot;$ppswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/proxies/put/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharer sees new data&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/proxies/put/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee sees new data&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/2.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/proxies/put/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Write proxy can write existing data with per-user alarm&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid4:&quot; pswd=&quot;$ppswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/proxies/put/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7'&gt;
+                        &lt;description&gt;Sharer sees new data without alarm&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/proxies/put/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharee sees new data with alarm&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/proxies/put/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Proxy property changes'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Read proxy cannot write properties&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/proxies/properties/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;403&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Write proxy can write properties&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid4:&quot; pswd=&quot;$ppswd4:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/proxies/properties/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;Sharer sees original displayname&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/displayname.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Sharee sees new displayname&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/displayname.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$Changed Name #1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath4:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$pprincipal2:calendar-proxy-read/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/3.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response=&quot;no&quot;&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$pprincipal2:calendar-proxy-write/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV-pod/sharing/proxies/setupproxies/3.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingrepliesxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingrepliesxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-replies.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-replies.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,286 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing replies&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Send first reply'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/Common/POST/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Check accept status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/replies/accept/1.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationreply2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Check sharee calendar displyname/shared-url&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/replies/accept/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindValues&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$The Shared Calendar&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}sharedurl$$calendarhome1:/shared&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Check sharer calendar displyname&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/displayname.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname$shared&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Update reply'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Sharee replies DECLINED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingdecline2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Check declined status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/replies/decline/1.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationdecline2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingreportsmultigetxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingreportsmultigetxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-reports-multiget.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,730 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/MKCALENDAR/vtodo.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/1.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/2.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/2.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/3.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/3.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/4.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/4.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/5.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/5.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/6.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/6.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/7.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/7.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/8.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/8.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/9.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/9.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/10.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/10.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/11.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/11.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/12.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/12.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/13.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/13.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/14.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/14.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;exclude-feature&gt;
+                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                        &lt;/exclude-feature&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/15.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/15.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/18.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/18.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/19.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/19.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/20.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/20.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/21.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/21.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/22.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/22.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/27.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/27.ics&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/101.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/101.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/102.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/102.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/103.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/103.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/104.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/104.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/105.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/105.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+                &lt;request&gt;
+                        &lt;method&gt;PUT&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared-tasks/106.ics&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/CalDAV/reports/put/106.txt&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Set up share'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($shareecalendar2:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendarpath2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared-tasks/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;WAITCOUNT 2&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($shareetasks2:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareetaskspath2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='multiget reports' ignore='no'&gt;
+                &lt;test name='1a' ignore='no'&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and entire ics data&lt;/description&gt;
+                        &lt;pause/&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;exclude-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/exclude-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;require-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/require-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;pause/&gt;
+                &lt;/test&gt;
+                &lt;test name='1b' ignore='no'&gt;
+                        &lt;require-feature&gt;
+                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                        &lt;/require-feature&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and entire ics data&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareetaskspath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/1b.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and only VCALENDAR property data (no embedded components)&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/2.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and only VTIMEZONE components&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4a' ignore='no'&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and only SUMMARY/UID properties inside VEVENT components and VALARMs&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/4.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;exclude-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/exclude-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;require-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/require-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4b' ignore='no'&gt;
+                        &lt;require-feature&gt;
+                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                        &lt;/require-feature&gt;
+                        &lt;description&gt;basic multiget of 4 resources returning etag and only SUMMARY/UID properties inside VEVENT components and VALARMs&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareetaskspath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/4b.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5a' ignore='no'&gt;
+                        &lt;description&gt;as 4.xml except that the SUMMARY property value is not returned&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/5.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;exclude-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/exclude-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;require-feature&gt;
+                                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                                        &lt;/require-feature&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5b' ignore='no'&gt;
+                        &lt;require-feature&gt;
+                                &lt;feature&gt;split-calendars&lt;/feature&gt;
+                        &lt;/require-feature&gt;
+                        &lt;description&gt;as 4.xml except that the SUMMARY property value is not returned&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareetaskspath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/5b.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;101.ics&lt;/value&gt;
+                                                &lt;value&gt;102.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Does allprop&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/6.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Does propname&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/7.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                                &lt;value&gt;2.ics&lt;/value&gt;
+                                                &lt;value&gt;3.ics&lt;/value&gt;
+                                                &lt;value&gt;4.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;Single non-existent query&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendarpath2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/multiget/8.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;bogus-resource.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;$verify-bad-response:[*404]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingsyncxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingsyncxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-sync.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-sync.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1810 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing and cached home sync tokens&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+                &lt;feature&gt;sync-report&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+                &lt;request print-response='no'&gt;
+                        &lt;method&gt;PROPPATCH&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;data&gt;
+                                &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                &lt;filepath&gt;Resource/Common/PROPPATCH/calendar-transp-opaque.xml&lt;/filepath&gt;
+                        &lt;/data&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Read-write calendar'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;Initial sync tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($sharedcalendar:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;Updated tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token3-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token4-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token5-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken6:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Sharee creates event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/sync/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Updated tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;shared/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token3-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token4-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token5-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token6-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken6:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8'&gt;
+                        &lt;description&gt;Sharer changes event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/sync/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;Updated tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                                &lt;value&gt;shared/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token3-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token4-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token5-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token6-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken6:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10'&gt;
+                        &lt;description&gt;Sharee deletes event&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/1.ics&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11' ignore='no'&gt;
+                        &lt;description&gt;Updated tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token3-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token4-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token5-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token6-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken6:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12'&gt;
+                        &lt;description&gt;Sharer unshares&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13' ignore='no'&gt;
+                        &lt;description&gt;Updated tokens&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token3-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token4-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken4:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token5-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$notification:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken5:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token6-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+
+        &lt;test-suite name='calendar webdav property change - home depth:infinity' ignore='no'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation and accept&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($sharedcalendar:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$calendar:/&lt;/value&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$calendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Change a property by user 1&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/17.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Remove a property by user 1&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/18.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;Change a property by user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/17.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13' ignore='no'&gt;
+                        &lt;description&gt;Remove a property by user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/18.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='14' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='15' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-infinite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;badhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='16'&gt;
+                        &lt;description&gt;Sharer unshares&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='calendar webdav property change - home depth:1' ignore='no'&gt;
+                &lt;require-feature&gt;
+                        &lt;feature&gt;sync-report-home&lt;/feature&gt;
+                &lt;/require-feature&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation and accept&lt;/description&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;basename($sharedcalendar:)&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                        &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                                &lt;method&gt;DELETEALL&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$calendar:/&lt;/value&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;initial query - grab token for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-init-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$calendar:/&lt;/value&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;ignoremissing&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Change a property by user 1&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/17.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='7' ignore='no'&gt;
+                        &lt;description&gt;Remove a property by user 1&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/18.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='8' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;shared/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='9' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='10' ignore='no'&gt;
+                        &lt;description&gt;Change a property by user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/17.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='11' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='12' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='13' ignore='no'&gt;
+                        &lt;description&gt;Remove a property by user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/$sharedcalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/vcard; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/reports/sync/18.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='14' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 1&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token1-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[$synctoken1:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken1:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='15' ignore='no'&gt;
+                        &lt;description&gt;Sync for user 2&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;REPORT&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/REPORT/sync-token2-level-1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okhrefs&lt;/name&gt;
+                                                &lt;value&gt;$sharedcalendar:/&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlElementMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;exists&lt;/name&gt;
+                                                &lt;value&gt;/{DAV:}multistatus/{DAV:}sync-token[!$synctoken2:]&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;/{DAV:}multistatus/{DAV:}sync-token&lt;/name&gt;
+                                        &lt;variable&gt;$synctoken2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='16'&gt;
+                        &lt;description&gt;Sharer unshares&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingremove2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+        
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingunsharexmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingunsharexml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-unshare.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-unshare.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,500 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test calendar sharing unshare/delete behavior&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Set up share' ignore=&quot;no&quot;&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/Common/POST/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Check accept status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/invited2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationreply2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+        
+        &lt;test-suite name='Delete' ignore=&quot;no&quot;&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;Sharer adds event&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/unshare/shareedelete/1.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2' ignore='no'&gt;
+                        &lt;description&gt;Sharee deletes shared calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;DELETE&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;infinity&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3' ignore='no'&gt;
+                        &lt;description&gt;No more shared calendar&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/resourcetype.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;status&lt;/name&gt;
+                                                &lt;value&gt;404&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Sharer still has calendar data&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;1&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/count.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;multistatusItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;count&lt;/name&gt;
+                                                &lt;value&gt;1&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='Reshare after sharee DELETE shared calendar' ignore='no'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationinvite2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/Common/POST/sharedas.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4' ignore='no'&gt;
+                        &lt;description&gt;Check accept status&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;PROPFIND&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;header&gt;
+                                        &lt;name&gt;Depth&lt;/name&gt;
+                                        &lt;value&gt;0&lt;/value&gt;
+                                &lt;/header&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/PROPFIND/invite.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/invited2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Check Sharer notification collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/common/notificationreply2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+
+        &lt;test-suite name='Invite, display name change, uninvite' ignore=&quot;no&quot;&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/1.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/2.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome3:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/3.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/4.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}href&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Sharee changes name&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;PROPPATCH&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar:/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/5.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;propfindItems&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;okprops&lt;/name&gt;
+                                                &lt;value&gt;{DAV:}displayname&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5' ignore='no'&gt;
+                        &lt;description&gt;POST uninvitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/6.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;Check Sharee notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;xmlDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV-pod/sharing/unshare/shareruninvite/7.xml&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filter&lt;/name&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}dtstamp&lt;/value&gt;
+                                                &lt;value&gt;{http://calendarserver.org/ns/}uid&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterscriptstestspodCalDAVsharingwebcalxmlfromrev12132CalDAVTestertrunkscriptstestspodCalDAVsharingwebcalxml"></a>
<div class="copfile"><h4>Copied: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml (from rev 12132, CalDAVTester/trunk/scripts/tests-pod/CalDAV/sharing-webcal.xml) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml                                (rev 0)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests-pod/CalDAV/sharing-webcal.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,498 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&gt;
+
+&lt;!DOCTYPE caldavtest SYSTEM &quot;caldavtest.dtd&quot;&gt;
+
+&lt;!--
+ Copyright (c) 2006-2013 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+ 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 &quot;AS IS&quot; 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.
+ --&gt;
+
+&lt;caldavtest&gt;
+        &lt;description&gt;Test internet calendar subscription behavior with sharing&lt;/description&gt;
+
+        &lt;require-feature&gt;
+                &lt;feature&gt;caldav&lt;/feature&gt;
+                &lt;feature&gt;webcal&lt;/feature&gt;
+                &lt;feature&gt;shared-calendars&lt;/feature&gt;
+        &lt;/require-feature&gt;
+
+        &lt;start&gt;
+                &lt;request user=&quot;$userid1:&quot; pswd=&quot;$pswd1:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request end-delete=&quot;yes&quot;&gt;
+                        &lt;method&gt;MKCALENDAR&lt;/method&gt;
+                        &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                        &lt;verify&gt;
+                                &lt;callback&gt;statusCode&lt;/callback&gt;
+                        &lt;/verify&gt;
+                &lt;/request&gt;
+        &lt;/start&gt;
+        
+        &lt;test-suite name='Setup two sharees'&gt;
+                &lt;test name='1' ignore='no'&gt;
+                        &lt;description&gt;POST invitation&lt;/description&gt;
+                        &lt;request print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharinginvite23-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;Check Sharee 2 notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;Sharee 2 replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome2:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply2-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar2:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;Check Sharee 3 notification collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;WAITCOUNT 1&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                        &lt;/request&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;GETNEW&lt;/method&gt;
+                                &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid&lt;/name&gt;
+                                        &lt;variable&gt;$inviteuid3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}hosturl/{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$hosturl3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;Sharee 3 replies ACCEPTED&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot; print-response='no'&gt;
+                                &lt;method&gt;POST&lt;/method&gt;
+                                &lt;ruri&gt;$pcalendarhome3:/&lt;/ruri&gt;
+                                &lt;data substitutions='yes'&gt;
+                                        &lt;content-type&gt;application/xml; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/Common/POST/sharingreply3-pod.xml&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;grabelement&gt;
+                                        &lt;name&gt;{DAV:}href&lt;/name&gt;
+                                        &lt;variable&gt;$shareecalendar3:&lt;/variable&gt;
+                                &lt;/grabelement&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='GET on empty calendar collection'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;GET on empty calendar collection&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;GET on empty calendar collection - 2nd time from cache&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;GET on empty calendar collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;GET on empty calendar collection - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;GET on empty calendar collection&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;GET on empty calendar collection - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/1.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='GET on calendar collection after initial PUT'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/1.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/webcal/rolled/2.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/2.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;GET on calendar collection after initial PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/3.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;test-suite name='GET on calendar collection after sharee PUT'&gt;
+                &lt;test name='1'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;PUT&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/2.ics&lt;/ruri&gt;
+                                &lt;data&gt;
+                                        &lt;content-type&gt;text/calendar; charset=utf-8&lt;/content-type&gt;
+                                        &lt;filepath&gt;Resource/CalDAV/sharing/webcal/rolled/4.ics&lt;/filepath&gt;
+                                &lt;/data&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='2'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request print-response=&quot;no&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$calendarhome1:/shared/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/5.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='3'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/6.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='4'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid2:&quot; pswd=&quot;$ppswd2:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar2:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/6.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='5'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/7.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+                &lt;test name='6'&gt;
+                        &lt;description&gt;GET on calendar collection after sharee PUT - 2nd time from cache&lt;/description&gt;
+                        &lt;request host2=&quot;yes&quot; user=&quot;$puserid3:&quot; pswd=&quot;$ppswd3:&quot;&gt;
+                                &lt;method&gt;GET&lt;/method&gt;
+                                &lt;ruri&gt;$shareecalendar3:/&lt;/ruri&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;statusCode&lt;/callback&gt;
+                                &lt;/verify&gt;
+                                &lt;verify&gt;
+                                        &lt;callback&gt;calendarDataMatch&lt;/callback&gt;
+                                        &lt;arg&gt;
+                                                &lt;name&gt;filepath&lt;/name&gt;
+                                                &lt;value&gt;Resource/CalDAV/sharing/webcal/rolled/7.ics&lt;/value&gt;
+                                        &lt;/arg&gt;
+                                &lt;/verify&gt;
+                        &lt;/request&gt;
+                &lt;/test&gt;
+        &lt;/test-suite&gt;
+
+        &lt;end&gt;
+                &lt;request user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$notificationpath1:/&lt;/ruri&gt;
+                &lt;/request&gt;
+                &lt;request host2=&quot;yes&quot; user=&quot;$useradmin:&quot; pswd=&quot;$pswdadmin:&quot;&gt;
+                        &lt;method&gt;DELETEALL&lt;/method&gt;
+                        &lt;ruri&gt;$pnotificationpath2:/&lt;/ruri&gt;
+                        &lt;ruri&gt;$pnotificationpath3:/&lt;/ruri&gt;
+                &lt;/request&gt;
+        &lt;/end&gt;
+
+&lt;/caldavtest&gt;
</ins></span></pre></div>
<a id="CalDAVTesterbranchesusersgayasharedgroupfixestesterverifiersmultistatusItemspy"></a>
<div class="modfile"><h4>Modified: CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/verifiers/multistatusItems.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -47,9 +47,9 @@
</span><span class="cx">             prefix = prefix[0] if prefix[0] != &quot;-&quot; else &quot;&quot;
</span><span class="cx">         else:
</span><span class="cx">             prefix = uri
</span><del>-        okhrefs = [prefix + i for i in okhrefs]
-        nohrefs = [prefix + i for i in nohrefs]
-        badhrefs = [prefix + i for i in badhrefs]
</del><ins>+        okhrefs = [(prefix + i).rstrip(&quot;/&quot;) for i in okhrefs]
+        nohrefs = [(prefix + i).rstrip(&quot;/&quot;) for i in nohrefs]
+        badhrefs = [(prefix + i).rstrip(&quot;/&quot;) for i in badhrefs]
</ins><span class="cx">         for k, v in args.items():
</span><span class="cx">             v = [prefix + i for i in v]
</span><span class="cx">             args[k] = v
</span><span class="lines">@@ -86,7 +86,7 @@
</span><span class="cx">             href = response.findall(&quot;{DAV:}href&quot;)
</span><span class="cx">             if href is None or len(href) != 1:
</span><span class="cx">                 return False, &quot;        Incorrect/missing DAV:Href element in response&quot;
</span><del>-            href = urllib.unquote(href[0].text)
</del><ins>+            href = urllib.unquote(href[0].text).rstrip(&quot;/&quot;)
</ins><span class="cx"> 
</span><span class="cx">             # Verify status
</span><span class="cx">             status = response.findall(&quot;{DAV:}status&quot;)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixes"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/gaya/sharedgroupfixes</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnmergeinfo"></a>
<div class="modfile"><h4>Modified: svn:mergeinfo</h4></div>
<span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">/CalendarServer/trunk:11632-11860,11862-12017
</span><span class="cx">   + /CalDAVTester/trunk:11193-11198
</span><span class="cx">/CalendarServer/branches/config-separation:4379-4443
</span><span class="cx">/CalendarServer/branches/egg-info-351:4589-4625
</span><span class="cx">/CalendarServer/branches/generic-sqlstore:6167-6191
</span><span class="cx">/CalendarServer/branches/new-store:5594-5934
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile:5911-5935
</span><span class="cx">/CalendarServer/branches/new-store-no-caldavfile-2:5936-5981
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-4.3-dev:10180-10190,10192
</span><span class="cx">/CalendarServer/branches/release/CalendarServer-5.1-dev:11846
</span><span class="cx">/CalendarServer/branches/users/cdaboo/batchupload-6699:6700-7198
</span><span class="cx">/CalendarServer/branches/users/cdaboo/cached-subscription-calendars-5692:5693-5702
</span><span class="cx">/CalendarServer/branches/users/cdaboo/component-set-fixes:8130-8346
</span><span class="cx">/CalendarServer/branches/users/cdaboo/directory-cache-on-demand-3627:3628-3644
</span><span class="cx">/CalendarServer/branches/users/cdaboo/fix-no-ischedule:11607-11871
</span><span class="cx">/CalendarServer/branches/users/cdaboo/implicituidrace:8137-8141
</span><span class="cx">/CalendarServer/branches/users/cdaboo/ischedule-dkim:9747-9979
</span><span class="cx">/CalendarServer/branches/users/cdaboo/json:11622-11912
</span><span class="cx">/CalendarServer/branches/users/cdaboo/managed-attachments:9985-10145
</span><span class="cx">/CalendarServer/branches/users/cdaboo/more-sharing-5591:5592-5601
</span><span class="cx">/CalendarServer/branches/users/cdaboo/partition-4464:4465-4957
</span><span class="cx">/CalendarServer/branches/users/cdaboo/performance-tweaks:11824-11836
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pods:7297-7377
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycalendar:7085-7206
</span><span class="cx">/CalendarServer/branches/users/cdaboo/pycard:7227-7237
</span><span class="cx">/CalendarServer/branches/users/cdaboo/queued-attendee-refreshes:7740-8287
</span><span class="cx">/CalendarServer/branches/users/cdaboo/relative-config-paths-5070:5071-5105
</span><span class="cx">/CalendarServer/branches/users/cdaboo/reverse-proxy-pods:11875-11900
</span><span class="cx">/CalendarServer/branches/users/cdaboo/shared-calendars-5187:5188-5440
</span><span class="cx">/CalendarServer/branches/users/cdaboo/sharing-in-the-store:11935-12016
</span><span class="cx">/CalendarServer/branches/users/cdaboo/store-scheduling:10876-11129
</span><span class="cx">/CalendarServer/branches/users/cdaboo/timezones:7443-7699
</span><span class="cx">/CalendarServer/branches/users/cdaboo/txn-debugging:8730-8743
</span><span class="cx">/CalendarServer/branches/users/gaya/sharedgroups-3:11088-11204
</span><span class="cx">/CalendarServer/branches/users/glyph/always-abort-txn-on-error:9958-9969
</span><span class="cx">/CalendarServer/branches/users/glyph/case-insensitive-uid:8772-8805
</span><span class="cx">/CalendarServer/branches/users/glyph/conn-limit:6574-6577
</span><span class="cx">/CalendarServer/branches/users/glyph/contacts-server-merge:4971-5080
</span><span class="cx">/CalendarServer/branches/users/glyph/dalify:6932-7023
</span><span class="cx">/CalendarServer/branches/users/glyph/db-reconnect:6824-6876
</span><span class="cx">/CalendarServer/branches/users/glyph/deploybuild:7563-7572
</span><span class="cx">/CalendarServer/branches/users/glyph/digest-auth-redux:10624-10635
</span><span class="cx">/CalendarServer/branches/users/glyph/disable-quota:7718-7727
</span><span class="cx">/CalendarServer/branches/users/glyph/dont-start-postgres:6592-6614
</span><span class="cx">/CalendarServer/branches/users/glyph/enforce-max-requests:11640-11643
</span><span class="cx">/CalendarServer/branches/users/glyph/hang-fix:11465-11491
</span><span class="cx">/CalendarServer/branches/users/glyph/imip-and-admin-html:7866-7984
</span><span class="cx">/CalendarServer/branches/users/glyph/ipv6-client:9054-9105
</span><span class="cx">/CalendarServer/branches/users/glyph/launchd-wrapper-bis:11413-11436
</span><span class="cx">/CalendarServer/branches/users/glyph/linux-tests:6893-6900
</span><span class="cx">/CalendarServer/branches/users/glyph/log-cleanups:11691-11731
</span><span class="cx">/CalendarServer/branches/users/glyph/migrate-merge:8690-8713
</span><span class="cx">/CalendarServer/branches/users/glyph/misc-portability-fixes:7365-7374
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-6:6322-6368
</span><span class="cx">/CalendarServer/branches/users/glyph/more-deferreds-7:6369-6445
</span><span class="cx">/CalendarServer/branches/users/glyph/multiget-delete:8321-8330
</span><span class="cx">/CalendarServer/branches/users/glyph/new-export:7444-7485
</span><span class="cx">/CalendarServer/branches/users/glyph/one-home-list-api:10048-10073
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle:7106-7155
</span><span class="cx">/CalendarServer/branches/users/glyph/oracle-nulls:7340-7351
</span><span class="cx">/CalendarServer/branches/users/glyph/other-html:8062-8091
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-sim:8240-8251
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade:8376-8400
</span><span class="cx">/CalendarServer/branches/users/glyph/parallel-upgrade_to_1:8571-8583
</span><span class="cx">/CalendarServer/branches/users/glyph/q:9560-9688
</span><span class="cx">/CalendarServer/branches/users/glyph/queue-locking-and-timing:10204-10289
</span><span class="cx">/CalendarServer/branches/users/glyph/quota:7604-7637
</span><span class="cx">/CalendarServer/branches/users/glyph/sendfdport:5388-5424
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-fixes:8436-8443
</span><span class="cx">/CalendarServer/branches/users/glyph/shared-pool-take2:8155-8174
</span><span class="cx">/CalendarServer/branches/users/glyph/sharedpool:6490-6550
</span><span class="cx">/CalendarServer/branches/users/glyph/sharing-api:9192-9205
</span><span class="cx">/CalendarServer/branches/users/glyph/skip-lonely-vtimezones:8524-8535
</span><span class="cx">/CalendarServer/branches/users/glyph/sql-store:5929-6073
</span><span class="cx">/CalendarServer/branches/users/glyph/start-service-start-loop:11060-11065
</span><span class="cx">/CalendarServer/branches/users/glyph/subtransactions:7248-7258
</span><span class="cx">/CalendarServer/branches/users/glyph/table-alias:8651-8664
</span><span class="cx">/CalendarServer/branches/users/glyph/uidexport:7673-7676
</span><span class="cx">/CalendarServer/branches/users/glyph/unshare-when-access-revoked:10562-10595
</span><span class="cx">/CalendarServer/branches/users/glyph/use-system-twisted:5084-5149
</span><span class="cx">/CalendarServer/branches/users/glyph/uuid-normalize:9268-9296
</span><span class="cx">/CalendarServer/branches/users/glyph/warning-cleanups:11347-11357
</span><span class="cx">/CalendarServer/branches/users/glyph/whenNotProposed:11881-11897
</span><span class="cx">/CalendarServer/branches/users/glyph/xattrs-from-files:7757-7769
</span><span class="cx">/CalendarServer/branches/users/sagen/applepush:8126-8184
</span><span class="cx">/CalendarServer/branches/users/sagen/inboxitems:7380-7381
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources:5032-5051
</span><span class="cx">/CalendarServer/branches/users/sagen/locations-resources-2:5052-5061
</span><span class="cx">/CalendarServer/branches/users/sagen/purge_old_events:6735-6746
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4038:4040-4067
</span><span class="cx">/CalendarServer/branches/users/sagen/resource-delegates-4066:4068-4075
</span><span class="cx">/CalendarServer/branches/users/sagen/resources-2:5084-5093
</span><span class="cx">/CalendarServer/branches/users/sagen/testing:10827-10851,10853-10855
</span><span class="cx">/CalendarServer/branches/users/wsanchez/transations:5515-5593
</span><span class="cx">/CalendarServer/trunk:11632-11860,11862-12132
</span><a id="CalendarServerbranchesusersgayasharedgroupfixesbinproxyclean"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/bin/proxyclean        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> except ImportError:
</span><span class="cx">     sys.exc_clear()
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import readPlist
</del><ins>+from plistlib import readPlist
</ins><span class="cx"> 
</span><span class="cx"> try:
</span><span class="cx">     import opendirectory
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesbintrial"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/bin/trial        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><ins>+from __future__ import print_function
+
</ins><span class="cx"> import sys
</span><ins>+import os
</ins><span class="cx"> 
</span><span class="cx"> #PYTHONPATH
</span><span class="cx"> 
</span><span class="lines">@@ -29,5 +32,8 @@
</span><span class="cx">         except ImportError:
</span><span class="cx">             sys.exc_clear()
</span><span class="cx"> 
</span><ins>+    for name, value in os.environ.items():
+        print(&quot;{0}={1}&quot;.format(name, value))
+
</ins><span class="cx">     from twisted.scripts.trial import run
</span><span class="cx">     run()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserver__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,13 +19,10 @@
</span><span class="cx"> CalendarServer application code.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__(&quot;twext&quot;)
-
</del><span class="cx"> #
</span><span class="cx"> # setuptools is annoying
</span><span class="cx"> #
</span><ins>+
</ins><span class="cx"> from warnings import filterwarnings
</span><span class="cx"> filterwarnings(&quot;ignore&quot;, &quot;Module (.*) was already imported (.*)&quot;)
</span><span class="cx"> del filterwarnings
</span><span class="lines">@@ -38,3 +35,11 @@
</span><span class="cx">     from calendarserver.version import version as __version__
</span><span class="cx"> except ImportError:
</span><span class="cx">     __version__ = None
</span><ins>+
+
+#
+# Get imap4 module to STFU
+#
+
+# from twisted.mail.imap4 import Command
+# Command._1_RESPONSES += tuple(['BYE'])
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserveraccesslogpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/accesslog.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -40,9 +40,9 @@
</span><span class="cx">     getAdjustedClientName
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import iweb
-from twext.web2.log import BaseCommonAccessLoggingObserver
-from twext.web2.log import LogWrapperResource
</del><ins>+from txweb2 import iweb
+from txweb2.log import BaseCommonAccessLoggingObserver
+from txweb2.log import LogWrapperResource
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet import protocol, task
</span><span class="cx"> from twisted.protocols import amp
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisionrootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/root.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,11 +20,11 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.xattrprops import xattrPropertyStore
-from twext.web2.http import HTTPError, StatusResponse, RedirectResponse
</del><ins>+from txweb2.dav.xattrprops import xattrPropertyStore
+from txweb2.http import HTTPError, StatusResponse, RedirectResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.cred.error import LoginFailed, UnauthorizedLogin
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx">             self.responseCache = DisabledCache()
</span><span class="cx"> 
</span><span class="cx">         if config.ResponseCompression:
</span><del>-            from twext.web2.filter import gzip
</del><ins>+            from txweb2.filter import gzip
</ins><span class="cx">             self.contentFilters.append((gzip.gzipfilter, True))
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverprovisiontesttest_rootpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/provision/test/test_root.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,15 +19,15 @@
</span><span class="cx"> from twisted.cred.portal import Portal
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, maybeDeferred, returnValue
</span><span class="cx"> 
</span><del>-from twext.web2 import http_headers
-from twext.web2 import responsecode
-from twext.web2 import server
-from twext.web2.auth import basic
-from twext.web2.dav import auth
</del><ins>+from txweb2 import http_headers
+from txweb2 import responsecode
+from txweb2 import server
+from txweb2.auth import basic
+from txweb2.dav import auth
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.iweb import IResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.http import HTTPError
+from txweb2.iweb import IResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverpushapplepushpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/push/applepush.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,12 +18,12 @@
</span><span class="cx"> from twext.internet.ssl import ChainingOpenSSLContextFactory
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.server import parsePOSTData
</del><ins>+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.server import parsePOSTData
</ins><span class="cx"> from twisted.application import service
</span><span class="cx"> from twisted.internet import protocol
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="lines">@@ -888,7 +888,7 @@
</span><span class="cx">         to add a subscription entry to the database.
</span><span class="cx"> 
</span><span class="cx">         @param request: The request to process
</span><del>-        @type request: L{twext.web2.server.Request}
</del><ins>+        @type request: L{txweb2.server.Request}
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         token = request.args.get(&quot;token&quot;, (&quot;&quot;,))[0].replace(&quot; &quot;, &quot;&quot;).lower()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertapcaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -52,15 +52,15 @@
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.protocols.amp import AMP
</span><span class="cx"> 
</span><del>-from twext.web2.server import Site
</del><ins>+from txweb2.server import Site
</ins><span class="cx"> from twext.python.log import Logger, LogLevel, replaceTwistedLoggers
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><span class="cx"> from twext.internet.ssl import ChainingOpenSSLContextFactory
</span><span class="cx"> from twext.internet.tcp import MaxAcceptTCPServer, MaxAcceptSSLServer
</span><span class="cx"> from twext.internet.fswatch import DirectoryChangeListener, IDirectoryChangeListenee
</span><del>-from twext.web2.channel.http import LimitingHTTPFactory, SSLRedirectRequest, \
</del><ins>+from txweb2.channel.http import LimitingHTTPFactory, SSLRedirectRequest, \
</ins><span class="cx">     HTTPChannel
</span><del>-from twext.web2.metafd import ConnectionLimiter, ReportingHTTPService
</del><ins>+from txweb2.metafd import ConnectionLimiter, ReportingHTTPService
</ins><span class="cx"> from twext.enterprise.ienterprise import POSTGRES_DIALECT
</span><span class="cx"> from twext.enterprise.ienterprise import ORACLE_DIALECT
</span><span class="cx"> from twext.enterprise.adbapi2 import ConnectionPool
</span><span class="lines">@@ -119,7 +119,7 @@
</span><span class="cx">     from version import version as getVersion
</span><span class="cx">     version = &quot;%s (%s*)&quot; % getVersion()
</span><span class="cx"> 
</span><del>-from twext.web2.server import VERSION as TWISTED_VERSION
</del><ins>+from txweb2.server import VERSION as TWISTED_VERSION
</ins><span class="cx"> TWISTED_VERSION = &quot;CalendarServer/%s %s&quot; % (
</span><span class="cx">     version.replace(&quot; &quot;, &quot;&quot;), TWISTED_VERSION,
</span><span class="cx"> )
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertaptesttest_caldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/test/test_caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,9 +42,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.python.plistlib import writePlist #@UnresolvedImport
-from twext.web2.dav import auth
-from twext.web2.log import LogWrapperResource
</del><ins>+from plistlib import writePlist #@UnresolvedImport
+from txweb2.dav import auth
+from txweb2.log import LogWrapperResource
</ins><span class="cx"> from twext.internet.tcp import MaxAcceptTCPServer, MaxAcceptSSLServer
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config, ConfigDict, ConfigurationError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertaputilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tap/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,11 +34,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.auth.basic import BasicCredentialFactory
-from twext.web2.dav import auth
-from twext.web2.http_headers import Headers
-from twext.web2.resource import Resource
-from twext.web2.static import File as FileResource
</del><ins>+from txweb2.auth.basic import BasicCredentialFactory
+from txweb2.dav import auth
+from txweb2.http_headers import Headers
+from txweb2.resource import Resource
+from txweb2.static import File as FileResource
</ins><span class="cx"> 
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.cred.portal import Portal
</span><span class="lines">@@ -130,7 +130,7 @@
</span><span class="cx">         databaseName=config.Postgres.DatabaseName,
</span><span class="cx">         clusterName=config.Postgres.ClusterName,
</span><span class="cx">         logFile=config.Postgres.LogFile,
</span><del>-        socketDir=config.RunRoot,
</del><ins>+        socketDir=config.Postgres.SocketDirectory,
</ins><span class="cx">         listenAddresses=config.Postgres.ListenAddresses,
</span><span class="cx">         sharedBuffers=config.Postgres.SharedBuffers,
</span><span class="cx">         maxConnections=config.Postgres.MaxConnections,
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsagentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/agent.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> import socket
</span><span class="cx"> 
</span><span class="cx"> from calendarserver.tap.util import getRootResource
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx"> from twisted.application.internet import StreamServerEndpointService
</span><span class="cx"> from twisted.cred.checkers import ICredentialsChecker
</span><span class="cx"> from twisted.cred.credentials import IUsernameHashedPassword
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsanonymizepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/anonymize.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,7 +31,7 @@
</span><span class="cx"> import xattr
</span><span class="cx"> import zlib
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import readPlistFromString
</del><ins>+from plistlib import readPlistFromString
</ins><span class="cx"> 
</span><span class="cx"> from pycalendar.icalendar.calendar import Calendar
</span><span class="cx"> from pycalendar.parameter import Parameter
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsbackup_pgpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/backup_pg.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> PSQL          = &quot;%s/usr/bin/psql&quot; % (SIPP,)
</span><span class="cx"> PGDUMP        = &quot;%s/usr/bin/pg_dump&quot; % (SIPP,)
</span><del>-PGSOCKETDIR   = &quot;/Library/Server/PostgreSQL For Server Services/Socket&quot;
</del><ins>+PGSOCKETDIR   = &quot;/var/run/caldavd/PostgresSocket&quot;
</ins><span class="cx"> 
</span><span class="cx"> def usage(e=None):
</span><span class="cx">     name = os.path.basename(sys.argv[0])
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/config.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> import sys
</span><span class="cx"> import xml
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx"> from twistedcaldav.config import config, ConfigDict, ConfigurationError, mergeData
</span><span class="cx"> from twistedcaldav.stdconfig import DEFAULT_CONFIG_FILE
</span><span class="cx"> WRITABLE_CONFIG_KEYS = [
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsdkimtoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/dkimtool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,9 +24,9 @@
</span><span class="cx"> from twisted.python.usage import Options
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger, LogLevel, StandardIOObserver
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.http_headers import Headers
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.http_headers import Headers
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from txdav.caldav.datastore.scheduling.ischedule.dkim import RSA256, DKIMRequest, \
</span><span class="cx">     PublicKeyLookup, DKIMVerifier, DKIMVerificationError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsgatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/gateway.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> import sys
</span><span class="cx"> import xml
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import readPlistFromString, writePlistToString
</del><ins>+from plistlib import readPlistFromString, writePlistToString
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryError
</span><span class="lines">@@ -32,7 +32,9 @@
</span><span class="cx">     principalForPrincipalID, proxySubprincipal, addProxy, removeProxy,
</span><span class="cx">     ProxyError, ProxyWarning, autoDisableMemcached
</span><span class="cx"> )
</span><del>-from calendarserver.tools.principals import getProxies, setProxies, updateRecord
</del><ins>+from calendarserver.tools.principals import (
+    getProxies, setProxies, updateRecord, attrMap
+)
</ins><span class="cx"> from calendarserver.tools.purge import WorkerService, PurgeOldEventsService, DEFAULT_BATCH_SIZE, DEFAULT_RETAIN_DAYS
</span><span class="cx"> from calendarserver.tools.cmdline import utilityMain
</span><span class="cx"> 
</span><span class="lines">@@ -140,26 +142,6 @@
</span><span class="cx">     utilityMain(configFileName, RunnerService, verbose=debug)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-attrMap = {
-    'GeneratedUID' : { 'attr' : 'guid', },
-    'RealName' : { 'attr' : 'fullName', },
-    'RecordName' : { 'attr' : 'shortNames', },
-    'Comment' : { 'extras' : True, 'attr' : 'comment', },
-    'Description' : { 'extras' : True, 'attr' : 'description', },
-    'Type' : { 'extras' : True, 'attr' : 'type', },
-    'Capacity' : { 'extras' : True, 'attr' : 'capacity', },
-    'Building' : { 'extras' : True, 'attr' : 'building', },
-    'Floor' : { 'extras' : True, 'attr' : 'floor', },
-    'Street' : { 'extras' : True, 'attr' : 'street', },
-    'City' : { 'extras' : True, 'attr' : 'city', },
-    'State' : { 'extras' : True, 'attr' : 'state', },
-    'ZIP' : { 'extras' : True, 'attr' : 'zip', },
-    'Country' : { 'extras' : True, 'attr' : 'country', },
-    'Phone' : { 'extras' : True, 'attr' : 'phone', },
-    'Geo' : { 'extras' : True, 'attr' : 'geo', },
-    'AutoSchedule' : { 'attr' : 'autoSchedule', },
-    'AutoAcceptGroup' : { 'attr' : 'autoAcceptGroup', },
-}
</del><span class="cx"> 
</span><span class="cx"> class Runner(object):
</span><span class="cx"> 
</span><span class="lines">@@ -218,9 +200,9 @@
</span><span class="cx">             self.respondWithError(&quot;Command failed: '%s'&quot; % (str(e),))
</span><span class="cx">             raise
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     # Locations
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     def command_getLocationList(self, command):
</span><span class="cx">         self.respondWithRecordsOfTypes(self.dir, command, [&quot;locations&quot;])
</span><span class="cx"> 
</span><span class="lines">@@ -266,6 +248,7 @@
</span><span class="cx"> 
</span><span class="cx">     command_getResourceAttributes = command_getLocationAttributes
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def command_setLocationAttributes(self, command):
</span><span class="cx"> 
</span><span class="lines">@@ -306,9 +289,9 @@
</span><span class="cx">             return
</span><span class="cx">         self.respondWithRecordsOfTypes(self.dir, command, [&quot;locations&quot;])
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     # Resources
</span><span class="cx"> 
</span><del>-
</del><span class="cx">     def command_getResourceList(self, command):
</span><span class="cx">         self.respondWithRecordsOfTypes(self.dir, command, [&quot;resources&quot;])
</span><span class="cx"> 
</span><span class="lines">@@ -379,6 +362,67 @@
</span><span class="cx">         self.respondWithRecordsOfTypes(self.dir, command, [&quot;locations&quot;, &quot;resources&quot;])
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    # Addresses
+
+    def command_getAddressList(self, command):
+        self.respondWithRecordsOfTypes(self.dir, command, [&quot;addresses&quot;])
+
+
+    @inlineCallbacks
+    def command_createAddress(self, command):
+        kwargs = {}
+        for key, info in attrMap.iteritems():
+            if key in command:
+                kwargs[info['attr']] = command[key]
+
+        try:
+            yield updateRecord(True, self.dir, &quot;addresses&quot;, **kwargs)
+        except DirectoryError, e:
+            self.respondWithError(str(e))
+            return
+
+        self.respondWithRecordsOfTypes(self.dir, command, [&quot;addresses&quot;])
+
+
+    def command_getAddressAttributes(self, command):
+        guid = command['GeneratedUID']
+        record = self.dir.recordWithGUID(guid)
+        if record is None:
+            self.respondWithError(&quot;Principal not found: %s&quot; % (guid,))
+            return
+        recordDict = recordToDict(record)
+        self.respond(command, recordDict)
+        return succeed(None)
+
+
+    @inlineCallbacks
+    def command_setAddressAttributes(self, command):
+        kwargs = {}
+        for key, info in attrMap.iteritems():
+            if key in command:
+                kwargs[info['attr']] = command[key]
+        try:
+            yield updateRecord(False, self.dir, &quot;addresses&quot;, **kwargs)
+        except DirectoryError, e:
+            self.respondWithError(str(e))
+            return
+
+        yield self.command_getAddressAttributes(command)
+
+
+    def command_deleteAddress(self, command):
+        kwargs = {}
+        for key, info in attrMap.iteritems():
+            if key in command:
+                kwargs[info['attr']] = command[key]
+        try:
+            self.dir.destroyRecord(&quot;addresses&quot;, **kwargs)
+        except DirectoryError, e:
+            self.respondWithError(str(e))
+            return
+        self.respondWithRecordsOfTypes(self.dir, command, [&quot;addresses&quot;])
+
+
</ins><span class="cx">     # Config
</span><span class="cx"> 
</span><span class="cx">     def command_readConfig(self, command):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolsprincipalspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/principals.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -87,8 +87,14 @@
</span><span class="cx">     print(&quot;  --get-auto-schedule-mode: read auto-schedule mode&quot;)
</span><span class="cx">     print(&quot;  --set-auto-accept-group=principal: set auto-accept-group&quot;)
</span><span class="cx">     print(&quot;  --get-auto-accept-group: read auto-accept-group&quot;)
</span><del>-    print(&quot;  --add {locations|resources} 'full name' [record name] [GUID]: add a principal&quot;)
</del><ins>+    print(&quot;  --add {locations|resources|addresses} 'full name' [record name] [GUID]: add a principal&quot;)
</ins><span class="cx">     print(&quot;  --remove: remove a principal&quot;)
</span><ins>+    print(&quot;  --set-geo=url: set the geo: url for an address (e.g. geo:37.331741,-122.030333)&quot;)
+    print(&quot;  --get-geo: get the geo: url for an address&quot;)
+    print(&quot;  --set-street-address=streetaddress: set the street address string for an address&quot;)
+    print(&quot;  --get-street-address: get the street address string for an address&quot;)
+    print(&quot;  --set-address=guid: associate principal with an address (by guid)&quot;)
+    print(&quot;  --get-address: get the associated address's guid&quot;)
</ins><span class="cx"> 
</span><span class="cx">     if e:
</span><span class="cx">         sys.exit(64)
</span><span class="lines">@@ -116,8 +122,29 @@
</span><span class="cx">             directory = rootResource.getDirectory()
</span><span class="cx">             yield self.function(rootResource, directory, self.store, *self.params)
</span><span class="cx"> 
</span><ins>+attrMap = {
+    'GeneratedUID' : { 'attr' : 'guid', },
+    'RealName' : { 'attr' : 'fullName', },
+    'RecordName' : { 'attr' : 'shortNames', },
+    'AutoSchedule' : { 'attr' : 'autoSchedule', },
+    'AutoAcceptGroup' : { 'attr' : 'autoAcceptGroup', },
</ins><span class="cx"> 
</span><ins>+    'Comment' : { 'extras' : True, 'attr' : 'comment', },
+    'Description' : { 'extras' : True, 'attr' : 'description', },
+    'Type' : { 'extras' : True, 'attr' : 'type', },
</ins><span class="cx"> 
</span><ins>+    # For &quot;Locations&quot;, i.e. scheduled spaces
+    'Capacity' : { 'extras' : True, 'attr' : 'capacity', },
+    'Floor' : { 'extras' : True, 'attr' : 'floor', },
+    'AssociatedAddress' : { 'extras' : True, 'attr' : 'associatedAddress', },
+
+    # For &quot;Addresses&quot;, i.e. nonscheduled areas containing Locations
+    'AbbreviatedName' : { 'extras' : True, 'attr' : 'abbreviatedName', },
+    'StreetAddress' : { 'extras' : True, 'attr' : 'streetAddress', },
+    'Geo' : { 'extras' : True, 'attr' : 'geo', },
+}
+
+
</ins><span class="cx"> def main():
</span><span class="cx">     try:
</span><span class="cx">         (optargs, args) = getopt(
</span><span class="lines">@@ -142,6 +169,12 @@
</span><span class="cx">                 &quot;get-auto-schedule-mode&quot;,
</span><span class="cx">                 &quot;set-auto-accept-group=&quot;,
</span><span class="cx">                 &quot;get-auto-accept-group&quot;,
</span><ins>+                &quot;set-geo=&quot;,
+                &quot;get-geo&quot;,
+                &quot;set-address=&quot;,
+                &quot;get-address&quot;,
+                &quot;set-street-address=&quot;,
+                &quot;get-street-address&quot;,
</ins><span class="cx">                 &quot;verbose&quot;,
</span><span class="cx">             ],
</span><span class="cx">         )
</span><span class="lines">@@ -258,6 +291,24 @@
</span><span class="cx">         elif opt in (&quot;&quot;, &quot;--get-auto-accept-group&quot;):
</span><span class="cx">             principalActions.append((action_getAutoAcceptGroup,))
</span><span class="cx"> 
</span><ins>+        elif opt in (&quot;&quot;, &quot;--set-geo&quot;):
+            principalActions.append((action_setValue, &quot;Geo&quot;, arg))
+
+        elif opt in (&quot;&quot;, &quot;--get-geo&quot;):
+            principalActions.append((action_getValue, &quot;Geo&quot;))
+
+        elif opt in (&quot;&quot;, &quot;--set-street-address&quot;):
+            principalActions.append((action_setValue, &quot;StreetAddress&quot;, arg))
+
+        elif opt in (&quot;&quot;, &quot;--get-street-address&quot;):
+            principalActions.append((action_getValue, &quot;StreetAddress&quot;))
+
+        elif opt in (&quot;&quot;, &quot;--set-address&quot;):
+            principalActions.append((action_setValue, &quot;AssociatedAddress&quot;, arg))
+
+        elif opt in (&quot;&quot;, &quot;--get-address&quot;):
+            principalActions.append((action_getValue, &quot;AssociatedAddress&quot;))
+
</ins><span class="cx">         else:
</span><span class="cx">             raise NotImplementedError(opt)
</span><span class="cx"> 
</span><span class="lines">@@ -274,7 +325,7 @@
</span><span class="cx">     elif addType:
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            addType = matchStrings(addType, [&quot;locations&quot;, &quot;resources&quot;])
</del><ins>+            addType = matchStrings(addType, [&quot;locations&quot;, &quot;resources&quot;, &quot;addresses&quot;])
</ins><span class="cx">         except ValueError, e:
</span><span class="cx">             print(e)
</span><span class="cx">             return
</span><span class="lines">@@ -296,7 +347,7 @@
</span><span class="cx">     elif listPrincipals:
</span><span class="cx">         try:
</span><span class="cx">             listPrincipals = matchStrings(listPrincipals, [&quot;users&quot;, &quot;groups&quot;,
</span><del>-                &quot;locations&quot;, &quot;resources&quot;])
</del><ins>+                &quot;locations&quot;, &quot;resources&quot;, &quot;addresses&quot;])
</ins><span class="cx">         except ValueError, e:
</span><span class="cx">             print(e)
</span><span class="cx">             return
</span><span class="lines">@@ -393,6 +444,7 @@
</span><span class="cx">                  &quot;groups&quot; : &quot;Group&quot;,
</span><span class="cx">                  &quot;locations&quot; : &quot;Place&quot;,
</span><span class="cx">                  &quot;resources&quot; : &quot;Resource&quot;,
</span><ins>+                 &quot;addresses&quot; : &quot;Address&quot;,
</ins><span class="cx">                 }.get(record.recordType),
</span><span class="cx">             ))
</span><span class="cx">             print(&quot;   GUID: %s&quot; % (record.guid,))
</span><span class="lines">@@ -667,7 +719,30 @@
</span><span class="cx">         print(&quot;No auto-accept-group assigned to %s&quot; % (prettyPrincipal(principal),))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+@inlineCallbacks
+def action_setValue(rootResource, directory, store, principal, name, value):
+    print(&quot;Setting %s to %s for %s&quot; % (
+        name, value, prettyPrincipal(principal),
+    ))
</ins><span class="cx"> 
</span><ins>+    principal.record.extras[attrMap[name][&quot;attr&quot;]] = value
+    (yield updateRecord(False, directory,
+        principal.record.recordType,
+        guid=principal.record.guid,
+        shortNames=principal.record.shortNames,
+        fullName=principal.record.fullName,
+        **principal.record.extras
+    ))
+
+
+def action_getValue(rootResource, directory, store, principal, name):
+    print(&quot;%s for %s is %s&quot; % (
+        name,
+        prettyPrincipal(principal),
+        principal.record.extras[attrMap[name][&quot;attr&quot;]]
+    ))
+
+
</ins><span class="cx"> def abort(msg, status=1):
</span><span class="cx">     sys.stdout.write(&quot;%s\n&quot; % (msg,))
</span><span class="cx">     try:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstestgatewaycaldavdplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/gateway/caldavd.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -176,6 +176,7 @@
</span><span class="cx">         &lt;array&gt;
</span><span class="cx">             &lt;string&gt;resources&lt;/string&gt;
</span><span class="cx">             &lt;string&gt;locations&lt;/string&gt;
</span><ins>+            &lt;string&gt;addresses&lt;/string&gt;
</ins><span class="cx">         &lt;/array&gt;
</span><span class="cx">       &lt;/dict&gt;
</span><span class="cx">     &lt;/dict&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_gatewaypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_gateway.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> import sys
</span><del>-from twext.python.plistlib import readPlistFromString
</del><ins>+from plistlib import readPlistFromString
</ins><span class="cx"> import xml
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="lines">@@ -127,15 +127,9 @@
</span><span class="cx">     def test_getLocationAttributes(self):
</span><span class="cx">         yield self.runCommand(command_createLocation)
</span><span class="cx">         results = yield self.runCommand(command_getLocationAttributes)
</span><del>-        self.assertEquals(results[&quot;result&quot;][&quot;Building&quot;], &quot;Test Building&quot;)
-        self.assertEquals(results[&quot;result&quot;][&quot;City&quot;], &quot;Cupertino&quot;)
</del><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;Capacity&quot;], &quot;40&quot;)
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;Description&quot;], &quot;Test Description&quot;)
</span><del>-        self.assertEquals(results[&quot;result&quot;][&quot;ZIP&quot;], &quot;95014&quot;)
-        self.assertEquals(results[&quot;result&quot;][&quot;Floor&quot;], &quot;First&quot;)
</del><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;RecordName&quot;], [&quot;createdlocation01&quot;])
</span><del>-        self.assertEquals(results[&quot;result&quot;][&quot;State&quot;], &quot;CA&quot;)
-        self.assertEquals(results[&quot;result&quot;][&quot;Street&quot;], &quot;1 Infinite Loop&quot;)
</del><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;RealName&quot;],
</span><span class="cx">             &quot;Created Location 01 %s %s&quot; % (unichr(208), u&quot;\ud83d\udca3&quot;))
</span><span class="cx">         self.assertEquals(results[&quot;result&quot;][&quot;Comment&quot;], &quot;Test Comment&quot;)
</span><span class="lines">@@ -162,6 +156,45 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def test_createAddress(self):
+        directory = getDirectory()
+
+        record = directory.recordWithUID(&quot;C701069D-9CA1-4925-A1A9-5CD94767B74B&quot;)
+        self.assertEquals(record, None)
+        yield self.runCommand(command_createAddress)
+
+        directory.flushCaches()
+
+        record = directory.recordWithUID(&quot;C701069D-9CA1-4925-A1A9-5CD94767B74B&quot;)
+        self.assertEquals(record.fullName.decode(&quot;utf-8&quot;),
+            &quot;Created Address 01 %s %s&quot; % (unichr(208), u&quot;\ud83d\udca3&quot;))
+
+        self.assertNotEquals(record, None)
+
+        self.assertEquals(record.extras[&quot;abbreviatedName&quot;], &quot;Addr1&quot;)
+        self.assertEquals(record.extras[&quot;streetAddress&quot;], &quot;1 Infinite Loop\nCupertino, 95014\nCA&quot;)
+        self.assertEquals(record.extras[&quot;geo&quot;], &quot;geo:37.331,-122.030&quot;)
+
+        results = yield self.runCommand(command_getAddressList)
+        self.assertEquals(len(results[&quot;result&quot;]), 1)
+
+        results = yield self.runCommand(command_getAddressAttributes)
+        self.assertEquals(results[&quot;result&quot;][&quot;RealName&quot;], u'Created Address 01 \xd0 \U0001f4a3')
+
+        results = yield self.runCommand(command_setAddressAttributes)
+
+        results = yield self.runCommand(command_getAddressAttributes)
+        self.assertEquals(results[&quot;result&quot;][&quot;RealName&quot;], u'Updated Address')
+        self.assertEquals(results[&quot;result&quot;][&quot;StreetAddress&quot;], u'Updated Street Address')
+        self.assertEquals(results[&quot;result&quot;][&quot;Geo&quot;], u'Updated Geo')
+        
+        results = yield self.runCommand(command_deleteAddress)
+
+        results = yield self.runCommand(command_getAddressList)
+        self.assertEquals(len(results[&quot;result&quot;]), 0)
+
+
+    @inlineCallbacks
</ins><span class="cx">     def test_createLocation(self):
</span><span class="cx">         directory = getDirectory()
</span><span class="cx"> 
</span><span class="lines">@@ -184,16 +217,8 @@
</span><span class="cx">         self.assertEquals(record.autoSchedule, True)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(record.extras[&quot;comment&quot;], &quot;Test Comment&quot;)
</span><del>-        self.assertEquals(record.extras[&quot;building&quot;], &quot;Test Building&quot;)
</del><span class="cx">         self.assertEquals(record.extras[&quot;floor&quot;], &quot;First&quot;)
</span><span class="cx">         self.assertEquals(record.extras[&quot;capacity&quot;], &quot;40&quot;)
</span><del>-        self.assertEquals(record.extras[&quot;street&quot;], &quot;1 Infinite Loop&quot;)
-        self.assertEquals(record.extras[&quot;city&quot;], &quot;Cupertino&quot;)
-        self.assertEquals(record.extras[&quot;state&quot;], &quot;CA&quot;)
-        self.assertEquals(record.extras[&quot;zip&quot;], &quot;95014&quot;)
-        self.assertEquals(record.extras[&quot;country&quot;], &quot;USA&quot;)
-        self.assertEquals(record.extras[&quot;phone&quot;], &quot;(408) 555-1212&quot;)
-        self.assertEquals(record.extras[&quot;geo&quot;], &quot;geo:37.331,-122.030&quot;)
</del><span class="cx"> 
</span><span class="cx">         results = yield self.runCommand(command_getLocationAttributes)
</span><span class="cx">         self.assertEquals(set(results[&quot;result&quot;][&quot;ReadProxies&quot;]), set(['user03', 'user04']))
</span><span class="lines">@@ -216,15 +241,9 @@
</span><span class="cx">         record = directory.recordWithUID(&quot;836B1B66-2E9A-4F46-8B1C-3DD6772C20B2&quot;)
</span><span class="cx"> 
</span><span class="cx">         self.assertEquals(record.extras[&quot;comment&quot;], &quot;Updated Test Comment&quot;)
</span><del>-        self.assertEquals(record.extras[&quot;building&quot;], &quot;Updated Test Building&quot;)
</del><span class="cx">         self.assertEquals(record.extras[&quot;floor&quot;], &quot;Second&quot;)
</span><span class="cx">         self.assertEquals(record.extras[&quot;capacity&quot;], &quot;41&quot;)
</span><del>-        self.assertEquals(record.extras[&quot;street&quot;], &quot;2 Infinite Loop&quot;)
-        self.assertEquals(record.extras[&quot;city&quot;], &quot;Updated Cupertino&quot;)
-        self.assertEquals(record.extras[&quot;state&quot;], &quot;Updated CA&quot;)
-        self.assertEquals(record.extras[&quot;zip&quot;], &quot;95015&quot;)
-        self.assertEquals(record.extras[&quot;country&quot;], &quot;Updated USA&quot;)
-        self.assertEquals(record.extras[&quot;phone&quot;], &quot;(408) 555-1213&quot;)
</del><ins>+        self.assertEquals(record.extras[&quot;streetAddress&quot;], &quot;2 Infinite Loop\nCupertino, 95014\nCA&quot;)
</ins><span class="cx">         self.assertEquals(record.autoSchedule, True)
</span><span class="cx">         self.assertEquals(record.autoAcceptGroup, &quot;F5A6142C-4189-4E9E-90B0-9CD0268B314B&quot;)
</span><span class="cx"> 
</span><span class="lines">@@ -385,6 +404,31 @@
</span><span class="cx"> &lt;/plist&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+command_createAddress = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+        &lt;key&gt;command&lt;/key&gt;
+        &lt;string&gt;createAddress&lt;/string&gt;
+        &lt;key&gt;GeneratedUID&lt;/key&gt;
+        &lt;string&gt;C701069D-9CA1-4925-A1A9-5CD94767B74B&lt;/string&gt;
+        &lt;key&gt;RealName&lt;/key&gt;
+        &lt;string&gt;Created Address 01 %s %s&lt;/string&gt;
+        &lt;key&gt;AbbreviatedName&lt;/key&gt;
+        &lt;string&gt;Addr1&lt;/string&gt;
+        &lt;key&gt;RecordName&lt;/key&gt;
+        &lt;array&gt;
+                &lt;string&gt;createdaddress01&lt;/string&gt;
+        &lt;/array&gt;
+        &lt;key&gt;StreetAddress&lt;/key&gt;
+        &lt;string&gt;1 Infinite Loop\nCupertino, 95014\nCA&lt;/string&gt;
+        &lt;key&gt;Geo&lt;/key&gt;
+        &lt;string&gt;geo:37.331,-122.030&lt;/string&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+&quot;&quot;&quot; % (unichr(208), u&quot;\ud83d\udca3&quot;)
+
+
</ins><span class="cx"> command_createLocation = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> &lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
</span><span class="cx"> &lt;plist version=&quot;1.0&quot;&gt;
</span><span class="lines">@@ -407,26 +451,12 @@
</span><span class="cx">         &lt;string&gt;Test Comment&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;Description&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;Test Description&lt;/string&gt;
</span><del>-        &lt;key&gt;Building&lt;/key&gt;
-        &lt;string&gt;Test Building&lt;/string&gt;
</del><span class="cx">         &lt;key&gt;Floor&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;First&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;Capacity&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;40&lt;/string&gt;
</span><del>-        &lt;key&gt;Street&lt;/key&gt;
-        &lt;string&gt;1 Infinite Loop&lt;/string&gt;
-        &lt;key&gt;City&lt;/key&gt;
-        &lt;string&gt;Cupertino&lt;/string&gt;
-        &lt;key&gt;State&lt;/key&gt;
-        &lt;string&gt;CA&lt;/string&gt;
-        &lt;key&gt;ZIP&lt;/key&gt;
-        &lt;string&gt;95014&lt;/string&gt;
-        &lt;key&gt;Country&lt;/key&gt;
-        &lt;string&gt;USA&lt;/string&gt;
-        &lt;key&gt;Phone&lt;/key&gt;
-        &lt;string&gt;(408) 555-1212&lt;/string&gt;
-        &lt;key&gt;Geo&lt;/key&gt;
-        &lt;string&gt;geo:37.331,-122.030&lt;/string&gt;
</del><ins>+        &lt;key&gt;AssociatedAddress&lt;/key&gt;
+        &lt;string&gt;C701069D-9CA1-4925-A1A9-5CD94767B74B&lt;/string&gt;
</ins><span class="cx">         &lt;key&gt;ReadProxies&lt;/key&gt;
</span><span class="cx">         &lt;array&gt;
</span><span class="cx">             &lt;string&gt;users:user03&lt;/string&gt;
</span><span class="lines">@@ -454,14 +484,16 @@
</span><span class="cx">         &lt;string&gt;AF575A61-CFA6-49E1-A0F6-B5662C9D9801&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;RealName&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;Laptop 1&lt;/string&gt;
</span><ins>+        &lt;key&gt;Comment&lt;/key&gt;
+        &lt;string&gt;Test Comment&lt;/string&gt;
+        &lt;key&gt;Description&lt;/key&gt;
+        &lt;string&gt;Test Description&lt;/string&gt;
</ins><span class="cx">         &lt;key&gt;Type&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;Computer&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;RecordName&lt;/key&gt;
</span><span class="cx">         &lt;array&gt;
</span><span class="cx">                 &lt;string&gt;laptop1&lt;/string&gt;
</span><span class="cx">         &lt;/array&gt;
</span><del>-        &lt;key&gt;Comment&lt;/key&gt;
-        &lt;string&gt;Test Comment&lt;/string&gt;
</del><span class="cx">         &lt;key&gt;ReadProxies&lt;/key&gt;
</span><span class="cx">         &lt;array&gt;
</span><span class="cx">             &lt;string&gt;users:user03&lt;/string&gt;
</span><span class="lines">@@ -500,6 +532,19 @@
</span><span class="cx"> &lt;/plist&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+
+command_deleteAddress = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+        &lt;key&gt;command&lt;/key&gt;
+        &lt;string&gt;deleteAddress&lt;/string&gt;
+        &lt;key&gt;GeneratedUID&lt;/key&gt;
+        &lt;string&gt;C701069D-9CA1-4925-A1A9-5CD94767B74B&lt;/string&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+&quot;&quot;&quot;
+
</ins><span class="cx"> command_getLocationAndResourceList = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> &lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
</span><span class="cx"> &lt;plist version=&quot;1.0&quot;&gt;
</span><span class="lines">@@ -530,6 +575,17 @@
</span><span class="cx"> &lt;/plist&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+command_getAddressList = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+        &lt;key&gt;command&lt;/key&gt;
+        &lt;string&gt;getAddressList&lt;/string&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+&quot;&quot;&quot;
+
+
</ins><span class="cx"> command_listReadProxies = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> &lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
</span><span class="cx"> &lt;plist version=&quot;1.0&quot;&gt;
</span><span class="lines">@@ -604,24 +660,12 @@
</span><span class="cx">         &lt;string&gt;Updated Test Comment&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;Description&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;Updated Test Description&lt;/string&gt;
</span><del>-        &lt;key&gt;Building&lt;/key&gt;
-        &lt;string&gt;Updated Test Building&lt;/string&gt;
</del><span class="cx">         &lt;key&gt;Floor&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;Second&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;Capacity&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;41&lt;/string&gt;
</span><del>-        &lt;key&gt;Street&lt;/key&gt;
-        &lt;string&gt;2 Infinite Loop&lt;/string&gt;
-        &lt;key&gt;City&lt;/key&gt;
-        &lt;string&gt;Updated Cupertino&lt;/string&gt;
-        &lt;key&gt;State&lt;/key&gt;
-        &lt;string&gt;Updated CA&lt;/string&gt;
-        &lt;key&gt;ZIP&lt;/key&gt;
-        &lt;string&gt;95015&lt;/string&gt;
-        &lt;key&gt;Country&lt;/key&gt;
-        &lt;string&gt;Updated USA&lt;/string&gt;
-        &lt;key&gt;Phone&lt;/key&gt;
-        &lt;string&gt;(408) 555-1213&lt;/string&gt;
</del><ins>+        &lt;key&gt;StreetAddress&lt;/key&gt;
+        &lt;string&gt;2 Infinite Loop\nCupertino, 95014\nCA&lt;/string&gt;
</ins><span class="cx">         &lt;key&gt;ReadProxies&lt;/key&gt;
</span><span class="cx">         &lt;array&gt;
</span><span class="cx">             &lt;string&gt;users:user03&lt;/string&gt;
</span><span class="lines">@@ -648,6 +692,38 @@
</span><span class="cx"> &lt;/plist&gt;
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+command_getAddressAttributes = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+        &lt;key&gt;command&lt;/key&gt;
+        &lt;string&gt;getAddressAttributes&lt;/string&gt;
+        &lt;key&gt;GeneratedUID&lt;/key&gt;
+        &lt;string&gt;C701069D-9CA1-4925-A1A9-5CD94767B74B&lt;/string&gt;
+&lt;/dict&gt;
+&lt;/plist&gt;
+&quot;&quot;&quot;
+
+command_setAddressAttributes = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
+&lt;plist version=&quot;1.0&quot;&gt;
+&lt;dict&gt;
+        &lt;key&gt;command&lt;/key&gt;
+        &lt;string&gt;setAddressAttributes&lt;/string&gt;
+        &lt;key&gt;GeneratedUID&lt;/key&gt;
+        &lt;string&gt;C701069D-9CA1-4925-A1A9-5CD94767B74B&lt;/string&gt;
+        &lt;key&gt;RealName&lt;/key&gt;
+        &lt;string&gt;Updated Address&lt;/string&gt;
+        &lt;key&gt;StreetAddress&lt;/key&gt;
+        &lt;string&gt;Updated Street Address&lt;/string&gt;
+        &lt;key&gt;Geo&lt;/key&gt;
+        &lt;string&gt;Updated Geo&lt;/string&gt;
+
+&lt;/dict&gt;
+&lt;/plist&gt;
+&quot;&quot;&quot;
+
+
</ins><span class="cx"> command_setResourceAttributes = &quot;&quot;&quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
</span><span class="cx"> &lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
</span><span class="cx"> &lt;plist version=&quot;1.0&quot;&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_WRITE
</span><span class="cx"> 
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarservertoolstesttest_purge_old_eventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/tools/test/test_purge_old_events.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.dal.syntax import Update, Delete
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadminresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -36,12 +36,12 @@
</span><span class="cx"> from twistedcaldav.extensions import DAVFile, ReadOnlyResourceMixIn
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><del>-from twext.web2.http import Response
</del><ins>+from txweb2.http import Response
</ins><span class="cx"> from twisted.python.modules import getModule
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> from zope.interface.declarations import implements
</span><del>-from twext.web2.stream import MemoryStream
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.stream import MemoryStream
+from txweb2.http import HTTPError
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="cx"> from twisted.web.iweb import ITemplateLoader
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebadmintesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webadmin/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -37,8 +37,8 @@
</span><span class="cx"> from txdav.xml.rfc3744 import GroupMemberSet
</span><span class="cx"> from txdav.xml.rfc2518 import DisplayName
</span><span class="cx"> 
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.responsecode import CONFLICT
</del><ins>+from txweb2.http import HTTPError
+from txweb2.responsecode import CONFLICT
</ins><span class="cx"> from txdav.xml.rfc2518 import HRef
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryRecord
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescalendarserverwebcalresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/calendarserver/webcal/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,19 +28,21 @@
</span><span class="cx"> from urlparse import urlparse
</span><span class="cx"> from cgi import parse_qs
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from twisted.internet.defer import succeed
+
+from txweb2 import responsecode
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.extensions import DAVFile, ReadOnlyResourceMixIn
</span><ins>+from twistedcaldav.timezones import hasTZ
</ins><span class="cx"> 
</span><del>-from twisted.internet.defer import succeed
</del><ins>+DEFAULT_TIMEZONE = &quot;America/Los_Angeles&quot;
</ins><span class="cx"> 
</span><del>-from twext.python.timezone import getLocalTimezone
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class WebCalendarResource (ReadOnlyResourceMixIn, DAVFile):
</span><span class="lines">@@ -75,7 +77,7 @@
</span><span class="cx">         return &quot;Web Calendar&quot;
</span><span class="cx"> 
</span><span class="cx">     def contentType(self):
</span><del>-        return MimeType.fromString(&quot;text/html; charset=utf-8&quot;);
</del><ins>+        return MimeType.fromString(&quot;text/html; charset=utf-8&quot;)
</ins><span class="cx"> 
</span><span class="cx">     def contentEncoding(self):
</span><span class="cx">         return None
</span><span class="lines">@@ -95,8 +97,11 @@
</span><span class="cx">         else:
</span><span class="cx">             cacheAttr = &quot;_htmlContent&quot;
</span><span class="cx">             templateFileName = &quot;standalone.html&quot;
</span><del>-        templateFileName = os.path.join(config.WebCalendarRoot, templateFileName)
</del><span class="cx"> 
</span><ins>+        templateFileName = os.path.join(
+            config.WebCalendarRoot, templateFileName
+        )
+
</ins><span class="cx">         #
</span><span class="cx">         # See if the file changed, and dump the cached template if so.
</span><span class="cx">         # Don't bother to check if we've checked in the past minute.
</span><span class="lines">@@ -135,14 +140,17 @@
</span><span class="cx"> 
</span><span class="cx">         #
</span><span class="cx">         # Get URL of authenticated principal.
</span><del>-        # Don't need to authenticate here because the ACL will have already required it.
</del><ins>+        # Don't need to authenticate here because the ACL will have already
+        # required it.
</ins><span class="cx">         #
</span><del>-        authenticatedPrincipalURL = str(request.authnUser.childOfType(davxml.HRef))
</del><ins>+        authenticatedPrincipalURL = str(
+            request.authnUser.childOfType(davxml.HRef)
+        )
</ins><span class="cx"> 
</span><span class="cx">         def queryValue(arg):
</span><span class="cx">             query = parse_qs(urlparse(request.uri).query, True)
</span><span class="cx">             return query.get(arg, [&quot;&quot;])[0]
</span><del>-            
</del><ins>+
</ins><span class="cx">         #
</span><span class="cx">         # Parse debug query arg
</span><span class="cx">         #
</span><span class="lines">@@ -180,3 +188,36 @@
</span><span class="cx">                 response.headers.setHeader(header, value)
</span><span class="cx"> 
</span><span class="cx">         return response
</span><ins>+
+
+
+try:
+    from Foundation import NSTimeZone
+
+    def lookupSystemTimezone():
+        return NSTimeZone.localTimeZone().name().encode(&quot;utf-8&quot;)
+
+except ImportError:
+    def lookupSystemTimezone():
+        return &quot;&quot;
+
+
+def getLocalTimezone():
+    &quot;&quot;&quot;
+    Returns the default timezone for the server.  The order of precedence is:
+    config.DefaultTimezone, lookupSystemTimezone( ), DEFAULT_TIMEZONE.
+    Also, if neither of the first two values in that list are in the timezone
+    database, DEFAULT_TIMEZONE is returned.
+
+    @return: The server's local timezone name
+    @rtype: C{str}
+    &quot;&quot;&quot;
+    if config.DefaultTimezone:
+        if hasTZ(config.DefaultTimezone):
+            return config.DefaultTimezone
+
+    systemTimezone = lookupSystemTimezone()
+    if hasTZ(systemTimezone):
+        return systemTimezone
+
+    return DEFAULT_TIMEZONE
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfauthaugmentstestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/augments-test.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -109,6 +109,7 @@
</span><span class="cx">     &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
</span><span class="cx">     &lt;enable-login&gt;true&lt;/enable-login&gt;
</span><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><ins>+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
</ins><span class="cx">   &lt;/record&gt;
</span><span class="cx">   &lt;record&gt;
</span><span class="cx">     &lt;uid&gt;C38BEE7A-36EE-478C-9DCB-CBF4612AFE65&lt;/uid&gt;
</span><span class="lines">@@ -136,4 +137,49 @@
</span><span class="cx">     &lt;enable-login&gt;true&lt;/enable-login&gt;
</span><span class="cx">     &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
</span><span class="cx">   &lt;/record&gt;
</span><ins>+  &lt;record&gt;
+    &lt;uid&gt;6F9EE33B-78F6-481B-9289-3D0812FF0D64&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+    &lt;auto-schedule&gt;false&lt;/auto-schedule&gt;
+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;76E7ECA6-08BC-4AE7-930D-F2E7453993A5&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+    &lt;auto-schedule&gt;false&lt;/auto-schedule&gt;
+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+    &lt;auto-schedule&gt;false&lt;/auto-schedule&gt;
+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;06E3BDCB-9C19-485A-B14E-F146A80ADDC6&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+    &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
+  &lt;record&gt;
+    &lt;uid&gt;4D66A20A-1437-437D-8069-2F14E8322234&lt;/uid&gt;
+    &lt;enable&gt;true&lt;/enable&gt;
+    &lt;enable-calendar&gt;true&lt;/enable-calendar&gt;
+    &lt;enable-addressbook&gt;true&lt;/enable-addressbook&gt;
+    &lt;enable-login&gt;true&lt;/enable-login&gt;
+    &lt;auto-schedule&gt;true&lt;/auto-schedule&gt;
+    &lt;auto-schedule-mode&gt;default&lt;/auto-schedule-mode&gt;
+  &lt;/record&gt;
</ins><span class="cx"> &lt;/augments&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfauthresourcestestxml"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/auth/resources-test.xml        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,5 +1,13 @@
</span><span class="cx"> &lt;accounts realm=&quot;Test Realm&quot;&gt;
</span><span class="cx">   &lt;location&gt;
</span><ins>+    &lt;uid&gt;fantastic&lt;/uid&gt;
+    &lt;guid&gt;4D66A20A-1437-437D-8069-2F14E8322234&lt;/guid&gt;
+    &lt;name&gt;Fantastic Conference Room&lt;/name&gt;
+    &lt;extras&gt;
+      &lt;associatedAddress&gt;63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3&lt;/associatedAddress&gt;
+    &lt;/extras&gt;
+  &lt;/location&gt;
+  &lt;location&gt;
</ins><span class="cx">     &lt;uid&gt;jupiter&lt;/uid&gt;
</span><span class="cx">     &lt;guid&gt;jupiter&lt;/guid&gt;
</span><span class="cx">     &lt;name&gt;Jupiter Conference Room, Building 2, 1st Floor&lt;/name&gt;
</span><span class="lines">@@ -78,6 +86,9 @@
</span><span class="cx">     &lt;uid&gt;sharissroom&lt;/uid&gt;
</span><span class="cx">     &lt;guid&gt;80689D41-DAF8-4189-909C-DB017B271892&lt;/guid&gt;
</span><span class="cx">     &lt;name&gt;Shari's Room&lt;/name&gt;
</span><ins>+    &lt;extras&gt;
+      &lt;associatedAddress&gt;6F9EE33B-78F6-481B-9289-3D0812FF0D64&lt;/associatedAddress&gt;
+    &lt;/extras&gt;
</ins><span class="cx">   &lt;/location&gt;
</span><span class="cx">   &lt;location&gt;
</span><span class="cx">     &lt;uid&gt;pluto&lt;/uid&gt;
</span><span class="lines">@@ -95,6 +106,14 @@
</span><span class="cx">     &lt;name&gt;Room 10&lt;/name&gt;
</span><span class="cx">   &lt;/location&gt;
</span><span class="cx">   &lt;location&gt;
</span><ins>+    &lt;uid&gt;pretend&lt;/uid&gt;
+    &lt;guid&gt;06E3BDCB-9C19-485A-B14E-F146A80ADDC6&lt;/guid&gt;
+    &lt;name&gt;Pretend Conference Room&lt;/name&gt;
+    &lt;extras&gt;
+      &lt;associatedAddress&gt;76E7ECA6-08BC-4AE7-930D-F2E7453993A5&lt;/associatedAddress&gt;
+    &lt;/extras&gt;
+  &lt;/location&gt;
+  &lt;location&gt;
</ins><span class="cx">     &lt;uid&gt;neptune&lt;/uid&gt;
</span><span class="cx">     &lt;guid&gt;neptune&lt;/guid&gt;
</span><span class="cx">     &lt;name&gt;Neptune Conference Room, Building 2, 1st Floor&lt;/name&gt;
</span><span class="lines">@@ -224,4 +243,31 @@
</span><span class="cx">     &lt;guid&gt;resource09&lt;/guid&gt;
</span><span class="cx">     &lt;name&gt;Resource 09&lt;/name&gt;
</span><span class="cx">   &lt;/resource&gt;
</span><ins>+  &lt;address&gt;
+    &lt;uid&gt;testaddress1&lt;/uid&gt;
+    &lt;guid&gt;6F9EE33B-78F6-481B-9289-3D0812FF0D64&lt;/guid&gt;
+    &lt;name&gt;Test Address One&lt;/name&gt;
+    &lt;extras&gt;
+      &lt;streetAddress&gt;20300 Stevens Creek Blvd, Cupertino, CA 95014&lt;/streetAddress&gt;
+      &lt;geo&gt;37.322281,-122.028345&lt;/geo&gt;
+    &lt;/extras&gt;
+  &lt;/address&gt;
+  &lt;address&gt;
+    &lt;uid&gt;il2&lt;/uid&gt;
+    &lt;guid&gt;63A2F949-2D8D-4C8D-B8A5-DCF2A94610F3&lt;/guid&gt;
+    &lt;name&gt;IL2&lt;/name&gt;
+    &lt;extras&gt;
+      &lt;streetAddress&gt;2 Infinite Loop, Cupertino, CA 95014&lt;/streetAddress&gt;
+      &lt;geo&gt;37.332633,-122.030502&lt;/geo&gt;
+    &lt;/extras&gt;
+  &lt;/address&gt;
+  &lt;address&gt;
+    &lt;uid&gt;il1&lt;/uid&gt;
+    &lt;guid&gt;76E7ECA6-08BC-4AE7-930D-F2E7453993A5&lt;/guid&gt;
+    &lt;name&gt;IL1&lt;/name&gt;
+    &lt;extras&gt;
+      &lt;streetAddress&gt;1 Infinite Loop, Cupertino, CA 95014&lt;/streetAddress&gt;
+      &lt;geo&gt;37.331741,-122.030333&lt;/geo&gt;
+    &lt;/extras&gt;
+  &lt;/address&gt;
</ins><span class="cx"> &lt;/accounts&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdappleplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-apple.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -123,6 +123,8 @@
</span><span class="cx">         &lt;string&gt;cluster.pg&lt;/string&gt;
</span><span class="cx">         &lt;key&gt;LogFile&lt;/key&gt;
</span><span class="cx">         &lt;string&gt;xpg_ctl.log&lt;/string&gt;
</span><ins>+        &lt;key&gt;SocketDirectory&lt;/key&gt;
+        &lt;string&gt;/var/run/caldavd/PostgresSocket&lt;/string&gt;
</ins><span class="cx">     &lt;/dict&gt;
</span><span class="cx"> 
</span><span class="cx">     &lt;!-- Data root --&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixesconfcaldavdtestplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/conf/caldavd-test.plist        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -284,29 +284,20 @@
</span><span class="cx">                     &lt;string&gt;mail&lt;/string&gt;
</span><span class="cx">                     &lt;string&gt;mailAlias&lt;/string&gt;
</span><span class="cx">                 &lt;/array&gt;
</span><del>-                &lt;key&gt;firstName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
-                &lt;key&gt;lastName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
</del><span class="cx">             &lt;/dict&gt;
</span><span class="cx">           &lt;/dict&gt;
</span><span class="cx">           &lt;key&gt;locations&lt;/key&gt;
</span><span class="cx">           &lt;dict&gt;
</span><span class="cx">             &lt;key&gt;rdn&lt;/key&gt;
</span><span class="cx">             &lt;string&gt;ou=locations&lt;/string&gt;
</span><ins>+            &lt;key&gt;associatedAddressAttr&lt;/key&gt;
+            &lt;string&gt;&lt;/string&gt;
</ins><span class="cx">             &lt;key&gt;mapping&lt;/key&gt;
</span><span class="cx">             &lt;dict&gt;
</span><span class="cx">                 &lt;key&gt;recordName&lt;/key&gt;
</span><span class="cx">                 &lt;string&gt;cn&lt;/string&gt;
</span><span class="cx">                 &lt;key&gt;fullName&lt;/key&gt;
</span><span class="cx">                 &lt;string&gt;cn&lt;/string&gt;
</span><del>-                &lt;key&gt;emailAddresses&lt;/key&gt;
-                &lt;array&gt;
-                &lt;/array&gt;
-                &lt;key&gt;firstName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
-                &lt;key&gt;lastName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
</del><span class="cx">             &lt;/dict&gt;
</span><span class="cx">           &lt;/dict&gt;
</span><span class="cx">           &lt;key&gt;resources&lt;/key&gt;
</span><span class="lines">@@ -319,15 +310,24 @@
</span><span class="cx">                 &lt;string&gt;cn&lt;/string&gt;
</span><span class="cx">                 &lt;key&gt;fullName&lt;/key&gt;
</span><span class="cx">                 &lt;string&gt;cn&lt;/string&gt;
</span><del>-                &lt;key&gt;emailAddresses&lt;/key&gt;
-                &lt;array&gt;
-                &lt;/array&gt;
-                &lt;key&gt;firstName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
-                &lt;key&gt;lastName&lt;/key&gt;
-                &lt;string&gt;&lt;/string&gt;
</del><span class="cx">             &lt;/dict&gt;
</span><span class="cx">           &lt;/dict&gt;
</span><ins>+          &lt;key&gt;addresses&lt;/key&gt;
+          &lt;dict&gt;
+            &lt;key&gt;rdn&lt;/key&gt;
+            &lt;string&gt;ou=buildings&lt;/string&gt;
+            &lt;key&gt;geoAttr&lt;/key&gt;
+            &lt;string&gt;&lt;/string&gt;
+            &lt;key&gt;streetAddressAttr&lt;/key&gt;
+            &lt;string&gt;&lt;/string&gt;
+            &lt;key&gt;mapping&lt;/key&gt;
+            &lt;dict&gt;
+                &lt;key&gt;recordName&lt;/key&gt;
+                &lt;string&gt;cn&lt;/string&gt;
+                &lt;key&gt;fullName&lt;/key&gt;
+                &lt;string&gt;cn&lt;/string&gt;
+            &lt;/dict&gt;
+          &lt;/dict&gt;
</ins><span class="cx">         &lt;/dict&gt;
</span><span class="cx">         &lt;key&gt;groupSchema&lt;/key&gt;
</span><span class="cx">         &lt;dict&gt;
</span><span class="lines">@@ -826,6 +826,10 @@
</span><span class="cx">     &lt;!-- Private Events --&gt;
</span><span class="cx">     &lt;key&gt;EnablePrivateEvents&lt;/key&gt;
</span><span class="cx">     &lt;true/&gt;
</span><ins>+    
+    &lt;!-- Private Comment fix off for testing --&gt;
+    &lt;key&gt;RemoveDuplicatePrivateComments&lt;/key&gt;
+    &lt;false/&gt;
</ins><span class="cx"> 
</span><span class="cx">     &lt;!-- Timezone Service --&gt;
</span><span class="cx">     &lt;key&gt;EnableTimezoneService&lt;/key&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformanceloadtestsimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/loadtest/sim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -43,6 +43,8 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.internet.protocol import ProcessProtocol
</span><span class="cx"> 
</span><ins>+from twisted.web.server import Site
+
</ins><span class="cx"> from contrib.performance.loadtest.ical import OS_X_10_6
</span><span class="cx"> from contrib.performance.loadtest.profiles import Eventer, Inviter, Accepter
</span><span class="cx"> from contrib.performance.loadtest.population import (
</span><span class="lines">@@ -214,7 +216,6 @@
</span><span class="cx"> Arrival = namedtuple('Arrival', 'factory parameters')
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-from twisted.web import server
</del><span class="cx"> 
</span><span class="cx"> class LoadSimulator(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -461,7 +462,7 @@
</span><span class="cx">         if self.runtime is not None:
</span><span class="cx">             self.reactor.callLater(self.runtime, self.stopAndReport)
</span><span class="cx">         if self.webadminPort:
</span><del>-            self.reactor.listenTCP(self.webadminPort, server.Site(LoadSimAdminResource(self)))
</del><ins>+            self.reactor.listenTCP(self.webadminPort, Site(LoadSimAdminResource(self)))
</ins><span class="cx">         self.reactor.run()
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsinvitepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/invite.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml
</span><span class="cx"> 
</span><span class="cx"> ICAL = &quot;&quot;&quot;BEGIN:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/multiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,7 +19,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.http.data.string import ResponseDataString
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml, statuscodes
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> 
</span><span class="cx"> class MultigetTest(HTTPTestBase):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsputpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/put.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> 
</span><span class="cx"> ICAL = &quot;&quot;&quot;BEGIN:VCALENDAR
</span><span class="cx"> CALSCALE:GREGORIAN
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestsquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml, statuscodes
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from caldavclientlibrary.protocol.caldav.query import QueryVEVENTTimeRange
</span><span class="cx"> from caldavclientlibrary.protocol.http.data.string import ResponseDataString
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagerequestssyncpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/requests/sync.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from caldavclientlibrary.protocol.url import URL
</span><span class="cx"> from caldavclientlibrary.protocol.webdav.definitions import davxml
</span><span class="cx"> from contrib.performance.sqlusage.requests.httpTests import HTTPTestBase
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> 
</span><span class="cx"> ICAL = &quot;&quot;&quot;BEGIN:VCALENDAR
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancesqlusagesqlusagepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/sqlusage/sqlusage.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> from contrib.performance.sqlusage.requests.query import QueryTest
</span><span class="cx"> from contrib.performance.sqlusage.requests.sync import SyncTest
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> import getopt
</span><span class="cx"> import itertools
</span><span class="cx"> import sys
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixescontribperformancestatspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/contrib/performance/stats.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,16 +15,19 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from __future__ import print_function
</span><ins>+
</ins><span class="cx"> from math import log, sqrt
</span><ins>+from time import mktime
+import random
+import sqlparse
+
</ins><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from pycalendar.duration import Duration as PyDuration
</span><span class="cx"> from pycalendar.icalendar.property import Property
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><ins>+
+from zope.interface import Interface, implements
</ins><span class="cx"> from twisted.python.util import FancyEqMixin
</span><del>-from zope.interface import Interface, implements
-import random
-import time
-import sqlparse
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> NANO = 1000000000.0
</span><span class="lines">@@ -394,7 +397,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def astimestamp(self, dt):
</span><del>-        return time.mktime(dt.timetuple())
</del><ins>+        return mktime(dt.timetuple())
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def _findWorkAfter(self, when):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixespyflakes"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/pyflakes        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,16 +14,13 @@
</span><span class="cx"> fi;
</span><span class="cx"> 
</span><span class="cx"> if [ $# -eq 0 ]; then
</span><del>-  set - calendarserver twext twisted twistedcaldav txdav contrib;
</del><ins>+  set - calendarserver twisted twistedcaldav txdav contrib;
</ins><span class="cx"> fi;
</span><span class="cx"> 
</span><span class="cx"> tmp=&quot;$(mktemp &quot;/tmp/pyflakes.XXXXX&quot;)&quot;;
</span><span class="cx"> 
</span><del>-cd &quot;${wd}&quot; &amp;&amp; &quot;${pyflakes}&quot; &quot;$@&quot; | sed                                    \
-  -e &quot;/'from ctypes import \\*' used; unable to detect undefined names/d&quot; \
-  -e &quot;/redefinition of unused/d&quot;                                          \
-  -e &quot;/^twext\\/backport/d&quot;                                               \
-  -e &quot;/xmlext.py:[0-9][0-9]*: /d&quot;                                         \
</del><ins>+cd &quot;${wd}&quot; &amp;&amp; &quot;${pyflakes}&quot; &quot;$@&quot; | sed  \
+  -e &quot;/xmlext.py:[0-9][0-9]*: /d&quot;       \
</ins><span class="cx">   | tee &quot;${tmp}&quot;;
</span><span class="cx"> 
</span><span class="cx"> if [ -s &quot;${tmp}&quot; ]; then error=&quot;true&quot;; else error=&quot;false&quot;; fi;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessetuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/setup.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,6 +15,7 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><ins>+
</ins><span class="cx"> from __future__ import print_function
</span><span class="cx"> 
</span><span class="cx"> import sys
</span><span class="lines">@@ -24,18 +25,20 @@
</span><span class="cx"> 
</span><span class="cx"> from version import version
</span><span class="cx"> 
</span><del>-def find_modules():
</del><ins>+
+
+def find_packages():
</ins><span class="cx">     modules = [
</span><span class="cx">         &quot;twisted.plugins&quot;,
</span><span class="cx">     ]
</span><span class="cx"> 
</span><ins>+    excludes = [
+        &quot;.svn&quot;,
+        &quot;_trial_temp&quot;,
+        &quot;build&quot;,
+    ]
+
</ins><span class="cx">     for root, dirs, files in os.walk(&quot;.&quot;):
</span><del>-        excludes = [
-            &quot;.svn&quot;,
-            &quot;_trial_temp&quot;,
-            &quot;build&quot;,
-        ]
-
</del><span class="cx">         if root == &quot;.&quot;:
</span><span class="cx">             excludes.append(&quot;data&quot;)
</span><span class="cx"> 
</span><span class="lines">@@ -48,38 +51,41 @@
</span><span class="cx"> 
</span><span class="cx">     return modules
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Options
</span><span class="cx"> #
</span><span class="cx"> 
</span><del>-description = &quot;CalDAV/CardDAV protocol extensions to twext.web2.dav&quot;,
</del><ins>+description = &quot;Calendar and Contacts Server&quot;,
</ins><span class="cx"> long_description = &quot;&quot;&quot;
</span><del>-Extends twisted.web2.dav to implement CalDAV/CardDAV-aware resources and methods.
</del><ins>+Calendar and Contacts Server, implementing the CalDAV and CardDAV protocols.
</ins><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> classifiers = None
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Write version file
</span><span class="cx"> #
</span><span class="cx"> 
</span><span class="cx"> version_number, version_info = version()
</span><span class="cx"> 
</span><del>-version_string = &quot;{number} ({info})&quot;.format(number=version_number, info=version_info)
</del><ins>+version_string = (
+    &quot;{number} ({info})&quot;
+    .format(number=version_number, info=version_info)
+)
</ins><span class="cx"> version_file = file(os.path.join(&quot;calendarserver&quot;, &quot;version.py&quot;), &quot;w&quot;)
</span><span class="cx"> version_file.write('version = &quot;{version}&quot;\n'.format(version=version_string))
</span><span class="cx"> version_file.close()
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx"> #
</span><span class="cx"> # Set up Extension modules that need to be built
</span><span class="cx"> #
</span><span class="cx"> 
</span><span class="cx"> from distutils.core import Extension
</span><span class="cx"> 
</span><del>-extensions = [
-    Extension(&quot;twext.python.sendmsg&quot;,
-              sources=[&quot;twext/python/sendmsg.c&quot;])
-]
</del><ins>+extensions = []
</ins><span class="cx"> 
</span><span class="cx"> if sys.platform == &quot;darwin&quot;:
</span><span class="cx">     extensions.append(
</span><span class="lines">@@ -90,11 +96,7 @@
</span><span class="cx">         )
</span><span class="cx">     )
</span><span class="cx"> 
</span><del>-    from twext.python import launchd
-    extensions.append(launchd.ffi.verifier.get_extension())
</del><span class="cx"> 
</span><del>-
-
</del><span class="cx"> #
</span><span class="cx"> # Run setup
</span><span class="cx"> #
</span><span class="lines">@@ -107,58 +109,58 @@
</span><span class="cx">         version=version_string,
</span><span class="cx">         description=description,
</span><span class="cx">         long_description=long_description,
</span><del>-        url=None,
</del><ins>+        url=&quot;http://www.calendarserver.org/&quot;,
</ins><span class="cx">         classifiers=classifiers,
</span><span class="cx">         author=&quot;Apple Inc.&quot;,
</span><span class="cx">         author_email=None,
</span><del>-        license=None,
</del><ins>+        license=&quot;Apache License, Version 2.0&quot;,
</ins><span class="cx">         platforms=[&quot;all&quot;],
</span><del>-        packages=find_modules(),
</del><ins>+        packages=find_packages(),
</ins><span class="cx">         package_data={
</span><del>-                             &quot;twistedcaldav&quot;: [
-                               &quot;*.html&quot;,
-                               &quot;zoneinfo/*.ics&quot;,
-                               &quot;zoneinfo/*/*.ics&quot;,
-                               &quot;zoneinfo/*/*/*.ics&quot;,
-                               &quot;images/*/*.jpg&quot;,
-                             ],
-                             &quot;calendarserver.webadmin&quot;: [
-                                 &quot;*.html&quot;
-                             ],
-                             &quot;twistedcaldav.directory&quot;: [
-                                 &quot;*.html&quot;
-                             ],
-                             &quot;txdav.common.datastore&quot;: [
-                               &quot;sql_schema/*.sql&quot;,
-                               &quot;sql_schema/*/*.sql&quot;,
-                               &quot;sql_schema/*/*/*.sql&quot;,
-                             ],
-                           },
</del><ins>+            &quot;twistedcaldav&quot;: [
+                &quot;*.html&quot;,
+                &quot;zoneinfo/*.ics&quot;,
+                &quot;zoneinfo/*/*.ics&quot;,
+                &quot;zoneinfo/*/*/*.ics&quot;,
+                &quot;images/*/*.jpg&quot;,
+            ],
+            &quot;calendarserver.webadmin&quot;: [
+                &quot;*.html&quot;
+            ],
+            &quot;twistedcaldav.directory&quot;: [
+                &quot;*.html&quot;
+            ],
+            &quot;txdav.common.datastore&quot;: [
+                &quot;sql_schema/*.sql&quot;,
+                &quot;sql_schema/*/*.sql&quot;,
+                &quot;sql_schema/*/*/*.sql&quot;,
+            ],
+        },
</ins><span class="cx">         scripts=[
</span><del>-                             &quot;bin/caldavd&quot;,
-                             &quot;bin/calendarserver_backup&quot;,
-                             &quot;bin/calendarserver_bootstrap_database&quot;,
-                             &quot;bin/calendarserver_command_gateway&quot;,
-                             &quot;bin/calendarserver_config&quot;,
-                            #&quot;bin/calendarserver_dbinspect&quot;,
-                            #&quot;bin/calendarserver_dkimtool&quot;,
-                             &quot;bin/calendarserver_export&quot;,
-                            #&quot;bin/calendarserver_icalendar_validate&quot;,
-                            #&quot;bin/calendarserver_load_augmentdb&quot;,
-                            #&quot;bin/calendarserver_manage_postgres&quot;,
-                             &quot;bin/calendarserver_manage_principals&quot;,
-                             &quot;bin/calendarserver_manage_push&quot;,
-                             &quot;bin/calendarserver_manage_timezones&quot;,
-                             &quot;bin/calendarserver_migrate_resources&quot;,
-                            #&quot;bin/calendarserver_monitor_amp_notifications&quot;,
-                            #&quot;bin/calendarserver_monitor_notifications&quot;,
-                             &quot;bin/calendarserver_purge_attachments&quot;,
-                             &quot;bin/calendarserver_purge_events&quot;,
-                             &quot;bin/calendarserver_purge_principals&quot;,
-                             &quot;bin/calendarserver_shell&quot;,
-                             &quot;bin/calendarserver_upgrade&quot;,
-                            #&quot;bin/calendarserver_verify_data&quot;,
-                           ],
</del><ins>+            &quot;bin/caldavd&quot;,
+            &quot;bin/calendarserver_backup&quot;,
+            &quot;bin/calendarserver_bootstrap_database&quot;,
+            &quot;bin/calendarserver_command_gateway&quot;,
+            &quot;bin/calendarserver_config&quot;,
+            # &quot;bin/calendarserver_dbinspect&quot;,
+            # &quot;bin/calendarserver_dkimtool&quot;,
+            &quot;bin/calendarserver_export&quot;,
+            # &quot;bin/calendarserver_icalendar_validate&quot;,
+            # &quot;bin/calendarserver_load_augmentdb&quot;,
+            # &quot;bin/calendarserver_manage_postgres&quot;,
+            &quot;bin/calendarserver_manage_principals&quot;,
+            &quot;bin/calendarserver_manage_push&quot;,
+            &quot;bin/calendarserver_manage_timezones&quot;,
+            &quot;bin/calendarserver_migrate_resources&quot;,
+            # &quot;bin/calendarserver_monitor_amp_notifications&quot;,
+            # &quot;bin/calendarserver_monitor_notifications&quot;,
+            &quot;bin/calendarserver_purge_attachments&quot;,
+            &quot;bin/calendarserver_purge_events&quot;,
+            &quot;bin/calendarserver_purge_principals&quot;,
+            &quot;bin/calendarserver_shell&quot;,
+            &quot;bin/calendarserver_upgrade&quot;,
+            # &quot;bin/calendarserver_verify_data&quot;,
+        ],
</ins><span class="cx">         data_files=[(&quot;caldavd&quot;, [&quot;conf/caldavd.plist&quot;]), ],
</span><span class="cx">         ext_modules=extensions,
</span><span class="cx">         py_modules=[],
</span><span class="lines">@@ -177,7 +179,9 @@
</span><span class="cx">             install_lib = install_lib[len(root):]
</span><span class="cx"> 
</span><span class="cx">         for script in dist.scripts:
</span><del>-            scriptPath = os.path.join(install_scripts, os.path.basename(script))
</del><ins>+            scriptPath = os.path.join(
+                install_scripts, os.path.basename(script)
+            )
</ins><span class="cx"> 
</span><span class="cx">             print(&quot;rewriting {0}&quot;.format(scriptPath))
</span><span class="cx"> 
</span><span class="lines">@@ -196,17 +200,29 @@
</span><span class="cx">                 line = line.rstrip(&quot;\n&quot;)
</span><span class="cx">                 if fileType == &quot;sh&quot;:
</span><span class="cx">                     if line == &quot;#PYTHONPATH&quot;:
</span><del>-                        script.append('PYTHONPATH=&quot;{add}:$PYTHONPATH&quot;'.format(add=install_lib))
</del><ins>+                        script.append(
+                            'PYTHONPATH=&quot;{add}:$PYTHONPATH&quot;'
+                            .format(add=install_lib)
+                        )
</ins><span class="cx">                     elif line == &quot;#PATH&quot;:
</span><del>-                        script.append('PATH=&quot;{add}:$PATH&quot;'.format(add=os.path.join(base, &quot;usr&quot;, &quot;bin&quot;)))
</del><ins>+                        script.append(
+                            'PATH=&quot;{add}:$PATH&quot;'
+                            .format(add=os.path.join(base, &quot;usr&quot;, &quot;bin&quot;))
+                        )
</ins><span class="cx">                     else:
</span><span class="cx">                         script.append(line)
</span><span class="cx"> 
</span><span class="cx">                 elif fileType == &quot;python&quot;:
</span><span class="cx">                     if line == &quot;#PYTHONPATH&quot;:
</span><del>-                        script.append('PYTHONPATH=&quot;{path}&quot;'.format(path=install_lib))
</del><ins>+                        script.append(
+                            'PYTHONPATH=&quot;{path}&quot;'
+                            .format(path=install_lib)
+                        )
</ins><span class="cx">                     elif line == &quot;#PATH&quot;:
</span><del>-                        script.append('PATH=&quot;{path}&quot;'.format(path=os.path.join(base, &quot;usr&quot;, &quot;bin&quot;)))
</del><ins>+                        script.append(
+                            'PATH=&quot;{path}&quot;'
+                            .format(path=os.path.join(base, &quot;usr&quot;, &quot;bin&quot;))
+                        )
</ins><span class="cx">                     else:
</span><span class="cx">                         script.append(line)
</span><span class="cx"> 
</span><span class="lines">@@ -218,6 +234,5 @@
</span><span class="cx">             newScript.close()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> if __name__ == &quot;__main__&quot;:
</span><span class="cx">     doSetup()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessupportbuildsh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/support/build.sh        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,6 +16,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><ins>+set -e
+set -u
+
</ins><span class="cx"> . &quot;${wd}/support/py.sh&quot;;
</span><span class="cx"> 
</span><span class="cx"> echo_header () {
</span><span class="lines">@@ -51,55 +54,33 @@
</span><span class="cx"> #   Assert that ldap.h is present with a version &gt;= 20344
</span><span class="cx"> #     find_header &quot;ldap.h&quot; 20344 &quot;LDAP_VENDOR_VERSION&quot;
</span><span class="cx"> find_header () {
</span><del>-  ARGS=&quot;$@&quot;;
-  ret=1;  # default to a failed check, forcing a fetch of the depencency
-  i=0;
-  for a in $ARGS; do
-    [ $i -eq 0 ] &amp;&amp; local sysheader=&quot;$1&quot;;
-    [ $i -eq 1 ] &amp;&amp; local minver=&quot;$2&quot;;
-    [ $i -eq 2 ] &amp;&amp; local def=&quot;$3&quot;;
-    i=$(($i+1));
-  done;
-  [ ! $sysheader ] &amp;&amp; return 1;
</del><ins>+  sys_header=&quot;$1&quot;; shift;
+  if [ $# -ge 1 ]; then
+        min_version=&quot;$1&quot;; shift;
+      version_macro=&quot;$1&quot;; shift;
+  fi;
+
+  # No min_version given:
</ins><span class="cx">   # Check for presence of a header. We use the &quot;-c&quot; cc option because we don't
</span><span class="cx">   # need to emit a file; cc exits nonzero if it can't find the header
</span><del>-  if [ $# -lt 2 ]; then
-    echo &quot;#include &lt;${sysheader}&gt;&quot; | cc -x c -c - -o /dev/null 2&gt; /dev/null;
</del><ins>+  if [ -z &quot;${min_version:-}&quot; ]; then
+    echo &quot;#include &lt;${sys_header}&gt;&quot; | cc -x c -c - -o /dev/null 2&gt; /dev/null;
</ins><span class="cx">     return &quot;$?&quot;;
</span><ins>+  fi;
+
</ins><span class="cx">   # Check for presence of a header of specified version
</span><ins>+  found_version=&quot;$(printf &quot;#include &lt;${sys_header}&gt;\n${version_macro}\n&quot; | cc -x c -E - | tail -1)&quot;;
+
+  if [ &quot;${found_version}&quot; == &quot;${version_macro}&quot; ]; then
+    # Macro was not replaced
+    return 1;
+  fi;
+
+  if cmp_version &quot;${min_version}&quot; &quot;${found_version}&quot;; then
+    return 0;
</ins><span class="cx">   else
</span><del>-    found='';
-    local aout=$(mktemp -t ccXXXXXX); # compiled executable file path
-    local prog=$(mktemp -t ccXXXXXX); # C source file path
-    cat &lt;&lt;DOC &gt; ${prog}
-#include &lt;${sysheader}&gt;
-#include &lt;stdio.h&gt;
-#define STR(x)   #x
-#define SHOW_DEFINE(x) printf(&quot;%s&quot;, STR(x))
-int main()
-{
-    if (${def})
-    {
-        SHOW_DEFINE(${def});
-        return 0;
-    };
</del><span class="cx">     return 1;
</span><del>-};
-DOC
-    cc -x c -o ${aout} ${prog} &amp;&gt; /dev/null;
-    if [ $? -eq 0 ] &amp;&amp; [ -e ${aout} ] ; then
-      found=$(${aout});
-    fi;
-    if [ $? -eq 0 ] &amp;&amp; [ ! -z ${found} ] ; then
-      cmp_version $minver $found;
-      ret=$?;
-    else
-      ret=1;   #cc exited nonzero or didn't emit a file
-    fi;
-    rm -f &quot;${aout}&quot;;
-    rm -f &quot;${prog}&quot;;
</del><span class="cx">   fi;
</span><del>-  return $ret;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> # Initialize all the global state required to use this library.
</span><span class="lines">@@ -528,9 +509,7 @@
</span><span class="cx">                           # already has it?
</span><span class="cx">   local  inplace=&quot;&quot;;      # Do development in-place; don't run setup.py to
</span><span class="cx">                           # build, and instead add the source directory plus the
</span><del>-                          # given relative path directly to sys.path.  twisted
-                          # and pycalendar are developed often enough that this is
-                          # convenient.
</del><ins>+                          # given relative path directly to sys.path.
</ins><span class="cx">   local skip_egg=&quot;false&quot;; # Skip even the 'egg_info' step, because nothing needs
</span><span class="cx">                           # to be built.
</span><span class="cx">   local revision=&quot;0&quot;;     # Revision (if svn)
</span><span class="lines">@@ -730,13 +709,14 @@
</span><span class="cx">     using_system &quot;memcached&quot;;
</span><span class="cx">   else
</span><span class="cx">     local le=&quot;libevent-2.0.21-stable&quot;;
</span><del>-    local mc=&quot;memcached-1.4.15&quot;;
</del><ins>+    local mc=&quot;memcached-1.4.16&quot;;
</ins><span class="cx">     c_dependency -m &quot;b2405cc9ebf264aa47ff615d9de527a2&quot; \
</span><span class="cx">       &quot;libevent&quot; &quot;${le}&quot; \
</span><span class="cx">       &quot;http://github.com/downloads/libevent/libevent/${le}.tar.gz&quot;;
</span><del>-    c_dependency -m &quot;36ea966f5a29655be1746bf4949f7f69&quot; \
</del><ins>+    c_dependency -m &quot;1c5781fecb52d70b615c6d0c9c140c9c&quot; \
</ins><span class="cx">       &quot;memcached&quot; &quot;${mc}&quot; \
</span><del>-      &quot;http://memcached.googlecode.com/files/${mc}.tar.gz&quot;;
</del><ins>+      &quot;http://www.memcached.org/files/${mc}.tar.gz&quot;;
+    # &quot;http://memcached.googlecode.com/files/${mc}.tar.gz&quot;;
</ins><span class="cx">   fi;
</span><span class="cx"> 
</span><span class="cx">   if type -P postgres &gt; /dev/null; then
</span><span class="lines">@@ -796,6 +776,20 @@
</span><span class="cx">     &quot;setuptools&quot; &quot;setuptools&quot; &quot;${st}&quot; \
</span><span class="cx">     &quot;$pypi/s/setuptools/${st}.tar.gz&quot;;
</span><span class="cx"> 
</span><ins>+  local v=&quot;0.6&quot;;
+  local n=&quot;cffi&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -v &quot;0.6&quot; -m &quot;5be33b1ab0247a984d42b27344519337&quot; \
+    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;${pypi}/c/${n}/${p}.tar.gz&quot;;
+
+  local v=&quot;2.10&quot;;
+  local n=&quot;pycparser&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -v &quot;0.6&quot; -m &quot;d87aed98c8a9f386aa56d365fe4d515f&quot; \
+    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
+
</ins><span class="cx">   local v=&quot;4.0.5&quot;;
</span><span class="cx">   local n=&quot;zope.interface&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="lines">@@ -812,8 +806,10 @@
</span><span class="cx"> 
</span><span class="cx">   local n=&quot;PyKerberos&quot;;
</span><span class="cx">   if type -P krb5-config &gt; /dev/null; then
</span><del>-    py_dependency -r 9409 \
-      &quot;${n}&quot; &quot;kerberos&quot; &quot;${n}&quot; \
</del><ins>+    local v=&quot;9409&quot;;
+    local p=&quot;${n}-${v}&quot;;
+    py_dependency -r &quot;${v}&quot; \
+      &quot;${n}&quot; &quot;kerberos&quot; &quot;${p}&quot; \
</ins><span class="cx">       &quot;${svn_uri_base}/${n}/trunk&quot;;
</span><span class="cx">   fi;
</span><span class="cx"> 
</span><span class="lines">@@ -840,8 +836,27 @@
</span><span class="cx">     &quot;${n}&quot; &quot;pgdb&quot; &quot;${p}&quot; \
</span><span class="cx">     &quot;${pypi}/P/${n}/${p}.tgz&quot;;
</span><span class="cx"> 
</span><del>-  # Maintenance note: next time the Twisted dependency gets updated, check out
-  # twext/patches.py.
</del><ins>+  local v=&quot;0.1.2&quot;;
+  local n=&quot;sqlparse&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -v &quot;${v}&quot; -s &quot;978874e5ebbd78e6d419e8182ce4fb3c30379642&quot; \
+    &quot;SQLParse&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;http://python-sqlparse.googlecode.com/files/${p}.tar.gz&quot;;
+
+  local v=&quot;2.6.1&quot;;
+  local n=&quot;pycrypto&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -v &quot;${v}&quot; -m &quot;55a61a054aa66812daf5161a0d5d7eda&quot; \
+    &quot;PyCrypto&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;http://ftp.dlitz.net/pub/dlitz/crypto/${n}/${p}.tar.gz&quot;;
+
+  local v=&quot;0.1.7&quot;;
+  local n=&quot;pyasn1&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -v &quot;${v}&quot; -m &quot;2cbd80fcd4c7b1c82180d3d76fee18c8&quot; \
+    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
+
</ins><span class="cx">   local v=&quot;13.2.0&quot;;
</span><span class="cx">   local n=&quot;Twisted&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="lines">@@ -849,6 +864,13 @@
</span><span class="cx">     &quot;${n}&quot; &quot;twisted&quot; &quot;${p}&quot; \
</span><span class="cx">     &quot;${pypi}/T/${n}/${p}.tar.bz2&quot;;
</span><span class="cx"> 
</span><ins>+  local v=&quot;12094&quot;;
+  local n=&quot;twext&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -fe -r &quot;${v}&quot; \
+    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;${svn_uri_base}/${n}/trunk&quot;;
+
</ins><span class="cx">   local v=&quot;1.5&quot;;
</span><span class="cx">   local n=&quot;python-dateutil&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="lines">@@ -870,23 +892,26 @@
</span><span class="cx">     &quot;Python-LDAP&quot; &quot;ldap&quot; &quot;${p}&quot; \
</span><span class="cx">     &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
</span><span class="cx"> 
</span><del>-  # XXX actually PyCalendar should be imported in-place.
-  py_dependency -fe -i &quot;src&quot; -r 11947 \
-    &quot;PyCalendar&quot; &quot;pycalendar&quot; &quot;pycalendar&quot; \
-    &quot;${svn_uri_base}/PyCalendar/trunk&quot;;
</del><ins>+  local v=&quot;11947&quot;;
+  local n=&quot;PyCalendar&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -fe -i &quot;src&quot; -r &quot;${v}&quot; \
+    &quot;${n}&quot; &quot;pycalendar&quot; &quot;${p}&quot; \
+    &quot;${svn_uri_base}/${n}/trunk&quot;;
</ins><span class="cx"> 
</span><ins>+  # Can't add &quot;-v 2011g&quot; to args because the version check expects numbers.
+  local v=&quot;2013.8&quot;;
+  local n=&quot;pytz&quot;;
+  local p=&quot;${n}-${v}&quot;;
+  py_dependency -m &quot;37750ca749ed3a52523b9682b0b7e381&quot; \
+    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
+    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
+
</ins><span class="cx">   #
</span><span class="cx">   # Tool dependencies.  The code itself doesn't depend on these, but
</span><span class="cx">   # they are useful to developers.
</span><span class="cx">   #
</span><span class="cx"> 
</span><del>-  local v=&quot;0.1.2&quot;;
-  local n=&quot;sqlparse&quot;;
-  local p=&quot;${n}-${v}&quot;;
-  py_dependency -v &quot;${v}&quot; -s &quot;978874e5ebbd78e6d419e8182ce4fb3c30379642&quot; \
-    &quot;SQLParse&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;http://python-sqlparse.googlecode.com/files/${p}.tar.gz&quot;;
-
</del><span class="cx">   if type -P pyflakes &gt; /dev/null; then
</span><span class="cx">     using_system &quot;PyFlakes&quot;;
</span><span class="cx">   else
</span><span class="lines">@@ -898,32 +923,13 @@
</span><span class="cx">       &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
</span><span class="cx">   fi;
</span><span class="cx">  
</span><del>-  py_dependency -o -r HEAD \
-    &quot;CalDAVClientLibrary&quot; &quot;caldavclientlibrary&quot; &quot;CalDAVClientLibrary&quot; \
-    &quot;${svn_uri_base}/CalDAVClientLibrary/trunk&quot;;
-
-  # Can't add &quot;-v 2011g&quot; to args because the version check expects numbers.
-  local v=&quot;2013.8&quot;;
-  local n=&quot;pytz&quot;;
</del><ins>+  local v=&quot;12068&quot;;
+  local n=&quot;CalDAVClientLibrary&quot;;
</ins><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><del>-  py_dependency -m &quot;37750ca749ed3a52523b9682b0b7e381&quot; \
-    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
</del><ins>+  py_dependency -o -r &quot;${v}&quot; \
+    &quot;${n}&quot; &quot;caldavclientlibrary&quot; &quot;${p}&quot; \
+    &quot;${svn_uri_base}/${n}/trunk&quot;;
</ins><span class="cx"> 
</span><del>-  local v=&quot;2.6.1&quot;;
-  local n=&quot;pycrypto&quot;;
-  local p=&quot;${n}-${v}&quot;;
-  py_dependency -v &quot;${v}&quot; -m &quot;55a61a054aa66812daf5161a0d5d7eda&quot; \
-    &quot;PyCrypto&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;http://ftp.dlitz.net/pub/dlitz/crypto/${n}/${p}.tar.gz&quot;;
-
-  local v=&quot;0.1.7&quot;;
-  local n=&quot;pyasn1&quot;;
-  local p=&quot;${n}-${v}&quot;;
-  py_dependency -v &quot;${v}&quot; -m &quot;2cbd80fcd4c7b1c82180d3d76fee18c8&quot; \
-    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
-
</del><span class="cx">   local v=&quot;1.1.8&quot;;
</span><span class="cx">   local n=&quot;setproctitle&quot;;
</span><span class="cx">   local p=&quot;${n}-${v}&quot;;
</span><span class="lines">@@ -931,20 +937,6 @@
</span><span class="cx">     &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
</span><span class="cx">     &quot;${pypi}/s/${n}/${p}.tar.gz&quot;;
</span><span class="cx"> 
</span><del>-  local v=&quot;0.8&quot;;
-  local n=&quot;cffi&quot;;
-  local p=&quot;${n}-${v}&quot;;
-  py_dependency -v &quot;0.6&quot; -m &quot;e61deb0515311bb42d5d58b9403bc923&quot; \
-    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;${pypi}/c/${n}/${p}.tar.gz&quot;;
-
-  local v=&quot;2.10&quot;;
-  local n=&quot;pycparser&quot;;
-  local p=&quot;${n}-${v}&quot;;
-  py_dependency -v &quot;0.6&quot; -m &quot;d87aed98c8a9f386aa56d365fe4d515f&quot; \
-    &quot;${n}&quot; &quot;${n}&quot; &quot;${p}&quot; \
-    &quot;${pypi}/p/${n}/${p}.tar.gz&quot;;
-
</del><span class="cx">   svn_get &quot;CalDAVTester&quot; &quot;${top}/CalDAVTester&quot; \
</span><span class="cx">       &quot;${svn_uri_base}/CalDAVTester/trunk&quot; HEAD;
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixessupportpysh"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/support/py.sh        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,6 +15,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><ins>+set -e
+set -u
+
</ins><span class="cx"> # Echo the major.minor version of the given Python interpreter.
</span><span class="cx"> 
</span><span class="cx"> py_version () {
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestest"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/test (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/test        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/test        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,9 @@
</span><span class="cx"> 
</span><span class="cx"> wd=&quot;$(cd &quot;$(dirname &quot;$0&quot;)&quot; &amp;&amp; pwd -L)&quot;;
</span><span class="cx"> 
</span><del>-#. &quot;${wd}/support/build.sh&quot;;
</del><ins>+##
+# Options
+##
</ins><span class="cx"> 
</span><span class="cx"> do_setup=&quot;false&quot;;
</span><span class="cx"> do_get=&quot;false&quot;;
</span><span class="lines">@@ -78,15 +80,30 @@
</span><span class="cx">   test_modules=&quot;$@&quot;;
</span><span class="cx">   flaky=true;
</span><span class="cx"> else
</span><del>-  test_modules=&quot;calendarserver twistedcaldav twext txdav contrib ${m_twisted}&quot;;
</del><ins>+  test_modules=&quot;calendarserver twistedcaldav txdav contrib ${m_twisted}&quot;;
</ins><span class="cx">   flaky=true;
</span><span class="cx"> fi;
</span><span class="cx"> 
</span><ins>+
+##
+# Clean up
+##
+
</ins><span class="cx"> find &quot;${wd}&quot; -name \*.pyc -print0 | xargs -0 rm;
</span><span class="cx"> 
</span><ins>+
+##
+# Unit tests
+##
+
</ins><span class="cx"> mkdir -p &quot;${wd}/data&quot;;
</span><span class="cx"> cd &quot;${wd}&quot; &amp;&amp; &quot;${wd}/bin/trial&quot; --temp-directory=&quot;${wd}/data/trial&quot; --rterrors ${reactor} ${random} ${until_fail} ${no_colour} ${coverage} ${numjobs} ${test_modules};
</span><span class="cx"> 
</span><ins>+
+##
+# Code linting
+##
+
</ins><span class="cx"> if ${flaky}; then
</span><span class="cx">   echo &quot;&quot;;
</span><span class="cx">   echo &quot;Running pyflakes...&quot;;
</span><span class="lines">@@ -110,7 +127,7 @@
</span><span class="cx"> 
</span><span class="cx"> #tmp=&quot;$(mktemp &quot;/tmp/calendarserver_test_flakish.XXXXX&quot;)&quot;;
</span><span class="cx"> #echo &quot;&quot;;
</span><del>-#echo &quot;Checking for other issues...&quot;
</del><ins>+#echo &quot;Checking for legacy print statements...&quot;
</ins><span class="cx"> #search_py 'print  *[^(]' | sed 's|#.*||' | grep 'print  *[^(]' &gt; &quot;${tmp}&quot; || true;
</span><span class="cx"> #if [ -s &quot;${tmp}&quot; ]; then
</span><span class="cx"> #    echo &quot;**** Use of legacy print statement found. ****&quot;;
</span><span class="lines">@@ -119,6 +136,11 @@
</span><span class="cx"> #fi;
</span><span class="cx"> #rm -f &quot;${tmp}&quot;;
</span><span class="cx"> 
</span><ins>+
+##
+# Empty files
+##
+
</ins><span class="cx"> tmp=&quot;$(mktemp &quot;/tmp/calendarserver_test_emtpy.XXXXX&quot;)&quot;;
</span><span class="cx"> find &quot;${wd}&quot; '!' '(' -type d '(' -path '*/.*' -or -name data ')' -prune ')' -type f -size 0 &gt; &quot;${tmp}&quot;;
</span><span class="cx"> if [ -s &quot;${tmp}&quot; ]; then
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginscaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/caldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,6 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-__import__(&quot;twext&quot;) # install patches before doing anything
-
</del><span class="cx"> from zope.interface import implements
</span><span class="cx"> from twisted.plugin import IPlugin
</span><span class="cx"> from twisted.application.service import IServiceMaker
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginskqueuereactorpy"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/kqueuereactor.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,23 +0,0 @@
</span><del>-##
-# Copyright (c) 2012-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-# 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 &quot;AS IS&quot; 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__(&quot;twext&quot;)
-
-from twisted.application.reactors import Reactor
-
-caldav_kqueue = Reactor(
-    'caldav_kqueue', 'twext.internet.kqreactor',
-    'kqueue(2)-based reactor.')
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedpluginsmasterchildpy"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twisted/plugins/masterchild.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,58 +0,0 @@
</span><del>-##
-# Copyright (c) 2010-2013 Apple Inc. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-# 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 &quot;AS IS&quot; 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 zope.interface import implementer
-
-from twisted.python.reflect import namedClass
-from twisted.plugin import IPlugin
-from twisted.application.service import IServiceMaker
-
-from twext.application.masterchild import MasterOptions, ChildOptions
-
-
-@implementer(IPlugin, IServiceMaker)
-class ServiceMaker(object):
-    def __init__(self, name, description, options, serviceMakerClass):
-        self.tapname = name
-        self.description = description
-        self.options = options
-        self.serviceMakerClass = serviceMakerClass
-        self._serviceMaker = None
-
-
-    def makeService(self, options):
-        if self._serviceMaker is None:
-            self._serviceMaker = namedClass(self.serviceMakerClass)()
-
-        return self._serviceMaker.makeService(options)
-
-
-
-masterServiceMaker = ServiceMaker(
-    &quot;master&quot;,
-    &quot;Master process application container&quot;,
-    MasterOptions,
-    &quot;twext.application.masterchild.MasterServiceMaker&quot;
-)
-
-
-
-childServiceMaker = ServiceMaker(
-    &quot;child&quot;,
-    &quot;Child process application container&quot;,
-    ChildOptions,
-    &quot;twext.application.masterchild.ChildServiceMaker&quot;
-)
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,15 +21,11 @@
</span><span class="cx"> See RFC 4791.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__(&quot;twext&quot;)
-
</del><span class="cx"> #
</span><span class="cx"> # Load in suitable file extension/content-type map from OS X
</span><span class="cx"> #
</span><span class="cx"> 
</span><del>-from twext.web2.static import File, loadMimeTypes
</del><ins>+from txweb2.static import File, loadMimeTypes
</ins><span class="cx"> 
</span><span class="cx"> File.contentTypes = loadMimeTypes((&quot;/etc/apache2/mime.types&quot;, &quot;/etc/httpd/mime.types&quot;,))
</span><span class="cx"> 
</span><span class="lines">@@ -49,7 +45,7 @@
</span><span class="cx"> # DefaultHTTPHandler
</span><span class="cx"> #
</span><span class="cx"> 
</span><del>-from twext.web2.http_headers import DefaultHTTPHandler, last, singleHeader
</del><ins>+from txweb2.http_headers import DefaultHTTPHandler, last, singleHeader
</ins><span class="cx"> 
</span><span class="cx"> DefaultHTTPHandler.updateParsers({
</span><span class="cx">     &quot;If-Schedule-Tag-Match&quot;: (last, str),
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavauthkerbpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/authkerb.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,9 +42,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.cred import checkers, credentials, error
</span><span class="cx"> from twisted.internet.defer import succeed
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.interfaces import ICredentialFactory
-from twext.web2.dav.auth import IPrincipalCredentials
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.interfaces import ICredentialFactory
+from txweb2.dav.auth import IPrincipalCredentials
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbackuppy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/backup.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> import fnmatch
</span><span class="cx"> import commands
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import readPlist
</del><ins>+from plistlib import readPlist
</ins><span class="cx"> 
</span><span class="cx"> VERBOSE = os.environ.get('VERBOSE', False)
</span><span class="cx"> FUNCLOG = os.environ.get('FUNCLOG', False)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavbindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/bind.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,16 +19,16 @@
</span><span class="cx"> Have to have this in a separate module for now.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-from twext.web2.dav.util import bindMethods
</del><ins>+from txweb2.dav.util import bindMethods
</ins><span class="cx"> 
</span><span class="cx"> ##
</span><span class="cx"> # Attach methods
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> def doBind():
</span><del>-    import twext.web2.dav.method
-    from twext.web2.dav.resource import DAVResource
-    bindMethods(twext.web2.dav.method, DAVResource)
</del><ins>+    import txweb2.dav.method
+    from txweb2.dav.resource import DAVResource
+    bindMethods(txweb2.dav.method, DAVResource)
</ins><span class="cx"> 
</span><span class="cx">     import twistedcaldav.method
</span><span class="cx">     from twistedcaldav.resource import CalDAVResource
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavcachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/cache.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,10 +15,10 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-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
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.http import Response
+from txweb2.iweb import IResource
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclient__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.http_headers import DefaultHTTPHandler, tokenize, generateList, singleHeader
</del><ins>+from txweb2.http_headers import DefaultHTTPHandler, tokenize, generateList, singleHeader
</ins><span class="cx"> 
</span><span class="cx"> DefaultHTTPHandler.updateParsers({
</span><span class="cx">     &quot;x-forwarded-for&quot;: (tokenize, list),
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientpoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/pool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> from twisted.internet.error import ConnectionLost, ConnectionDone, ConnectError
</span><span class="cx"> from twisted.internet.protocol import ClientFactory
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.client.http import HTTPClientProtocol
-from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.client.http import HTTPClientProtocol
+from txweb2.http import StatusResponse, HTTPError
+from txweb2.dav.util import allDataFromStream
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> class PooledHTTPClientFactory(ClientFactory):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclientreverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/reverseproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,10 +20,10 @@
</span><span class="cx"> 
</span><span class="cx"> from zope.interface.declarations import implements
</span><span class="cx"> 
</span><del>-from twext.web2 import iweb, responsecode
-from twext.web2.client.http import ClientRequest
-from twext.web2.http import StatusResponse, HTTPError
-from twext.web2.resource import LeafResource
</del><ins>+from txweb2 import iweb, responsecode
+from txweb2.client.http import ClientRequest
+from txweb2.http import StatusResponse, HTTPError
+from txweb2.resource import LeafResource
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavclienttesttest_reverseproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/client/test/test_reverseproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> from twistedcaldav.client.pool import _clientPools
</span><span class="cx"> from twistedcaldav.client.reverseproxy import ReverseProxyResource
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersperuserdatapy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/peruserdata.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx"> 
</span><span class="cx">     # X- properties that are ignored - by default all X- properties are treated as per-user except for the
</span><span class="cx">     # ones listed here
</span><del>-    IGNORE_X_PROPERTIES = (Component.HIDDEN_INSTANCE_PROPERTY,)
</del><ins>+    IGNORE_X_PROPERTIES = [Component.HIDDEN_INSTANCE_PROPERTY]
</ins><span class="cx"> 
</span><span class="cx">     def __init__(self, uid):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafiltersprivateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/privateevents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> from twistedcaldav.caldavxml import Property, CalendarData, CalendarComponent, \
</span><span class="cx">     AllProperties, AllComponents
</span><span class="cx"> from twistedcaldav.datafilters.calendardata import CalendarDataFilter
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdatafilterstesttest_privateeventspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/datafilters/test/test_privateevents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.datafilters.privateevents import PrivateEventFilter
</span><span class="cx"> from twistedcaldav.ical import Component
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/addressbook.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,10 +26,10 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import ETag, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http_headers import ETag, MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryappleopendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/appleopendirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,7 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials
</del><ins>+from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.directory.cachingdirectory import CachingDirectoryService, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryaugmentpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/augment.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -79,6 +79,7 @@
</span><span class="cx">     &quot;groups&quot; : &quot;Group&quot;,
</span><span class="cx">     &quot;locations&quot; : &quot;Location&quot;,
</span><span class="cx">     &quot;resources&quot; : &quot;Resource&quot;,
</span><ins>+    &quot;addresses&quot; : &quot;Address&quot;,
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class AugmentDB(object):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycachingdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/cachingdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,9 +31,9 @@
</span><span class="cx"> import base64
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.memcacheclient import ClientFactory, MemcacheError
</del><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory, MemcacheError
</ins><span class="cx"> from twistedcaldav.directory.directory import DirectoryService, DirectoryRecord, DirectoryError, UnknownRecordTypeError
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import normalizeCUAddr
</span><span class="cx"> from twistedcaldav.directory.util import normalizeUUID
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import ETag, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http_headers import ETag, MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycalendaruserproxypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/calendaruserproxy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -31,12 +31,12 @@
</span><span class="cx"> import time
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.dav.util import joinURL
-from twext.web2.dav.noneprops import NonePropertyStore
</del><ins>+from txweb2.dav.util import joinURL
+from txweb2.dav.noneprops import NonePropertyStore
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorycommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,9 +16,9 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
+from txweb2.dav.util import joinURL
</ins><span class="cx"> from twistedcaldav.directory.util import transactionFromRequest, NotFoundResource
</span><span class="cx"> from twistedcaldav.directory.resource import DirectoryReverseProxyResource
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydigestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/digest.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,12 +17,12 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.cred import error
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.auth.digest import DigestCredentialFactory
-from twext.web2.auth.digest import DigestedCredentials
-from twext.web2.http_headers import Token
-from twext.web2.http_headers import parseKeyValue
-from twext.web2.http_headers import split
-from twext.web2.http_headers import tokenize
</del><ins>+from txweb2.auth.digest import DigestCredentialFactory
+from txweb2.auth.digest import DigestedCredentials
+from txweb2.http_headers import Token
+from txweb2.http_headers import parseKeyValue
+from txweb2.http_headers import split
+from txweb2.http_headers import tokenize
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><del>-Overrides twext.web2.auth.digest to allow specifying a qop value as a configuration parameter.
</del><ins>+Overrides txweb2.auth.digest to allow specifying a qop value as a configuration parameter.
</ins><span class="cx"> Also adds an sqlite-based credentials cache that is multi-process safe.
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx"> 
</span><span class="cx"> class QopDigestCredentialFactory(DigestCredentialFactory):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    See twext.web2.auth.digest.DigestCredentialFactory
</del><ins>+    See txweb2.auth.digest.DigestCredentialFactory
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, algorithm, qop, realm, namespace=&quot;DIGESTCREDENTIALS&quot;):
</span><span class="lines">@@ -196,7 +196,7 @@
</span><span class="cx">         @type response: C{str}
</span><span class="cx">         @param response: A string of comma seperated key=value pairs
</span><span class="cx"> 
</span><del>-        @type request: L{twext.web2.server.Request}
</del><ins>+        @type request: L{txweb2.server.Request}
</ins><span class="cx">         @param request: the request being processed
</span><span class="cx"> 
</span><span class="cx">         @return: L{DigestedCredentials}
</span><span class="lines">@@ -253,7 +253,7 @@
</span><span class="cx">         @param auth:        the response parameters.
</span><span class="cx">         @type auth:         C{dict}
</span><span class="cx">         @param request:     the request being processed.
</span><del>-        @type request:      L{twext.web2.server.Request}
</del><ins>+        @type request:      L{txweb2.server.Request}
</ins><span class="cx"> 
</span><span class="cx">         @return:            C{True} if validated.
</span><span class="cx">         @raise LoginFailed: if validation fails.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorydirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/directory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,8 +35,8 @@
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.enterprise.queue import WorkItem, PeerConnectionPool
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.auth import IPrincipalCredentials
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.auth import IPrincipalCredentials
+from txweb2.dav.util import joinURL
</ins><span class="cx"> 
</span><span class="cx"> from twisted.cred.checkers import ICredentialsChecker
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx">     recordType_groups = &quot;groups&quot;
</span><span class="cx">     recordType_locations = &quot;locations&quot;
</span><span class="cx">     recordType_resources = &quot;resources&quot;
</span><ins>+    recordType_addresses = &quot;addresses&quot;
</ins><span class="cx"> 
</span><span class="cx">     searchContext_location = &quot;location&quot;
</span><span class="cx">     searchContext_resource = &quot;resource&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryinternalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/internal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx">     &quot;InternalDirectoryService&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-from twext.web2.dav.auth import IPrincipalCredentials
</del><ins>+from txweb2.dav.auth import IPrincipalCredentials
</ins><span class="cx"> 
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/ldapdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -60,8 +60,8 @@
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.internet.threads import deferToThread
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2 import responsecode
</del><ins>+from txweb2.http import HTTPError, StatusResponse
+from txweb2 import responsecode
</ins><span class="cx"> 
</span><span class="cx"> class LdapDirectoryService(CachingDirectoryService):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -113,8 +113,6 @@
</span><span class="cx">                 &quot;guidAttr&quot;: &quot;entryUUID&quot;,
</span><span class="cx">                 &quot;users&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=People&quot;,
</span><del>-                    &quot;attr&quot;: &quot;uid&quot;, # used only to synthesize email address
-                    &quot;emailSuffix&quot;: None, # used only to synthesize email address
</del><span class="cx">                     &quot;filter&quot;: None, # additional filter for this type
</span><span class="cx">                     &quot;loginEnabledAttr&quot; : &quot;&quot;, # attribute controlling login
</span><span class="cx">                     &quot;loginEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
</span><span class="lines">@@ -130,8 +128,6 @@
</span><span class="cx">                 },
</span><span class="cx">                 &quot;groups&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Group&quot;,
</span><del>-                    &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                    &quot;emailSuffix&quot;: None, # used only to synthesize email address
</del><span class="cx">                     &quot;filter&quot;: None, # additional filter for this type
</span><span class="cx">                     &quot;mapping&quot; : { # maps internal record names to LDAP
</span><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="lines">@@ -143,23 +139,18 @@
</span><span class="cx">                 },
</span><span class="cx">                 &quot;locations&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Places&quot;,
</span><del>-                    &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                    &quot;emailSuffix&quot;: None, # used only to synthesize email address
</del><span class="cx">                     &quot;filter&quot;: None, # additional filter for this type
</span><span class="cx">                     &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling enabledForCalendaring
</span><span class="cx">                     &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
</span><ins>+                    &quot;associatedAddressAttr&quot; : &quot;&quot;,
</ins><span class="cx">                     &quot;mapping&quot; : { # maps internal record names to LDAP
</span><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="cx">                         &quot;fullName&quot; : &quot;cn&quot;,
</span><span class="cx">                         &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
</span><del>-                        &quot;firstName&quot; : &quot;givenName&quot;,
-                        &quot;lastName&quot; : &quot;sn&quot;,
</del><span class="cx">                     },
</span><span class="cx">                 },
</span><span class="cx">                 &quot;resources&quot;: {
</span><span class="cx">                     &quot;rdn&quot;: &quot;ou=Resources&quot;,
</span><del>-                    &quot;attr&quot;: &quot;cn&quot;, # used only to synthesize email address
-                    &quot;emailSuffix&quot;: None, # used only to synthesize email address
</del><span class="cx">                     &quot;filter&quot;: None, # additional filter for this type
</span><span class="cx">                     &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling enabledForCalendaring
</span><span class="cx">                     &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
</span><span class="lines">@@ -167,10 +158,18 @@
</span><span class="cx">                         &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="cx">                         &quot;fullName&quot; : &quot;cn&quot;,
</span><span class="cx">                         &quot;emailAddresses&quot; : [&quot;mail&quot;], # multiple LDAP fields supported
</span><del>-                        &quot;firstName&quot; : &quot;givenName&quot;,
-                        &quot;lastName&quot; : &quot;sn&quot;,
</del><span class="cx">                     },
</span><span class="cx">                 },
</span><ins>+                &quot;addresses&quot;: {
+                    &quot;rdn&quot;: &quot;ou=Buildings&quot;,
+                    &quot;filter&quot;: None, # additional filter for this type
+                    &quot;streetAddressAttr&quot; : &quot;&quot;,
+                    &quot;geoAttr&quot; : &quot;&quot;,
+                    &quot;mapping&quot; : { # maps internal record names to LDAP
+                        &quot;recordName&quot;: &quot;cn&quot;,
+                        &quot;fullName&quot; : &quot;cn&quot;,
+                    },
+                },
</ins><span class="cx">             },
</span><span class="cx">             &quot;groupSchema&quot;: {
</span><span class="cx">                 &quot;membersAttr&quot;: &quot;member&quot;, # how members are specified
</span><span class="lines">@@ -238,8 +237,10 @@
</span><span class="cx">         for recordType in self.recordTypes():
</span><span class="cx">             if self.rdnSchema[recordType][&quot;attr&quot;]:
</span><span class="cx">                 attrSet.add(self.rdnSchema[recordType][&quot;attr&quot;])
</span><del>-            if self.rdnSchema[recordType].get(&quot;calendarEnabledAttr&quot;, False):
-                attrSet.add(self.rdnSchema[recordType][&quot;calendarEnabledAttr&quot;])
</del><ins>+            for n in (&quot;calendarEnabledAttr&quot;, &quot;associatedAddressAttr&quot;,
+                &quot;streetAddressAttr&quot;, &quot;geoAttr&quot;):
+                if self.rdnSchema[recordType].get(n, False):
+                    attrSet.add(self.rdnSchema[recordType][n])
</ins><span class="cx">             for attrList in self.rdnSchema[recordType][&quot;mapping&quot;].values():
</span><span class="cx">                 if attrList:
</span><span class="cx">                     # Since emailAddresses can map to multiple LDAP fields,
</span><span class="lines">@@ -304,7 +305,7 @@
</span><span class="cx"> 
</span><span class="cx">         # Build filter
</span><span class="cx">         filterstr = &quot;(!(objectClass=organizationalUnit))&quot;
</span><del>-        typeFilter = self.rdnSchema[recordType][&quot;filter&quot;]
</del><ins>+        typeFilter = self.rdnSchema[recordType].get(&quot;filter&quot;, &quot;&quot;)
</ins><span class="cx">         if typeFilter:
</span><span class="cx">             filterstr = &quot;(&amp;%s%s)&quot; % (filterstr, typeFilter)
</span><span class="cx"> 
</span><span class="lines">@@ -778,6 +779,7 @@
</span><span class="cx">         enabledForAddressBooks = None
</span><span class="cx">         uid = None
</span><span class="cx">         enabledForLogin = True
</span><ins>+        extras = {}
</ins><span class="cx"> 
</span><span class="cx">         shortNames = tuple(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType][&quot;mapping&quot;][&quot;recordName&quot;]))
</span><span class="cx">         if not shortNames:
</span><span class="lines">@@ -794,17 +796,17 @@
</span><span class="cx"> 
</span><span class="cx">         # Find or build email
</span><span class="cx">         # (The emailAddresses mapping is a list of ldap fields)
</span><del>-        emailAddressesMappedTo = self.rdnSchema[recordType][&quot;mapping&quot;][&quot;emailAddresses&quot;]
</del><ins>+        emailAddressesMappedTo = self.rdnSchema[recordType][&quot;mapping&quot;].get(&quot;emailAddresses&quot;, &quot;&quot;)
</ins><span class="cx">         # Supporting either string or list for emailAddresses:
</span><span class="cx">         if isinstance(emailAddressesMappedTo, str):
</span><del>-            emailAddresses = set(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType][&quot;mapping&quot;][&quot;emailAddresses&quot;]))
</del><ins>+            emailAddresses = set(self._getMultipleLdapAttributes(attrs, self.rdnSchema[recordType][&quot;mapping&quot;].get(&quot;emailAddresses&quot;, &quot;&quot;)))
</ins><span class="cx">         else:
</span><span class="cx">             emailAddresses = set(self._getMultipleLdapAttributes(attrs, *self.rdnSchema[recordType][&quot;mapping&quot;][&quot;emailAddresses&quot;]))
</span><del>-        emailSuffix = self.rdnSchema[recordType][&quot;emailSuffix&quot;]
</del><ins>+        emailSuffix = self.rdnSchema[recordType].get(&quot;emailSuffix&quot;, None)
</ins><span class="cx"> 
</span><span class="cx">         if len(emailAddresses) == 0 and emailSuffix:
</span><span class="cx">             emailPrefix = self._getUniqueLdapAttribute(attrs,
</span><del>-                self.rdnSchema[recordType][&quot;attr&quot;])
</del><ins>+                self.rdnSchema[recordType].get(&quot;attr&quot;, &quot;cn&quot;))
</ins><span class="cx">             emailAddresses.add(emailPrefix + emailSuffix)
</span><span class="cx"> 
</span><span class="cx">         proxyGUIDs = ()
</span><span class="lines">@@ -890,6 +892,25 @@
</span><span class="cx">                     autoAcceptGroup = self._getUniqueLdapAttribute(attrs,
</span><span class="cx">                         self.resourceSchema[&quot;autoAcceptGroupAttr&quot;])
</span><span class="cx"> 
</span><ins>+            if recordType == self.recordType_locations:
+                if self.rdnSchema[recordType][&quot;associatedAddressAttr&quot;]:
+                    associatedAddress = self._getUniqueLdapAttribute(attrs,
+                        self.rdnSchema[recordType][&quot;associatedAddressAttr&quot;])
+                    if associatedAddress:
+                        extras[&quot;associatedAddress&quot;] = associatedAddress
+
+        elif recordType == self.recordType_addresses:
+            if self.rdnSchema[recordType].get(&quot;geoAttr&quot;, &quot;&quot;):
+                geo = self._getUniqueLdapAttribute(attrs,
+                    self.rdnSchema[recordType][&quot;geoAttr&quot;])
+                if geo:
+                    extras[&quot;geo&quot;] = geo
+            if self.rdnSchema[recordType].get(&quot;streetAddressAttr&quot;, &quot;&quot;):
+                street = self._getUniqueLdapAttribute(attrs,
+                    self.rdnSchema[recordType][&quot;streetAddressAttr&quot;])
+                if street:
+                    extras[&quot;streetAddress&quot;] = street
+
</ins><span class="cx">         serverID = None
</span><span class="cx">         if self.poddingSchema[&quot;serverIdAttr&quot;]:
</span><span class="cx">             serverID = self._getUniqueLdapAttribute(attrs,
</span><span class="lines">@@ -911,6 +932,7 @@
</span><span class="cx">             extProxies=proxyGUIDs,
</span><span class="cx">             extReadOnlyProxies=readOnlyProxyGUIDs,
</span><span class="cx">             attrs=attrs,
</span><ins>+            **extras
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         if self.augmentService is not None:
</span><span class="lines">@@ -981,7 +1003,7 @@
</span><span class="cx"> 
</span><span class="cx">             # Build filter
</span><span class="cx">             filterstr = &quot;(!(objectClass=organizationalUnit))&quot;
</span><del>-            typeFilter = self.rdnSchema[recordType][&quot;filter&quot;]
</del><ins>+            typeFilter = self.rdnSchema[recordType].get(&quot;filter&quot;, &quot;&quot;)
</ins><span class="cx">             if typeFilter:
</span><span class="cx">                 filterstr = &quot;(&amp;%s%s)&quot; % (filterstr, typeFilter)
</span><span class="cx"> 
</span><span class="lines">@@ -1003,17 +1025,17 @@
</span><span class="cx">             elif indexType == self.INDEX_TYPE_CUA:
</span><span class="cx">                 # indexKey is of the form &quot;mailto:test@example.net&quot;
</span><span class="cx">                 email = indexKey[7:] # strip &quot;mailto:&quot;
</span><del>-                emailSuffix = self.rdnSchema[recordType][&quot;emailSuffix&quot;]
</del><ins>+                emailSuffix = self.rdnSchema[recordType].get(&quot;emailSuffix&quot;, None)
</ins><span class="cx">                 if emailSuffix is not None and email.partition(&quot;@&quot;)[2] == emailSuffix:
</span><span class="cx">                     filterstr = &quot;(&amp;%s(|(&amp;(!(mail=*))(%s=%s))(mail=%s)))&quot; % (
</span><span class="cx">                         filterstr,
</span><del>-                        self.rdnSchema[recordType][&quot;attr&quot;],
</del><ins>+                        self.rdnSchema[recordType].get(&quot;attr&quot;, &quot;cn&quot;),
</ins><span class="cx">                         email.partition(&quot;@&quot;)[0],
</span><span class="cx">                         ldapEsc(email)
</span><span class="cx">                     )
</span><span class="cx">                 else:
</span><span class="cx">                     # emailAddresses can map to multiple LDAP fields
</span><del>-                    ldapFields = self.rdnSchema[recordType][&quot;mapping&quot;][&quot;emailAddresses&quot;]
</del><ins>+                    ldapFields = self.rdnSchema[recordType][&quot;mapping&quot;].get(&quot;emailAddresses&quot;, &quot;&quot;)
</ins><span class="cx">                     if isinstance(ldapFields, str):
</span><span class="cx">                         if ldapFields:
</span><span class="cx">                             subfilter = &quot;(%s=%s)&quot; % (ldapFields, ldapEsc(email))
</span><span class="lines">@@ -1108,7 +1130,7 @@
</span><span class="cx">             typeCounts[recordType] = 0
</span><span class="cx">             base = self.typeDNs[recordType]
</span><span class="cx">             scope = ldap.SCOPE_SUBTREE
</span><del>-            extraFilter = self.rdnSchema[recordType][&quot;filter&quot;]
</del><ins>+            extraFilter = self.rdnSchema[recordType].get(&quot;filter&quot;, &quot;&quot;)
</ins><span class="cx">             filterstr = buildFilterFromTokens(recordType, self.rdnSchema[recordType][&quot;mapping&quot;],
</span><span class="cx">                 tokens, extra=extraFilter)
</span><span class="cx"> 
</span><span class="lines">@@ -1509,7 +1531,7 @@
</span><span class="cx">         guid, shortNames, authIDs, fullName,
</span><span class="cx">         firstName, lastName, emailAddresses,
</span><span class="cx">         uid, dn, memberGUIDs, extProxies, extReadOnlyProxies,
</span><del>-        attrs
</del><ins>+        attrs, **kwargs
</ins><span class="cx">     ):
</span><span class="cx">         super(LdapDirectoryRecord, self).__init__(
</span><span class="cx">             service=service,
</span><span class="lines">@@ -1524,6 +1546,7 @@
</span><span class="cx">             extProxies=extProxies,
</span><span class="cx">             extReadOnlyProxies=extReadOnlyProxies,
</span><span class="cx">             uid=uid,
</span><ins>+            **kwargs
</ins><span class="cx">         )
</span><span class="cx"> 
</span><span class="cx">         # Save attributes of dn and attrs in case you might need them later
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryopendirectorybackerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/opendirectorybacker.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -46,9 +46,9 @@
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import twisted_dav_namespace, dav_namespace, parse_date, twisted_private_namespace
</span><del>-from twext.web2.dav.resource import DAVPropertyMixIn
-from twext.web2.dav.util import joinURL
-from twext.web2.http_headers import MimeType, generateContentType, ETag
</del><ins>+from txweb2.dav.resource import DAVPropertyMixIn
+from txweb2.dav.util import joinURL
+from txweb2.http_headers import MimeType, generateContentType, ETag
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav import customxml, carddavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryprincipalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/principal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,12 +38,12 @@
</span><span class="cx"> from twisted.web.template import XMLFile, Element, renderer, tags
</span><span class="cx"> from twistedcaldav.directory.util import NotFoundResource
</span><span class="cx"> 
</span><del>-from twext.web2.auth.digest import DigestedCredentials
-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.auth.digest import DigestedCredentials
+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import joinURL
-from twext.web2.dav.noneprops import NonePropertyStore
</del><ins>+from txweb2.dav.util import joinURL
+from txweb2.dav.noneprops import NonePropertyStore
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> Implements a directory-backed principal hierarchy.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.client.reverseproxy import ReverseProxyResource
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_aggregatepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_aggregate.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -56,6 +56,7 @@
</span><span class="cx">     groups = property(_records(&quot;groups&quot;))
</span><span class="cx">     locations = property(_records(&quot;locations&quot;))
</span><span class="cx">     resources = property(_records(&quot;resources&quot;))
</span><ins>+    addresses = property(_records(&quot;addresses&quot;))
</ins><span class="cx"> 
</span><span class="cx">     recordTypePrefixes = tuple(s[0] for s in testServices)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_digestpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_digest.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,16 +21,16 @@
</span><span class="cx"> from twisted.internet import address
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python import failure
</span><del>-from twext.web2.auth import digest
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.auth import digest
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.directory.digest import QopDigestCredentialFactory
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> from twistedcaldav.config import config
</span><del>-from twext.web2.auth.digest import DigestCredentialFactory
-from twext.web2.test.test_httpauth import makeDigestDeterministic
-from twext.web2.test.test_httpauth import FAKE_STATIC_NONCE
</del><ins>+from txweb2.auth.digest import DigestCredentialFactory
+from txweb2.test.test_httpauth import makeDigestDeterministic
+from txweb2.test.test_httpauth import FAKE_STATIC_NONCE
</ins><span class="cx"> 
</span><span class="cx"> class FakeDigestCredentialFactory(QopDigestCredentialFactory):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_guidchangepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_guidchange.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,8 +18,8 @@
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.dav.resource import AccessDeniedError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.directory.test.util import maybeCommit
</span><span class="cx"> from twistedcaldav.test.util import TestCase, xmlFile
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_ldapdirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_ldapdirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -541,8 +541,6 @@
</span><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="cx">                             &quot;fullName&quot; : &quot;cn&quot;,
</span><span class="cx">                             &quot;emailAddresses&quot; : [&quot;mail&quot;, &quot;emailAliases&quot;],
</span><del>-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;locations&quot;: {
</span><span class="lines">@@ -552,12 +550,11 @@
</span><span class="cx">                         &quot;filter&quot;: &quot;(objectClass=apple-resource)&quot;, # additional filter for this type
</span><span class="cx">                         &quot;calendarEnabledAttr&quot; : &quot;&quot;, # attribute controlling calendaring
</span><span class="cx">                         &quot;calendarEnabledValue&quot; : &quot;yes&quot;, # &quot;True&quot; value of above attribute
</span><ins>+                        &quot;associatedAddressAttr&quot; : &quot;assocAddr&quot;,
</ins><span class="cx">                         &quot;mapping&quot;: { # maps internal record names to LDAP
</span><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="cx">                             &quot;fullName&quot; : &quot;cn&quot;,
</span><span class="cx">                             &quot;emailAddresses&quot; : &quot;&quot;, # old style, single string
</span><del>-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><span class="cx">                         },
</span><span class="cx">                     },
</span><span class="cx">                     &quot;resources&quot;: {
</span><span class="lines">@@ -571,10 +568,17 @@
</span><span class="cx">                             &quot;recordName&quot;: &quot;cn&quot;,
</span><span class="cx">                             &quot;fullName&quot; : &quot;cn&quot;,
</span><span class="cx">                             &quot;emailAddresses&quot; : [], # new style, array
</span><del>-                            &quot;firstName&quot; : &quot;givenName&quot;,
-                            &quot;lastName&quot; : &quot;sn&quot;,
</del><span class="cx">                         },
</span><span class="cx">                     },
</span><ins>+                    &quot;addresses&quot;: {
+                        &quot;rdn&quot;: &quot;cn=Buildings&quot;,
+                        &quot;geoAttr&quot; : &quot;coordinates&quot;,
+                        &quot;streetAddressAttr&quot; : &quot;postal&quot;,
+                        &quot;mapping&quot;: { # maps internal record names to LDAP
+                            &quot;recordName&quot;: &quot;cn&quot;,
+                            &quot;fullName&quot; : &quot;cn&quot;,
+                        },
+                    },
</ins><span class="cx">                 },
</span><span class="cx">                 &quot;groupSchema&quot;: {
</span><span class="cx">                     &quot;membersAttr&quot;: &quot;uniqueMember&quot;, # how members are specified
</span><span class="lines">@@ -1514,6 +1518,39 @@
</span><span class="cx">                 self.service.recordType_users)
</span><span class="cx">             self.assertEquals(record.guid, guid.upper())
</span><span class="cx"> 
</span><ins>+            # Location with associated Address
+
+            dn = &quot;cn=odtestlocation,cn=locations,dc=example,dc=com&quot;
+            guid = &quot;D3094652-344B-4633-8DB8-09639FA00FB6&quot;
+            attrs = {
+                &quot;apple-generateduid&quot;: [guid],
+                &quot;cn&quot;: [&quot;odtestlocation&quot;],
+                &quot;assocAddr&quot; : [&quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;],
+            }
+            record = self.service._ldapResultToRecord(dn, attrs,
+                self.service.recordType_locations)
+            self.assertEquals(record.extras, {
+                &quot;associatedAddress&quot;: &quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;
+            })
+           
+            # Address with street and geo
+
+            dn = &quot;cn=odtestaddress,cn=buildings,dc=example,dc=com&quot;
+            guid = &quot;6C6CD280-E6E3-11DF-9492-0800200C9A66&quot;
+            attrs = {
+                &quot;apple-generateduid&quot;: [guid],
+                &quot;cn&quot;: [&quot;odtestaddress&quot;],
+                &quot;coordinates&quot; : [&quot;geo:1,2&quot;],
+                &quot;postal&quot; : [&quot;1 Infinite Loop, Cupertino, CA&quot;],
+            }
+            record = self.service._ldapResultToRecord(dn, attrs,
+                self.service.recordType_addresses)
+            self.assertEquals(record.extras, {
+                &quot;geo&quot;: &quot;geo:1,2&quot;,
+                &quot;streetAddress&quot; : &quot;1 Infinite Loop, Cupertino, CA&quot;,
+            })
+           
+
</ins><span class="cx">         def test_listRecords(self):
</span><span class="cx">             &quot;&quot;&quot;
</span><span class="cx">             listRecords makes an LDAP query (with fake results in this test)
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_opendirectorypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_opendirectory.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> else:
</span><span class="cx">     from calendarserver.platform.darwin.od import dsattributes
</span><span class="cx">     from collections import defaultdict
</span><del>-    from twext.web2.auth.digest import DigestedCredentials
</del><ins>+    from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx">     from twisted.internet.defer import inlineCallbacks
</span><span class="cx">     from twisted.python.runtime import platform
</span><span class="cx">     from twisted.trial.unittest import SkipTest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_principalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_principal.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,10 +20,10 @@
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.fileop import rmdir
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.dav.fileop import rmdir
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.cache import DisabledCacheNotifier
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_wikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_wiki.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,8 +20,8 @@
</span><span class="cx"> )
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twisted.web.xmlrpc import Fault
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
</ins><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twisted.web.error import Error as WebError
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytesttest_xmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/test_xmlfile.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,7 +34,8 @@
</span><span class="cx">         DirectoryService.recordType_users,
</span><span class="cx">         DirectoryService.recordType_groups,
</span><span class="cx">         DirectoryService.recordType_locations,
</span><del>-        DirectoryService.recordType_resources
</del><ins>+        DirectoryService.recordType_resources,
+        DirectoryService.recordType_addresses,
</ins><span class="cx">     ))
</span><span class="cx"> 
</span><span class="cx">     users = {
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorytestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials, calcResponse, calcHA1
</del><ins>+from txweb2.auth.digest import DigestedCredentials, calcResponse, calcHA1
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx"> from twistedcaldav.directory.directory import UnknownRecordTypeError
</span><span class="lines">@@ -44,6 +44,10 @@
</span><span class="cx">     # Subclass should init this to a dict of resourcenames keys and dict values.
</span><span class="cx">     resources = {}
</span><span class="cx"> 
</span><ins>+    # Subclass should init this to a dict of addressname keys and dict values.
+    addresses = {}
+
+
</ins><span class="cx">     # Subclass should init this to an IDirectoryService implementation class.
</span><span class="cx">     def service(self):
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.dav.resource import DAVResource
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.dav.resource import DAVResource
+from txweb2.http import StatusResponse
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from uuid import UUID, uuid5
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorywikipy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/wiki.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.internet.gaiendpoint import MultiFailure
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.auth.wrapper import UnauthorizedResponse
-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.auth.wrapper import UnauthorizedResponse
+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.web.error import Error as WebError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlaccountsparserpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlaccountsparser.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> ELEMENT_GROUP             = &quot;group&quot;
</span><span class="cx"> ELEMENT_LOCATION          = &quot;location&quot;
</span><span class="cx"> ELEMENT_RESOURCE          = &quot;resource&quot;
</span><ins>+ELEMENT_ADDRESS           = &quot;address&quot;
</ins><span class="cx"> 
</span><span class="cx"> ELEMENT_SHORTNAME         = &quot;uid&quot;
</span><span class="cx"> ELEMENT_GUID              = &quot;guid&quot;
</span><span class="lines">@@ -65,6 +66,7 @@
</span><span class="cx">     ELEMENT_GROUP    : DirectoryService.recordType_groups,
</span><span class="cx">     ELEMENT_LOCATION : DirectoryService.recordType_locations,
</span><span class="cx">     ELEMENT_RESOURCE : DirectoryService.recordType_resources,
</span><ins>+    ELEMENT_ADDRESS  : DirectoryService.recordType_addresses,
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class XMLAccountsParser(object):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectoryxmlfilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directory/xmlfile.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> import types
</span><span class="cx"> 
</span><span class="cx"> from twisted.cred.credentials import UsernamePassword
</span><del>-from twext.web2.auth.digest import DigestedCredentials
</del><ins>+from txweb2.auth.digest import DigestedCredentials
</ins><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="lines">@@ -71,6 +71,7 @@
</span><span class="cx">                 self.recordType_groups,
</span><span class="cx">                 self.recordType_locations,
</span><span class="cx">                 self.recordType_resources,
</span><ins>+                self.recordType_addresses,
</ins><span class="cx">             ),
</span><span class="cx">             'realmName' : '/Search',
</span><span class="cx">             'statSeconds' : 15,
</span><span class="lines">@@ -373,6 +374,7 @@
</span><span class="cx">             'groups'    : 'group',
</span><span class="cx">             'locations' : 'location',
</span><span class="cx">             'resources' : 'resource',
</span><ins>+            'addresses' : 'address',
</ins><span class="cx">         }
</span><span class="cx">         xmlType = xmlTypes[principal.recordType]
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdirectorybackedaddressbookpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/directorybackedaddressbook.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,10 +23,10 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, maybeDeferred, returnValue
</span><span class="cx"> from twisted.python.reflect import namedClass
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavdropboxpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/dropbox.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,11 +24,11 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.resource import DAVResource, TwistedACLInheritable
-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.resource import DAVResource, TwistedACLInheritable
+from txweb2.dav.util import joinURL
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavextensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/extensions.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -40,23 +40,23 @@
</span><span class="cx"> from twisted.web.template import Element, XMLFile, renderer, tags, flattenString
</span><span class="cx"> from twisted.python.modules import getModule
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode, server
-from twext.web2.http import HTTPError, Response, RedirectResponse
-from twext.web2.http import StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import FileStream
-from twext.web2.static import MetaDataMixin, StaticRenderMixin
</del><ins>+from txweb2 import responsecode, server
+from txweb2.http import HTTPError, Response, RedirectResponse
+from txweb2.http import StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import FileStream
+from txweb2.static import MetaDataMixin, StaticRenderMixin
</ins><span class="cx"> from txdav.xml import element
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx"> from txdav.xml.element import dav_namespace
</span><del>-from twext.web2.dav.http import MultiStatusResponse
-from twext.web2.dav.static import DAVFile as SuperDAVFile
-from twext.web2.dav.resource import DAVResource as SuperDAVResource
-from twext.web2.dav.resource import (
</del><ins>+from txweb2.dav.http import MultiStatusResponse
+from txweb2.dav.static import DAVFile as SuperDAVFile
+from txweb2.dav.resource import DAVResource as SuperDAVResource
+from txweb2.dav.resource import (
</ins><span class="cx">     DAVPrincipalResource as SuperDAVPrincipalResource
</span><span class="cx"> )
</span><span class="cx"> from twisted.internet.defer import gatherResults
</span><del>-from twext.web2.dav.method import prop_common
</del><ins>+from txweb2.dav.method import prop_common
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><span class="lines">@@ -541,7 +541,7 @@
</span><span class="cx">                    SuperDAVResource,
</span><span class="cx">                    DirectoryRenderingMixIn, StaticRenderMixin):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Extended L{twext.web2.dav.resource.DAVResource} implementation.
</del><ins>+    Extended L{txweb2.dav.resource.DAVResource} implementation.
</ins><span class="cx"> 
</span><span class="cx">     Note we add StaticRenderMixin as a base class because we need all the etag etc behavior
</span><span class="cx">     that is currently in static.py but is actually applicable to any type of resource.
</span><span class="lines">@@ -577,7 +577,7 @@
</span><span class="cx"> 
</span><span class="cx"> class DAVResourceWithChildrenMixin (object):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Bits needed from twext.web2.static
</del><ins>+    Bits needed from txweb2.static
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, principalCollections=None):
</span><span class="lines">@@ -646,7 +646,7 @@
</span><span class="cx"> 
</span><span class="cx"> class DAVResourceWithoutChildrenMixin (object):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Bits needed from twext.web2.static
</del><ins>+    Bits needed from txweb2.static
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">     def __init__(self, principalCollections=None):
</span><span class="lines">@@ -670,7 +670,7 @@
</span><span class="cx">                             SuperDAVPrincipalResource,
</span><span class="cx">                             DirectoryRenderingMixIn):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Extended L{twext.web2.dav.static.DAVFile} implementation.
</del><ins>+    Extended L{txweb2.dav.static.DAVFile} implementation.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span><span class="lines">@@ -761,7 +761,7 @@
</span><span class="cx"> 
</span><span class="cx"> class DAVFile (SuperDAVFile, DirectoryRenderingMixIn):
</span><span class="cx">     &quot;&quot;&quot;
</span><del>-    Extended L{twext.web2.dav.static.DAVFile} implementation.
</del><ins>+    Extended L{txweb2.dav.static.DAVFile} implementation.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     log = Logger()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavfreebusyurlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/freebusyurl.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,15 +25,15 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError
-from twext.web2.http import Response
-from twext.web2.http import StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError
+from txweb2.http import Response
+from txweb2.http import StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import TimeRange
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/ical.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,8 +35,8 @@
</span><span class="cx"> import uuid
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.stream import IStream
-from twext.web2.dav.util import allDataFromStream
</del><ins>+from txweb2.stream import IStream
+from txweb2.dav.util import allDataFromStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.dateops import timeRangesOverlap, normalizeForIndex, differenceDateTime, \
</span><span class="lines">@@ -3418,7 +3418,33 @@
</span><span class="cx">         return False
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def hasDuplicatePrivateComments(self, doFix=False):
+        &quot;&quot;&quot;
+        Test and optionally remove &quot;X-CALENDARSERVER-ATTENDEE-COMMENT&quot; properties that have the same
+        &quot;X-CALENDARSERVER-ATTENDEE-REF&quot; parameter values in the same component.
</ins><span class="cx"> 
</span><ins>+        @return: C{True} if there are duplicates that were not fixed.
+        &quot;&quot;&quot;
+        if self.name() == &quot;VCALENDAR&quot;:
+            for component in self.subcomponents():
+                if component.name() in (&quot;VTIMEZONE&quot;,):
+                    continue
+                if component.hasDuplicatePrivateComments(doFix):
+                    return True
+        else:
+            attendee_refs = set()
+            for prop in tuple(self.properties(&quot;X-CALENDARSERVER-ATTENDEE-COMMENT&quot;)):
+                ref = prop.parameterValue(&quot;X-CALENDARSERVER-ATTENDEE-REF&quot;)
+                if ref in attendee_refs:
+                    if doFix:
+                        self.removeProperty(prop)
+                    else:
+                        return True
+                attendee_refs.add(ref)
+        return False
+
+
+
</ins><span class="cx"> # #
</span><span class="cx"> # Timezones
</span><span class="cx"> # #
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavicaldavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/icaldav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx">     &quot;ICalendarPrincipalResource&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-from twext.web2.dav.idav import IDAVResource
</del><ins>+from txweb2.dav.idav import IDAVResource
</ins><span class="cx"> 
</span><span class="cx"> class ICalDAVResource(IDAVResource):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavlinkresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/linkresource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,10 +16,10 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode, server, http
</del><ins>+from txweb2 import responsecode, server, http
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.resource import WrapperResource
</del><ins>+from txweb2.http import HTTPError, StatusResponse
+from txweb2.resource import WrapperResource
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcacheclientpyfromrev12132CalendarServertrunktwistedcaldavmemcacheclientpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py (from rev 12132, CalendarServer/trunk/twistedcaldav/memcacheclient.py) (0 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py                                (rev 0)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheclient.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -0,0 +1,1457 @@
</span><ins>+#!/usr/bin/env python
+from __future__ import print_function
+
+&quot;&quot;&quot;
+client module for memcached (memory cache daemon)
+
+Overview
+========
+
+See U{the MemCached homepage&lt;http://www.danga.com/memcached&gt;} for more about memcached.
+
+Usage summary
+=============
+
+This should give you a feel for how this module operates::
+
+    import memcacheclient
+    mc = memcacheclient.Client(['127.0.0.1:11211'], debug=0)
+
+    mc.set(&quot;some_key&quot;, &quot;Some value&quot;)
+    value = mc.get(&quot;some_key&quot;)
+
+    mc.set(&quot;another_key&quot;, 3)
+    mc.delete(&quot;another_key&quot;)
+
+    mc.set(&quot;key&quot;, &quot;1&quot;)   # note that the key used for incr/decr must be a string.
+    mc.incr(&quot;key&quot;)
+    mc.decr(&quot;key&quot;)
+
+The standard way to use memcache with a database is like this::
+
+    key = derive_key(obj)
+    obj = mc.get(key)
+    if not obj:
+        obj = backend_api.get(...)
+        mc.set(obj)
+
+    # we now have obj, and future passes through this code
+    # will use the object from the cache.
+
+Detailed Documentation
+======================
+
+More detailed documentation is available in the L{Client} class.
+&quot;&quot;&quot;
+
+import sys
+import socket
+import time
+import os
+import re
+import types
+
+from twext.python.log import Logger
+
+from twistedcaldav.config import config
+
+log = Logger()
+
+
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+try:
+    from zlib import compress, decompress
+    _supports_compress = True
+except ImportError:
+    _supports_compress = False
+    # quickly define a decompress just in case we recv compressed data.
+    def decompress(val):
+        raise _Error(&quot;received compressed data but I don't support compession (import error)&quot;)
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+from binascii import crc32   # zlib version is not cross-platform
+serverHashFunction = crc32
+
+__author__    = &quot;Evan Martin &lt;martine@danga.com&gt;&quot;
+__version__ = &quot;1.44&quot;
+__copyright__ = &quot;Copyright (C) 2003 Danga Interactive&quot;
+__license__   = &quot;Python&quot;
+
+SERVER_MAX_KEY_LENGTH = 250
+#  Storing values larger than 1MB requires recompiling memcached.  If you do,
+#  this value can be changed by doing &quot;memcacheclient.SERVER_MAX_VALUE_LENGTH = N&quot;
+#  after importing this module.
+SERVER_MAX_VALUE_LENGTH = 1024*1024
+
+class _Error(Exception):
+    pass
+
+class MemcacheError(_Error):
+    &quot;&quot;&quot;
+    Memcache connection error
+    &quot;&quot;&quot;
+
+class NotFoundError(MemcacheError):
+    &quot;&quot;&quot;
+    NOT_FOUND error
+    &quot;&quot;&quot;
+
+class TokenMismatchError(MemcacheError):
+    &quot;&quot;&quot;
+    Check-and-set token mismatch
+    &quot;&quot;&quot;
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # TODO:  add the pure-python local implementation
+    class local(object):
+        pass
+
+class ClientFactory(object):
+
+    # unit tests should set this to True to enable the fake test cache
+    allowTestCache = False
+
+    @classmethod
+    def getClient(cls, servers, debug=0, pickleProtocol=0,
+                 pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+                 pload=None, pid=None):
+
+        if cls.allowTestCache:
+            return TestClient(servers, debug=debug,
+                pickleProtocol=pickleProtocol, pickler=pickler,
+                unpickler=unpickler, pload=pload, pid=pid)
+        elif config.Memcached.Pools.Default.ClientEnabled:
+            return Client(servers, debug=debug, pickleProtocol=pickleProtocol,
+                pickler=pickler, unpickler=unpickler, pload=pload, pid=pid)
+        else:
+            return None
+
+
+class Client(local):
+    &quot;&quot;&quot;
+    Object representing a pool of memcache servers.
+
+    See L{memcache} for an overview.
+
+    In all cases where a key is used, the key can be either:
+        1. A simple hashable type (string, integer, etc.).
+        2. A tuple of C{(hashvalue, key)}.  This is useful if you want to avoid
+        making this module calculate a hash value.  You may prefer, for
+        example, to keep all of a given user's objects on the same memcache
+        server, so you could use the user's unique id as the hash value.
+
+    @group Setup: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog
+    @group Insertion: set, add, replace, set_multi
+    @group Retrieval: get, get_multi
+    @group Integers: incr, decr
+    @group Removal: delete, delete_multi
+    @sort: __init__, set_servers, forget_dead_hosts, disconnect_all, debuglog,\
+           set, set_multi, add, replace, get, get_multi, incr, decr, delete, delete_multi
+    &quot;&quot;&quot;
+    _FLAG_PICKLE  = 1&lt;&lt;0
+    _FLAG_INTEGER = 1&lt;&lt;1
+    _FLAG_LONG    = 1&lt;&lt;2
+    _FLAG_COMPRESSED = 1&lt;&lt;3
+
+    _SERVER_RETRIES = 10  # how many times to try finding a free server.
+
+    # exceptions for Client
+    class MemcachedKeyError(Exception):
+        pass
+    class MemcachedKeyLengthError(MemcachedKeyError):
+        pass
+    class MemcachedKeyCharacterError(MemcachedKeyError):
+        pass
+    class MemcachedKeyNoneError(MemcachedKeyError):
+        pass
+    class MemcachedKeyTypeError(MemcachedKeyError):
+        pass
+    class MemcachedStringEncodingError(Exception):
+        pass
+
+    def __init__(self, servers, debug=0, pickleProtocol=0,
+                 pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+                 pload=None, pid=None):
+        &quot;&quot;&quot;
+        Create a new Client object with the given list of servers.
+
+        @param servers: C{servers} is passed to L{set_servers}.
+        @param debug: whether to display error messages when a server can't be
+        contacted.
+        @param pickleProtocol: number to mandate protocol used by (c)Pickle.
+        @param pickler: optional override of default Pickler to allow subclassing.
+        @param unpickler: optional override of default Unpickler to allow subclassing.
+        @param pload: optional persistent_load function to call on pickle loading.
+        Useful for cPickle since subclassing isn't allowed.
+        @param pid: optional persistent_id function to call on pickle storing.
+        Useful for cPickle since subclassing isn't allowed.
+        &quot;&quot;&quot;
+        local.__init__(self)
+        self.set_servers(servers)
+        self.debug = debug
+        self.stats = {}
+
+        # Allow users to modify pickling/unpickling behavior
+        self.pickleProtocol = pickleProtocol
+        self.pickler = pickler
+        self.unpickler = unpickler
+        self.persistent_load = pload
+        self.persistent_id = pid
+
+        #  figure out the pickler style
+        file = StringIO()
+        try:
+            pickler = self.pickler(file, protocol = self.pickleProtocol)
+            self.picklerIsKeyword = True
+        except TypeError:
+            self.picklerIsKeyword = False
+
+    def set_servers(self, servers):
+        &quot;&quot;&quot;
+        Set the pool of servers used by this client.
+
+        @param servers: an array of servers.
+        Servers can be passed in two forms:
+            1. Strings of the form C{&quot;host:port&quot;}, which implies a default weight of 1.
+            2. Tuples of the form C{(&quot;host:port&quot;, weight)}, where C{weight} is
+            an integer weight value.
+        &quot;&quot;&quot;
+        self.servers = [_Host(s, self.debuglog) for s in servers]
+        self._init_buckets()
+
+    def get_stats(self):
+        '''Get statistics from each of the servers.
+
+        @return: A list of tuples ( server_identifier, stats_dictionary ).
+            The dictionary contains a number of name/value pairs specifying
+            the name of the status field and the string value associated with
+            it.  The values are not converted from strings.
+        '''
+        data = []
+        for s in self.servers:
+            if not s.connect(): continue
+            if s.family == socket.AF_INET:
+                name = '%s:%s (%s)' % ( s.ip, s.port, s.weight )
+            else:
+                name = 'unix:%s (%s)' % ( s.address, s.weight )
+            s.send_cmd('stats')
+            serverData = {}
+            data.append(( name, serverData ))
+            readline = s.readline
+            while 1:
+                line = readline()
+                if not line or line.strip() == 'END': break
+                stats = line.split(' ', 2)
+                serverData[stats[1]] = stats[2]
+
+        return(data)
+
+    def get_slabs(self):
+        data = []
+        for s in self.servers:
+            if not s.connect(): continue
+            if s.family == socket.AF_INET:
+                name = '%s:%s (%s)' % ( s.ip, s.port, s.weight )
+            else:
+                name = 'unix:%s (%s)' % ( s.address, s.weight )
+            serverData = {}
+            data.append(( name, serverData ))
+            s.send_cmd('stats items')
+            readline = s.readline
+            while 1:
+                line = readline()
+                if not line or line.strip() == 'END': break
+                item = line.split(' ', 2)
+                #0 = STAT, 1 = ITEM, 2 = Value
+                slab = item[1].split(':', 2)
+                #0 = items, 1 = Slab #, 2 = Name
+                if not serverData.has_key(slab[1]):
+                    serverData[slab[1]] = {}
+                serverData[slab[1]][slab[2]] = item[2]
+        return data
+
+    def flush_all(self):
+        'Expire all data currently in the memcache servers.'
+        for s in self.servers:
+            if not s.connect(): continue
+            s.send_cmd('flush_all')
+            s.expect(&quot;OK&quot;)
+
+    def debuglog(self, str):
+        if self.debug:
+            sys.stderr.write(&quot;MemCached: %s\n&quot; % str)
+
+    def _statlog(self, func):
+        if not self.stats.has_key(func):
+            self.stats[func] = 1
+        else:
+            self.stats[func] += 1
+
+    def forget_dead_hosts(self):
+        &quot;&quot;&quot;
+        Reset every host in the pool to an &quot;alive&quot; state.
+        &quot;&quot;&quot;
+        for s in self.servers:
+            s.deaduntil = 0
+
+    def _init_buckets(self):
+        self.buckets = []
+        for server in self.servers:
+            for i in range(server.weight):
+                self.buckets.append(server)
+
+    def _get_server(self, key):
+        if type(key) == types.TupleType:
+            serverhash, key = key
+        else:
+            serverhash = serverHashFunction(key)
+
+        for i in range(Client._SERVER_RETRIES):
+            server = self.buckets[serverhash % len(self.buckets)]
+            if server.connect():
+                #print(&quot;(using server %s)&quot; % server, end=&quot;&quot;)
+                return server, key
+            serverhash = serverHashFunction(str(serverhash) + str(i))
+        log.error(&quot;Memcacheclient _get_server( ) failed to connect&quot;)
+        return None, None
+
+    def disconnect_all(self):
+        for s in self.servers:
+            s.close_socket()
+
+    def delete_multi(self, keys, time=0, key_prefix=''):
+        '''
+        Delete multiple keys in the memcache doing just one query.
+
+        &gt;&gt;&gt; notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+        &gt;&gt;&gt; mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+        1
+        &gt;&gt;&gt; mc.delete_multi(['key1', 'key2'])
+        1
+        &gt;&gt;&gt; mc.get_multi(['key1', 'key2']) == {}
+        1
+
+
+        This method is recommended over iterated regular L{delete}s as it reduces total latency, since
+        your app doesn't have to wait for each round-trip of L{delete} before sending
+        the next one.
+
+        @param keys: An iterable of keys to clear
+        @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+        @param key_prefix:  Optional string to prepend to each key when sending to memcache.
+            See docs for L{get_multi} and L{set_multi}.
+
+        @return: 1 if no failure in communication with any memcacheds.
+        @rtype: int
+
+        '''
+
+        self._statlog('delete_multi')
+
+        server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+
+        rc = 1
+        for server in server_keys.iterkeys():
+            bigcmd = []
+            write = bigcmd.append
+            if time != None:
+                 for key in server_keys[server]: # These are mangled keys
+                     write(&quot;delete %s %d\r\n&quot; % (key, time))
+            else:
+                for key in server_keys[server]: # These are mangled keys
+                  write(&quot;delete %s\r\n&quot; % key)
+            try:
+                server.send_cmds(''.join(bigcmd))
+            except socket.error, msg:
+                rc = 0
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        for server, keys in server_keys.iteritems():
+            try:
+                for key in keys:
+                    server.expect(&quot;DELETED&quot;)
+            except socket.error, msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                rc = 0
+        return rc
+
+    def delete(self, key, time=0):
+        '''Deletes a key from the memcache.
+
+        @return: Nonzero on success.
+        @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+        @rtype: int
+        '''
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+        self._statlog('delete')
+        if time != None:
+            cmd = &quot;delete %s %d&quot; % (key, time)
+        else:
+            cmd = &quot;delete %s&quot; % key
+
+        try:
+            server.send_cmd(cmd)
+            server.expect(&quot;DELETED&quot;)
+        except socket.error, msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+            return 0
+        return 1
+
+    def incr(self, key, delta=1):
+        &quot;&quot;&quot;
+        Sends a command to the server to atomically increment the value for C{key} by
+        C{delta}, or by 1 if C{delta} is unspecified.  Returns None if C{key} doesn't
+        exist on server, otherwise it returns the new value after incrementing.
+
+        Note that the value for C{key} must already exist in the memcache, and it
+        must be the string representation of an integer.
+
+        &gt;&gt;&gt; mc.set(&quot;counter&quot;, &quot;20&quot;)  # returns 1, indicating success
+        1
+        &gt;&gt;&gt; mc.incr(&quot;counter&quot;)
+        21
+        &gt;&gt;&gt; mc.incr(&quot;counter&quot;)
+        22
+
+        Overflow on server is not checked.  Be aware of values approaching
+        2**32.  See L{decr}.
+
+        @param delta: Integer amount to increment by (should be zero or greater).
+        @return: New value after incrementing.
+        @rtype: int
+        &quot;&quot;&quot;
+        return self._incrdecr(&quot;incr&quot;, key, delta)
+
+    def decr(self, key, delta=1):
+        &quot;&quot;&quot;
+        Like L{incr}, but decrements.  Unlike L{incr}, underflow is checked and
+        new values are capped at 0.  If server value is 1, a decrement of 2
+        returns 0, not -1.
+
+        @param delta: Integer amount to decrement by (should be zero or greater).
+        @return: New value after decrementing.
+        @rtype: int
+        &quot;&quot;&quot;
+        return self._incrdecr(&quot;decr&quot;, key, delta)
+
+    def _incrdecr(self, cmd, key, delta):
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+        self._statlog(cmd)
+        cmd = &quot;%s %s %d&quot; % (cmd, key, delta)
+        try:
+            server.send_cmd(cmd)
+            line = server.readline()
+            return int(line)
+        except socket.error, msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+            return None
+
+    def add(self, key, val, time = 0, min_compress_len = 0):
+        '''
+        Add new key with value.
+
+        Like L{set}, but only stores in memcache if the key doesn't already exist.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set(&quot;add&quot;, key, val, time, min_compress_len)
+
+    def append(self, key, val, time=0, min_compress_len=0):
+        '''Append the value to the end of the existing key's value.
+
+        Only stores in memcache if key already exists.
+        Also see L{prepend}.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set(&quot;append&quot;, key, val, time, min_compress_len)
+
+    def prepend(self, key, val, time=0, min_compress_len=0):
+        '''Prepend the value to the beginning of the existing key's value.
+
+        Only stores in memcache if key already exists.
+        Also see L{append}.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set(&quot;prepend&quot;, key, val, time, min_compress_len)
+
+    def replace(self, key, val, time=0, min_compress_len=0):
+        '''Replace existing key with value.
+
+        Like L{set}, but only stores in memcache if the key already exists.
+        The opposite of L{add}.
+
+        @return: Nonzero on success.
+        @rtype: int
+        '''
+        return self._set(&quot;replace&quot;, key, val, time, min_compress_len)
+
+    def set(self, key, val, time=0, min_compress_len=0, token=None):
+        '''Unconditionally sets a key to a given value in the memcache.
+
+        The C{key} can optionally be an tuple, with the first element
+        being the server hash value and the second being the key.
+        If you want to avoid making this module calculate a hash value.
+        You may prefer, for example, to keep all of a given user's objects
+        on the same memcache server, so you could use the user's unique
+        id as the hash value.
+
+        @return: Nonzero on success.
+        @rtype: int
+        @param time: Tells memcached the time which this value should expire, either
+        as a delta number of seconds, or an absolute unix time-since-the-epoch
+        value. See the memcached protocol docs section &quot;Storage Commands&quot;
+        for more info on &lt;exptime&gt;. We default to 0 == cache forever.
+        @param min_compress_len: The threshold length to kick in auto-compression
+        of the value using the zlib.compress() routine. If the value being cached is
+        a string, then the length of the string is measured, else if the value is an
+    , then the length of the pickle result is measured. If the resulting
+        attempt at compression yeilds a larger string than the input, then it is
+        discarded. For backwards compatability, this parameter defaults to 0,
+        indicating don't ever try to compress.
+        '''
+        return self._set(&quot;set&quot;, key, val, time, min_compress_len, token=token)
+
+
+    def _map_and_prefix_keys(self, key_iterable, key_prefix):
+        &quot;&quot;&quot;Compute the mapping of server (_Host instance) -&gt; list of keys to stuff onto that server, as well as the mapping of
+        prefixed key -&gt; original key.
+
+
+        &quot;&quot;&quot;
+        # Check it just once ...
+        key_extra_len=len(key_prefix)
+        if key_prefix:
+            check_key(key_prefix)
+
+        # server (_Host) -&gt; list of unprefixed server keys in mapping
+        server_keys = {}
+
+        prefixed_to_orig_key = {}
+        # build up a list for each server of all the keys we want.
+        for orig_key in key_iterable:
+            if type(orig_key) is types.TupleType:
+                # Tuple of hashvalue, key ala _get_server(). Caller is essentially telling us what server to stuff this on.
+                # Ensure call to _get_server gets a Tuple as well.
+                str_orig_key = str(orig_key[1])
+                server, key = self._get_server((orig_key[0], key_prefix + str_orig_key)) # Gotta pre-mangle key before hashing to a server. Returns the mangled key.
+            else:
+                str_orig_key = str(orig_key) # set_multi supports int / long keys.
+                server, key = self._get_server(key_prefix + str_orig_key)
+
+            # Now check to make sure key length is proper ...
+            check_key(str_orig_key, key_extra_len=key_extra_len)
+
+            if not server:
+                continue
+
+            if not server_keys.has_key(server):
+                server_keys[server] = []
+            server_keys[server].append(key)
+            prefixed_to_orig_key[key] = orig_key
+
+        return (server_keys, prefixed_to_orig_key)
+
+    def set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0):
+        '''
+        Sets multiple keys in the memcache doing just one query.
+
+        &gt;&gt;&gt; notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+        &gt;&gt;&gt; mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+        1
+
+
+        This method is recommended over regular L{set} as it lowers the number of
+        total packets flying around your network, reducing total latency, since
+        your app doesn't have to wait for each round-trip of L{set} before sending
+        the next one.
+
+        @param mapping: A dict of key/value pairs to set.
+        @param time: Tells memcached the time which this value should expire, either
+        as a delta number of seconds, or an absolute unix time-since-the-epoch
+        value. See the memcached protocol docs section &quot;Storage Commands&quot;
+        for more info on &lt;exptime&gt;. We default to 0 == cache forever.
+        @param key_prefix:  Optional string to prepend to each key when sending to memcache. Allows you to efficiently stuff these keys into a pseudo-namespace in memcache:
+            &gt;&gt;&gt; notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'}, key_prefix='subspace_')
+            &gt;&gt;&gt; len(notset_keys) == 0
+            True
+            &gt;&gt;&gt; mc.get_multi(['subspace_key1', 'subspace_key2']) == {'subspace_key1' : 'val1', 'subspace_key2' : 'val2'}
+            True
+
+            Causes key 'subspace_key1' and 'subspace_key2' to be set. Useful in conjunction with a higher-level layer which applies namespaces to data in memcache.
+            In this case, the return result would be the list of notset original keys, prefix not applied.
+
+        @param min_compress_len: The threshold length to kick in auto-compression
+        of the value using the zlib.compress() routine. If the value being cached is
+        a string, then the length of the string is measured, else if the value is an
+        object, then the length of the pickle result is measured. If the resulting
+        attempt at compression yeilds a larger string than the input, then it is
+        discarded. For backwards compatability, this parameter defaults to 0,
+        indicating don't ever try to compress.
+        @return: List of keys which failed to be stored [ memcache out of memory, etc. ].
+        @rtype: list
+
+        '''
+
+        self._statlog('set_multi')
+
+
+
+        server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(mapping.iterkeys(), key_prefix)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+
+        for server in server_keys.iterkeys():
+            bigcmd = []
+            write = bigcmd.append
+            try:
+                for key in server_keys[server]: # These are mangled keys
+                    store_info = self._val_to_store_info(mapping[prefixed_to_orig_key[key]], min_compress_len)
+                    write(&quot;set %s %d %d %d\r\n%s\r\n&quot; % (key, store_info[0], time, store_info[1], store_info[2]))
+                server.send_cmds(''.join(bigcmd))
+            except socket.error, msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        #  short-circuit if there are no servers, just return all keys
+        if not server_keys: return(mapping.keys())
+
+        notstored = [] # original keys.
+        for server, keys in server_keys.iteritems():
+            try:
+                for key in keys:
+                    line = server.readline()
+                    if line == 'STORED':
+                        continue
+                    else:
+                        notstored.append(prefixed_to_orig_key[key]) #un-mangle.
+            except (_Error, socket.error), msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+        return notstored
+
+    def _val_to_store_info(self, val, min_compress_len):
+        &quot;&quot;&quot;
+           Transform val to a storable representation, returning a tuple of the flags, the length of the new value, and the new value itself.
+        &quot;&quot;&quot;
+        flags = 0
+        if isinstance(val, str):
+            pass
+        elif isinstance(val, int):
+            flags |= Client._FLAG_INTEGER
+            val = &quot;%d&quot; % val
+            # force no attempt to compress this silly string.
+            min_compress_len = 0
+        elif isinstance(val, long):
+            flags |= Client._FLAG_LONG
+            val = &quot;%d&quot; % val
+            # force no attempt to compress this silly string.
+            min_compress_len = 0
+        else:
+            flags |= Client._FLAG_PICKLE
+            file = StringIO()
+            if self.picklerIsKeyword:
+                pickler = self.pickler(file, protocol = self.pickleProtocol)
+            else:
+                pickler = self.pickler(file, self.pickleProtocol)
+            if self.persistent_id:
+                pickler.persistent_id = self.persistent_id
+            pickler.dump(val)
+            val = file.getvalue()
+
+        lv = len(val)
+        # We should try to compress if min_compress_len &gt; 0 and we could
+        # import zlib and this string is longer than our min threshold.
+        if min_compress_len and _supports_compress and lv &gt; min_compress_len:
+            comp_val = compress(val)
+            # Only retain the result if the compression result is smaller
+            # than the original.
+            if len(comp_val) &lt; lv:
+                flags |= Client._FLAG_COMPRESSED
+                val = comp_val
+
+        #  silently do not store if value length exceeds maximum
+        if len(val) &gt;= SERVER_MAX_VALUE_LENGTH: return(0)
+
+        return (flags, len(val), val)
+
+    def _set(self, cmd, key, val, time, min_compress_len = 0, token=None):
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            return 0
+
+        self._statlog(cmd)
+
+        store_info = self._val_to_store_info(val, min_compress_len)
+        if not store_info: return(0)
+
+        if token is not None:
+            cmd = &quot;cas&quot;
+            fullcmd = &quot;cas %s %d %d %d %s\r\n%s&quot; % (key, store_info[0], time, store_info[1], token, store_info[2])
+        else:
+            fullcmd = &quot;%s %s %d %d %d\r\n%s&quot; % (cmd, key, store_info[0], time, store_info[1], store_info[2])
+        try:
+            server.send_cmd(fullcmd)
+            result = server.expect(&quot;STORED&quot;)
+
+            if (result == &quot;STORED&quot;):
+                return True
+
+            if (result == &quot;NOT_FOUND&quot;):
+                raise NotFoundError(key)
+
+            if token and result == &quot;EXISTS&quot;:
+                log.debug(&quot;Memcacheclient check-and-set failed&quot;)
+                raise TokenMismatchError(key)
+
+            log.error(&quot;Memcacheclient %s command failed with result (%s)&quot; %
+                (cmd, result))
+
+            return False
+
+        except socket.error, msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+        return 0
+
+    def get(self, key):
+        '''Retrieves a key from the memcache.
+
+        @return: The value or None.
+        '''
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            raise MemcacheError(&quot;Memcache connection error&quot;)
+
+        self._statlog('get')
+
+        try:
+            server.send_cmd(&quot;get %s&quot; % key)
+            rkey, flags, rlen, = self._expectvalue(server)
+            if not rkey:
+                return None
+            value = self._recv_value(server, flags, rlen)
+            server.expect(&quot;END&quot;)
+        except (_Error, socket.error), msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+            raise MemcacheError(&quot;Memcache connection error&quot;)
+        return value
+
+    def gets(self, key):
+        '''Retrieves a key from the memcache.
+
+        @return: The value or None.
+        '''
+        check_key(key)
+        server, key = self._get_server(key)
+        if not server:
+            raise MemcacheError(&quot;Memcache connection error&quot;)
+
+        self._statlog('get')
+
+        try:
+            server.send_cmd(&quot;gets %s&quot; % key)
+            rkey, flags, rlen, cas_token = self._expectvalue_cas(server)
+            if not rkey:
+                return (None, None)
+            value = self._recv_value(server, flags, rlen)
+            server.expect(&quot;END&quot;)
+        except (_Error, socket.error), msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            server.mark_dead(msg)
+            raise MemcacheError(&quot;Memcache connection error&quot;)
+        return (value, cas_token)
+
+    def get_multi(self, keys, key_prefix=''):
+        '''
+        Retrieves multiple keys from the memcache doing just one query.
+
+        &gt;&gt;&gt; success = mc.set(&quot;foo&quot;, &quot;bar&quot;)
+        &gt;&gt;&gt; success = mc.set(&quot;baz&quot;, 42)
+        &gt;&gt;&gt; mc.get_multi([&quot;foo&quot;, &quot;baz&quot;, &quot;foobar&quot;]) == {&quot;foo&quot;: &quot;bar&quot;, &quot;baz&quot;: 42}
+        1
+        &gt;&gt;&gt; mc.set_multi({'k1' : 1, 'k2' : 2}, key_prefix='pfx_') == []
+        1
+
+        This looks up keys 'pfx_k1', 'pfx_k2', ... . Returned dict will just have unprefixed keys 'k1', 'k2'.
+        &gt;&gt;&gt; mc.get_multi(['k1', 'k2', 'nonexist'], key_prefix='pfx_') == {'k1' : 1, 'k2' : 2}
+        1
+
+        get_mult [ and L{set_multi} ] can take str()-ables like ints / longs as keys too. Such as your db pri key fields.
+        They're rotored through str() before being passed off to memcache, with or without the use of a key_prefix.
+        In this mode, the key_prefix could be a table name, and the key itself a db primary key number.
+
+        &gt;&gt;&gt; mc.set_multi({42: 'douglass adams', 46 : 'and 2 just ahead of me'}, key_prefix='numkeys_') == []
+        1
+        &gt;&gt;&gt; mc.get_multi([46, 42], key_prefix='numkeys_') == {42: 'douglass adams', 46 : 'and 2 just ahead of me'}
+        1
+
+        This method is recommended over regular L{get} as it lowers the number of
+        total packets flying around your network, reducing total latency, since
+        your app doesn't have to wait for each round-trip of L{get} before sending
+        the next one.
+
+        See also L{set_multi}.
+
+        @param keys: An array of keys.
+        @param key_prefix: A string to prefix each key when we communicate with memcache.
+            Facilitates pseudo-namespaces within memcache. Returned dictionary keys will not have this prefix.
+        @return:  A dictionary of key/value pairs that were available. If key_prefix was provided, the keys in the retured dictionary will not have it present.
+
+        '''
+
+        self._statlog('get_multi')
+
+        server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+        for server in server_keys.iterkeys():
+            try:
+                server.send_cmd(&quot;get %s&quot; % &quot; &quot;.join(server_keys[server]))
+            except socket.error, msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        retvals = {}
+        for server in server_keys.iterkeys():
+            try:
+                line = server.readline()
+                while line and line != 'END':
+                    rkey, flags, rlen = self._expectvalue(server, line)
+                    #  Bo Yang reports that this can sometimes be None
+                    if rkey is not None:
+                        val = self._recv_value(server, flags, rlen)
+                        try:
+                            retvals[prefixed_to_orig_key[rkey]] = val   # un-prefix returned key.
+                        except KeyError:
+                            pass
+                    line = server.readline()
+            except (_Error, socket.error), msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+        return retvals
+
+    def gets_multi(self, keys, key_prefix=''):
+        '''
+        Retrieves multiple keys from the memcache doing just one query.
+        See also L{gets} and L{get_multi}.
+        '''
+
+        self._statlog('gets_multi')
+
+        server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+        for server in server_keys.iterkeys():
+            try:
+                server.send_cmd(&quot;gets %s&quot; % &quot; &quot;.join(server_keys[server]))
+            except socket.error, msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        retvals = {}
+        for server in server_keys.iterkeys():
+            try:
+                line = server.readline()
+                while line and line != 'END':
+                    rkey, flags, rlen, cas_token = self._expectvalue_cas(server, line)
+                    #  Bo Yang reports that this can sometimes be None
+                    if rkey is not None:
+                        val = self._recv_value(server, flags, rlen)
+                        try:
+                            retvals[prefixed_to_orig_key[rkey]] = (val, cas_token)   # un-prefix returned key.
+                        except KeyError:
+                            pass
+                    line = server.readline()
+            except (_Error, socket.error), msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+        return retvals
+
+    def _expectvalue(self, server, line=None):
+        if not line:
+            line = server.readline()
+
+        if line[:5] == 'VALUE':
+            resp, rkey, flags, len = line.split()
+            flags = int(flags)
+            rlen = int(len)
+            return (rkey, flags, rlen)
+        else:
+            return (None, None, None)
+
+    def _expectvalue_cas(self, server, line=None):
+        if not line:
+            line = server.readline()
+
+        if line[:5] == 'VALUE':
+            resp, rkey, flags, len, rtoken = line.split()
+            flags = int(flags)
+            rlen = int(len)
+            return (rkey, flags, rlen, rtoken)
+        else:
+            return (None, None, None, None)
+
+    def _recv_value(self, server, flags, rlen):
+        rlen += 2 # include \r\n
+        buf = server.recv(rlen)
+        if len(buf) != rlen:
+            raise _Error(&quot;received %d bytes when expecting %d&quot; % (len(buf), rlen))
+
+        if len(buf) == rlen:
+            buf = buf[:-2]  # strip \r\n
+
+        if flags &amp; Client._FLAG_COMPRESSED:
+            buf = decompress(buf)
+
+
+        if  flags == 0 or flags == Client._FLAG_COMPRESSED:
+            # Either a bare string or a compressed string now decompressed...
+            val = buf
+        elif flags &amp; Client._FLAG_INTEGER:
+            val = int(buf)
+        elif flags &amp; Client._FLAG_LONG:
+            val = long(buf)
+        elif flags &amp; Client._FLAG_PICKLE:
+            try:
+                file = StringIO(buf)
+                unpickler = self.unpickler(file)
+                if self.persistent_load:
+                    unpickler.persistent_load = self.persistent_load
+                val = unpickler.load()
+            except Exception, e:
+                self.debuglog('Pickle error: %s\n' % e)
+                val = None
+        else:
+            self.debuglog(&quot;unknown flags on get: %x\n&quot; % flags)
+
+        return val
+
+
+
+class TestClient(Client):
+    &quot;&quot;&quot;
+    Fake memcache client for unit tests
+
+    &quot;&quot;&quot;
+
+    def __init__(self, servers, debug=0, pickleProtocol=0,
+                 pickler=pickle.Pickler, unpickler=pickle.Unpickler,
+                 pload=None, pid=None):
+
+        local.__init__(self)
+
+        super(TestClient, self).__init__(servers, debug=debug,
+            pickleProtocol=pickleProtocol, pickler=pickler, unpickler=unpickler,
+            pload=pload, pid=pid)
+
+        self.data = {}
+        self.token = 0
+
+
+
+    def get_stats(self):
+        raise NotImplementedError()
+
+    def get_slabs(self):
+        raise NotImplementedError()
+
+    def flush_all(self):
+        raise NotImplementedError()
+
+    def forget_dead_hosts(self):
+        raise NotImplementedError()
+
+    def delete_multi(self, keys, time=0, key_prefix=''):
+        '''
+        Delete multiple keys in the memcache doing just one query.
+
+        &gt;&gt;&gt; notset_keys = mc.set_multi({'key1' : 'val1', 'key2' : 'val2'})
+        &gt;&gt;&gt; mc.get_multi(['key1', 'key2']) == {'key1' : 'val1', 'key2' : 'val2'}
+        1
+        &gt;&gt;&gt; mc.delete_multi(['key1', 'key2'])
+        1
+        &gt;&gt;&gt; mc.get_multi(['key1', 'key2']) == {}
+        1
+        '''
+
+        self._statlog('delete_multi')
+        for key in keys:
+            key = key_prefix + key
+            del self.data[key]
+        return 1
+
+    def delete(self, key, time=0):
+        '''Deletes a key from the memcache.
+
+        @return: Nonzero on success.
+        @param time: number of seconds any subsequent set / update commands should fail. Defaults to 0 for no delay.
+        @rtype: int
+        '''
+        check_key(key)
+        del self.data[key]
+        return 1
+
+
+    def incr(self, key, delta=1):
+        raise NotImplementedError()
+
+    def decr(self, key, delta=1):
+        raise NotImplementedError()
+
+    def add(self, key, val, time = 0, min_compress_len = 0):
+        raise NotImplementedError()
+
+    def append(self, key, val, time=0, min_compress_len=0):
+        raise NotImplementedError()
+
+    def prepend(self, key, val, time=0, min_compress_len=0):
+        raise NotImplementedError()
+
+    def replace(self, key, val, time=0, min_compress_len=0):
+        raise NotImplementedError()
+
+    def set(self, key, val, time=0, min_compress_len=0, token=None):
+        self._statlog('set')
+        return self._set(&quot;set&quot;, key, val, time, min_compress_len, token=token)
+
+    def set_multi(self, mapping, time=0, key_prefix='', min_compress_len=0):
+        self._statlog('set_multi')
+        for key, val in mapping.iteritems():
+            key = key_prefix + key
+            self._set(&quot;set&quot;, key, val, time, min_compress_len)
+        return []
+
+    def _set(self, cmd, key, val, time, min_compress_len = 0, token=None):
+        check_key(key)
+        self._statlog(cmd)
+
+        serialized = pickle.dumps(val, pickle.HIGHEST_PROTOCOL)
+
+        if token is not None:
+            if self.data.has_key(key):
+                stored_val, stored_token = self.data[key]
+                if token != stored_token:
+                    raise TokenMismatchError(key)
+
+        self.data[key] = (serialized, str(self.token))
+        self.token += 1
+
+        return True
+
+    def get(self, key):
+        check_key(key)
+
+        self._statlog('get')
+        if self.data.has_key(key):
+            stored_val, stored_token = self.data[key]
+            val = pickle.loads(stored_val)
+            return val
+        return None
+
+
+    def gets(self, key):
+        check_key(key)
+        if self.data.has_key(key):
+            stored_val, stored_token = self.data[key]
+            val = pickle.loads(stored_val)
+            return (val, stored_token)
+        return (None, None)
+
+    def get_multi(self, keys, key_prefix=''):
+        self._statlog('get_multi')
+
+        results = {}
+        for key in keys:
+            key = key_prefix + key
+            val = self.get(key)
+            results[key] = val
+        return results
+
+    def gets_multi(self, keys, key_prefix=''):
+        self._statlog('gets_multi')
+        results = {}
+        for key in keys:
+            key = key_prefix + key
+            result = self.gets(key)
+            if result[1] is not None:
+                results[key] = result
+        return results
+
+
+class _Host:
+    _DEAD_RETRY = 1  # number of seconds before retrying a dead server.
+    _SOCKET_TIMEOUT = 3  #  number of seconds before sockets timeout.
+
+    def __init__(self, host, debugfunc=None):
+        if isinstance(host, types.TupleType):
+            host, self.weight = host
+        else:
+            self.weight = 1
+
+        #  parse the connection string
+        m = re.match(r'^(?P&lt;proto&gt;unix):(?P&lt;path&gt;.*)$', host)
+        if not m:
+            m = re.match(r'^(?P&lt;proto&gt;inet):'
+                    r'(?P&lt;host&gt;[^:]+)(:(?P&lt;port&gt;[0-9]+))?$', host)
+        if not m: m = re.match(r'^(?P&lt;host&gt;[^:]+):(?P&lt;port&gt;[0-9]+)$', host)
+        if not m:
+            raise ValueError('Unable to parse connection string: &quot;%s&quot;' % host)
+
+        hostData = m.groupdict()
+        if hostData.get('proto') == 'unix':
+            self.family = socket.AF_UNIX
+            self.address = hostData['path']
+        else:
+            self.family = socket.AF_INET
+            self.ip = hostData['host']
+            self.port = int(hostData.get('port', 11211))
+            self.address = ( self.ip, self.port )
+
+        if not debugfunc:
+            debugfunc = lambda x: x
+        self.debuglog = debugfunc
+
+        self.deaduntil = 0
+        self.socket = None
+
+        self.buffer = ''
+
+    def _check_dead(self):
+        if self.deaduntil and self.deaduntil &gt; time.time():
+            return 1
+        self.deaduntil = 0
+        return 0
+
+    def connect(self):
+        if self._get_socket():
+            return 1
+        return 0
+
+    def mark_dead(self, reason):
+        log.error(&quot;Memcacheclient socket marked dead (%s)&quot; % (reason,))
+        self.debuglog(&quot;MemCache: %s: %s.  Marking dead.&quot; % (self, reason))
+        self.deaduntil = time.time() + _Host._DEAD_RETRY
+        self.close_socket()
+
+    def _get_socket(self):
+        if self._check_dead():
+            log.error(&quot;Memcacheclient _get_socket() found dead socket&quot;)
+            return None
+        if self.socket:
+            return self.socket
+        s = socket.socket(self.family, socket.SOCK_STREAM)
+        if hasattr(s, 'settimeout'): s.settimeout(self._SOCKET_TIMEOUT)
+        try:
+            s.connect(self.address)
+        except socket.timeout, msg:
+            log.error(&quot;Memcacheclient _get_socket() connection timed out (%s)&quot; %
+                (msg,))
+            self.mark_dead(&quot;connect: %s&quot; % msg)
+            return None
+        except socket.error, msg:
+            if type(msg) is types.TupleType: msg = msg[1]
+            log.error(&quot;Memcacheclient _get_socket() connection error (%s)&quot; %
+                (msg,))
+            self.mark_dead(&quot;connect: %s&quot; % msg[1])
+            return None
+        self.socket = s
+        self.buffer = ''
+        return s
+
+    def close_socket(self):
+        if self.socket:
+            self.socket.close()
+            self.socket = None
+
+    def send_cmd(self, cmd):
+        self.socket.sendall(cmd + '\r\n')
+
+    def send_cmds(self, cmds):
+        &quot;&quot;&quot; cmds already has trailing \r\n's applied &quot;&quot;&quot;
+        self.socket.sendall(cmds)
+
+    def readline(self):
+        buf = self.buffer
+        recv = self.socket.recv
+        while True:
+            index = buf.find('\r\n')
+            if index &gt;= 0:
+                break
+            data = recv(4096)
+            if not data:
+                self.mark_dead('Connection closed while reading from %s'
+                        % repr(self))
+                break
+            buf += data
+        if index &gt;= 0:
+            self.buffer = buf[index+2:]
+            buf = buf[:index]
+        else:
+            self.buffer = ''
+        return buf
+
+    def expect(self, text):
+        line = self.readline()
+        if line != text:
+            self.debuglog(&quot;while expecting '%s', got unexpected response '%s'&quot; % (text, line))
+        return line
+
+    def recv(self, rlen):
+        self_socket_recv = self.socket.recv
+        buf = self.buffer
+        while len(buf) &lt; rlen:
+            foo = self_socket_recv(4096)
+            buf += foo
+            if len(foo) == 0:
+                raise _Error, ( 'Read %d bytes, expecting %d, '
+                        'read returned 0 length bytes' % ( len(buf), rlen ))
+        self.buffer = buf[rlen:]
+        return buf[:rlen]
+
+    def __str__(self):
+        d = ''
+        if self.deaduntil:
+            d = &quot; (dead until %d)&quot; % self.deaduntil
+
+        if self.family == socket.AF_INET:
+            return &quot;inet:%s:%d%s&quot; % (self.address[0], self.address[1], d)
+        else:
+            return &quot;unix:%s%s&quot; % (self.address, d)
+
+def check_key(key, key_extra_len=0):
+    &quot;&quot;&quot;Checks sanity of key.  Fails if:
+        Key length is &gt; SERVER_MAX_KEY_LENGTH (Raises MemcachedKeyLength).
+        Contains control characters  (Raises MemcachedKeyCharacterError).
+        Is not a string (Raises MemcachedStringEncodingError)
+        Is an unicode string (Raises MemcachedStringEncodingError)
+        Is not a string (Raises MemcachedKeyError)
+        Is None (Raises MemcachedKeyError)
+    &quot;&quot;&quot;
+
+    return # Short-circuit this expensive method
+
+    if type(key) == types.TupleType: key = key[1]
+    if not key:
+        raise Client.MemcachedKeyNoneError, (&quot;Key is None&quot;)
+    if isinstance(key, unicode):
+        raise Client.MemcachedStringEncodingError, (&quot;Keys must be str()'s, not &quot;
+                &quot;unicode.  Convert your unicode strings using &quot;
+                &quot;mystring.encode(charset)!&quot;)
+    if not isinstance(key, str):
+        raise Client.MemcachedKeyTypeError, (&quot;Key must be str()'s&quot;)
+
+    if isinstance(key, basestring):
+        if len(key) + key_extra_len &gt; SERVER_MAX_KEY_LENGTH:
+             raise Client.MemcachedKeyLengthError, (&quot;Key length is &gt; %s&quot;
+                     % SERVER_MAX_KEY_LENGTH)
+        for char in key:
+            if ord(char) &lt; 32 or ord(char) == 127:
+                raise Client.MemcachedKeyCharacterError, &quot;Control characters not allowed&quot;
+
+def _doctest():
+    import doctest, memcacheclient
+    servers = [&quot;127.0.0.1:11211&quot;]
+    mc = Client(servers, debug=1)
+    globs = {&quot;mc&quot;: mc}
+    return doctest.testmod(memcacheclient, globs=globs)
+
+if __name__ == &quot;__main__&quot;:
+    print(&quot;Testing docstrings...&quot;)
+    _doctest()
+    print(&quot;Running tests:&quot;)
+    print
+    serverList = [[&quot;127.0.0.1:11211&quot;]]
+    if '--do-unix' in sys.argv:
+        serverList.append([os.path.join(os.getcwd(), 'memcached.socket')])
+
+    for servers in serverList:
+        mc = Client(servers, debug=1)
+
+        def to_s(val):
+            if not isinstance(val, types.StringTypes):
+                return &quot;%s (%s)&quot; % (val, type(val))
+            return &quot;%s&quot; % val
+        def test_setget(key, val):
+            print(&quot;Testing set/get {'%s': %s} ...&quot; % (to_s(key), to_s(val)), end=&quot;&quot;)
+            mc.set(key, val)
+            newval = mc.get(key)
+            if newval == val:
+                print(&quot;OK&quot;)
+                return 1
+            else:
+                print(&quot;FAIL&quot;)
+                return 0
+
+
+        class FooStruct:
+            def __init__(self):
+                self.bar = &quot;baz&quot;
+            def __str__(self):
+                return &quot;A FooStruct&quot;
+            def __eq__(self, other):
+                if isinstance(other, FooStruct):
+                    return self.bar == other.bar
+                return 0
+
+        test_setget(&quot;a_string&quot;, &quot;some random string&quot;)
+        test_setget(&quot;an_integer&quot;, 42)
+        if test_setget(&quot;long&quot;, long(1&lt;&lt;30)):
+            print(&quot;Testing delete ...&quot;, end=&quot;&quot;)
+            if mc.delete(&quot;long&quot;):
+                print(&quot;OK&quot;)
+            else:
+                print(&quot;FAIL&quot;)
+        print(&quot;Testing get_multi ...&quot;, end=&quot;&quot;)
+        print(mc.get_multi([&quot;a_string&quot;, &quot;an_integer&quot;]))
+
+        print(&quot;Testing get(unknown value) ...&quot;, end=&quot;&quot;)
+        print(to_s(mc.get(&quot;unknown_value&quot;)))
+
+        f = FooStruct()
+        test_setget(&quot;foostruct&quot;, f)
+
+        print(&quot;Testing incr ...&quot;, end=&quot;&quot;)
+        x = mc.incr(&quot;an_integer&quot;, 1)
+        if x == 43:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing decr ...&quot;, end=&quot;&quot;)
+        x = mc.decr(&quot;an_integer&quot;, 1)
+        if x == 42:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        # sanity tests
+        print(&quot;Testing sending spaces...&quot;, end=&quot;&quot;)
+        try:
+            x = mc.set(&quot;this has spaces&quot;, 1)
+        except Client.MemcachedKeyCharacterError, msg:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing sending control characters...&quot;, end=&quot;&quot;)
+        try:
+            x = mc.set(&quot;this\x10has\x11control characters\x02&quot;, 1)
+        except Client.MemcachedKeyCharacterError, msg:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing using insanely long key...&quot;, end=&quot;&quot;)
+        try:
+            x = mc.set('a'*SERVER_MAX_KEY_LENGTH + 'aaaa', 1)
+        except Client.MemcachedKeyLengthError, msg:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing sending a unicode-string key...&quot;, end=&quot;&quot;)
+        try:
+            x = mc.set(u'keyhere', 1)
+        except Client.MemcachedStringEncodingError, msg:
+            print(&quot;OK&quot;, end=&quot;&quot;)
+        else:
+            print(&quot;FAIL&quot;, end=&quot;&quot;)
+        try:
+            x = mc.set((u'a'*SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1)
+        except:
+            print(&quot;FAIL&quot;, end=&quot;&quot;)
+        else:
+            print(&quot;OK&quot;, end=&quot;&quot;)
+        import pickle
+        s = pickle.loads('V\\u4f1a\np0\n.')
+        try:
+            x = mc.set((s*SERVER_MAX_KEY_LENGTH).encode('utf-8'), 1)
+        except Client.MemcachedKeyLengthError:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing using a value larger than the memcached value limit...&quot;, end=&quot;&quot;)
+        x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH)
+        if mc.get('keyhere') == None:
+            print(&quot;OK&quot;, end=&quot;&quot;)
+        else:
+            print(&quot;FAIL&quot;, end=&quot;&quot;)
+        x = mc.set('keyhere', 'a'*SERVER_MAX_VALUE_LENGTH + 'aaa')
+        if mc.get('keyhere') == None:
+            print(&quot;OK&quot;)
+        else:
+            print(&quot;FAIL&quot;)
+
+        print(&quot;Testing set_multi() with no memcacheds running&quot;, end=&quot;&quot;)
+        mc.disconnect_all()
+        errors = mc.set_multi({'keyhere' : 'a', 'keythere' : 'b'})
+        if errors != []:
+            print(&quot;FAIL&quot;)
+        else:
+            print(&quot;OK&quot;)
+
+        print(&quot;Testing delete_multi() with no memcacheds running&quot;, end=&quot;&quot;)
+        mc.disconnect_all()
+        ret = mc.delete_multi({'keyhere' : 'a', 'keythere' : 'b'})
+        if ret != 1:
+            print(&quot;FAIL&quot;)
+        else:
+          print(&quot;OK&quot;)
+
+# vim: ts=4 sw=4 et :
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepoolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcachepool.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,13 +18,14 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import Deferred, fail
</span><span class="cx"> from twisted.internet.protocol import ReconnectingClientFactory
</span><ins>+from twisted.protocols.memcache import MemCacheProtocol, NoSuchCommand
</ins><span class="cx"> 
</span><ins>+from twext.python.log import Logger
</ins><span class="cx"> from twext.internet.gaiendpoint import GAIEndpoint
</span><span class="cx"> from twext.internet.adaptendpoint import connect
</span><span class="cx"> 
</span><del>-from twext.python.log import Logger
-from twext.protocols.memcache import MemCacheProtocol, NoSuchCommand
</del><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class PooledMemCacheProtocol(MemCacheProtocol):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     A MemCacheProtocol that will notify a connectionPool that it is ready
</span><span class="lines">@@ -161,7 +162,9 @@
</span><span class="cx"> 
</span><span class="cx">         self.shutdown_deferred = None
</span><span class="cx">         self.shutdown_requested = False
</span><del>-        reactor.addSystemEventTrigger('before', 'shutdown', self._shutdownCallback)
</del><ins>+        reactor.addSystemEventTrigger(
+            'before', 'shutdown', self._shutdownCallback
+        )
</ins><span class="cx"> 
</span><span class="cx">         self._busyClients = set([])
</span><span class="cx">         self._freeClients = set([])
</span><span class="lines">@@ -191,8 +194,9 @@
</span><span class="cx"> 
</span><span class="cx">         @return: A L{Deferred} that fires with the L{IProtocol} instance.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        self.log.debug(&quot;Initiating new client connection to: %r&quot; % (
-                self._endpoint,))
</del><ins>+        self.log.debug(
+            &quot;Initiating new client connection to: %r&quot; % (self._endpoint,)
+        )
</ins><span class="cx">         self._logClientStats()
</span><span class="cx"> 
</span><span class="cx">         self._pendingConnects += 1
</span><span class="lines">@@ -239,9 +243,12 @@
</span><span class="cx">             Upon memcache error, log the failed request along with the error
</span><span class="cx">             message and free the client.
</span><span class="cx">             &quot;&quot;&quot;
</span><del>-            self.log.error(&quot;Memcache error: %s; request: %s %s&quot; %
-                (failure.value, command,
-                &quot; &quot;.join(args)[:self.REQUEST_LOGGING_SIZE],))
</del><ins>+            self.log.error(
+                &quot;Memcache error: %s; request: %s %s&quot; % (
+                    failure.value, command,
+                    &quot; &quot;.join(args)[:self.REQUEST_LOGGING_SIZE],
+                )
+            )
</ins><span class="cx">             self.clientFree(client)
</span><span class="cx"> 
</span><span class="cx">         self.clientBusy(client)
</span><span class="lines">@@ -276,11 +283,14 @@
</span><span class="cx">             d = self._performRequestOnClient(
</span><span class="cx">                 client, command, *args, **kwargs)
</span><span class="cx"> 
</span><del>-        elif len(self._busyClients) + self._pendingConnects &gt;= self._maxClients:
</del><ins>+        elif (
+            len(self._busyClients) + self._pendingConnects &gt;= self._maxClients
+        ):
</ins><span class="cx">             d = Deferred()
</span><span class="cx">             self._commands.append((d, command, args, kwargs))
</span><del>-            self.log.debug(&quot;Command queued: %s, %r, %r&quot; % (
-                    command, args, kwargs))
</del><ins>+            self.log.debug(
+                &quot;Command queued: %s, %r, %r&quot; % (command, args, kwargs)
+            )
</ins><span class="cx">             self._logClientStats()
</span><span class="cx"> 
</span><span class="cx">         else:
</span><span class="lines">@@ -292,12 +302,14 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def _logClientStats(self):
</span><del>-        self.log.debug(&quot;Clients #free: %d, #busy: %d, &quot;
-                       &quot;#pending: %d, #queued: %d&quot; % (
</del><ins>+        self.log.debug(
+            &quot;Clients #free: %d, #busy: %d, #pending: %d, #queued: %d&quot; % (
</ins><span class="cx">                 len(self._freeClients),
</span><span class="cx">                 len(self._busyClients),
</span><span class="cx">                 self._pendingConnects,
</span><del>-                len(self._commands)))
</del><ins>+                len(self._commands),
+            )
+        )
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def clientGone(self, client):
</span><span class="lines">@@ -349,8 +361,10 @@
</span><span class="cx">         if len(self._commands) &gt; 0:
</span><span class="cx">             d, command, args, kwargs = self._commands.pop(0)
</span><span class="cx"> 
</span><del>-            self.log.debug(&quot;Performing Queued Command: %s, %r, %r&quot; % (
-                    command, args, kwargs))
</del><ins>+            self.log.debug(
+                &quot;Performing Queued Command: %s, %r, %r&quot;
+                % (command, args, kwargs)
+            )
</ins><span class="cx">             self._logClientStats()
</span><span class="cx"> 
</span><span class="cx">             _ign_d = self.performRequest(
</span><span class="lines">@@ -425,6 +439,8 @@
</span><span class="cx"> _memCachePools = {}         # Maps a name to a pool object
</span><span class="cx"> _memCachePoolHandler = {}   # Maps a handler id to a named pool
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> def installPools(pools, maxClients=5, reactor=None):
</span><span class="cx">     if reactor is None:
</span><span class="cx">         from twisted.internet import reactor
</span><span class="lines">@@ -440,7 +456,9 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-def _installPool(name, handleTypes, serverEndpoint, maxClients=5, reactor=None):
</del><ins>+def _installPool(
+    name, handleTypes, serverEndpoint, maxClients=5, reactor=None
+):
</ins><span class="cx">     pool = MemCachePool(serverEndpoint, maxClients=maxClients, reactor=None)
</span><span class="cx">     _memCachePools[name] = pool
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmemcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/memcacheprops.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,14 +33,15 @@
</span><span class="cx">     from md5 import new as md5
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.memcacheclient import ClientFactory
-from twext.python.memcacheclient import MemcacheError, TokenMismatchError
</del><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
+
</ins><span class="cx"> from txdav.xml.base import encodeXMLName
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
</del><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory
+from twistedcaldav.memcacheclient import MemcacheError, TokenMismatchError
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodaclpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/acl.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,9 +22,9 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodgetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/get.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,14 +21,14 @@
</span><span class="cx"> __all__ = [&quot;http_GET&quot;]
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError, StatusResponse
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> from twistedcaldav.customxml import calendarserver_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,15 +23,15 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import MultiStatusResponse, PropertyStatusResponseQueue
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import MultiStatusResponse, PropertyStatusResponseQueue
+from txweb2.dav.util import davXMLFromStream
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodmkcolpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/mkcol.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,14 +25,14 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import Response
-from twext.web2.dav.http import ErrorResponse, PropertyStatusResponseQueue
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.dav.util import parentForURL
-from twext.web2.http import HTTPError
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2.http import Response
+from txweb2.dav.http import ErrorResponse, PropertyStatusResponseQueue
+from txweb2.dav.util import davXMLFromStream
+from txweb2.dav.util import parentForURL
+from txweb2.http import HTTPError
+from txweb2.http import StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml, carddavxml, mkcolxml
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="lines">@@ -100,7 +100,7 @@
</span><span class="cx">         doc = (yield davXMLFromStream(request.stream))
</span><span class="cx">     except ValueError, e:
</span><span class="cx">         log.error(&quot;Error while handling MKCOL: %s&quot; % (e,))
</span><del>-        # TODO: twext.web2.dav 'MKCOL' tests demand this particular response
</del><ins>+        # TODO: txweb2.dav 'MKCOL' tests demand this particular response
</ins><span class="cx">         # code, but should we really be looking at the XML content or the
</span><span class="cx">         # content-type header?  It seems to me like this ought to be considered
</span><span class="cx">         # a BAD_REQUEST if it claims to be XML but isn't, but an
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpostpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/post.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,8 +21,8 @@
</span><span class="cx"> 
</span><span class="cx"> __all__ = [&quot;http_POST&quot;]
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.http import StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodpropfindpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/propfind.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-# -*- test-case-name: twext.web2.dav.test.test_prop.PROP.test_PROPFIND -*-
</del><ins>+# -*- test-case-name: txweb2.dav.test.test_prop.PROP.test_PROPFIND -*-
</ins><span class="cx"> ##
</span><span class="cx"> # Copyright (c) 2005-2013 Apple Computer, Inc. All rights reserved.
</span><span class="cx"> #
</span><span class="lines">@@ -29,13 +29,13 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.python.failure import Failure
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2.http import HTTPError
-from twext.web2 import responsecode
-from twext.web2.http import StatusResponse
</del><ins>+from txweb2.http import HTTPError
+from txweb2 import responsecode
+from txweb2.http import StatusResponse
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import MultiStatusResponse, statusForFailure, \
</del><ins>+from txweb2.dav.http import MultiStatusResponse, statusForFailure, \
</ins><span class="cx">     ErrorResponse
</span><del>-from twext.web2.dav.util import normalizeURL, davXMLFromStream, parentForURL
</del><ins>+from txweb2.dav.util import normalizeURL, davXMLFromStream, parentForURL
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreportpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -29,15 +29,15 @@
</span><span class="cx"> import string
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, StatusResponse
-from twext.web2.dav.util import davXMLFromStream
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, StatusResponse
+from txweb2.dav.util import davXMLFromStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx"> from txdav.xml.element import lookupElement
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_addressbook_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_addressbook_query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,12 +26,12 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_calendar_querypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_calendar_query.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,12 +24,12 @@
</span><span class="cx">     maybeDeferred
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import MultiStatusResponse
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import MultiStatusResponse
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace, MaxInstances, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,15 +38,15 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> 
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.http import statusForFailure
-from twext.web2.dav.method.propfind import propertyName
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.dav.method.report import max_number_of_matches
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.dav.http import statusForFailure
+from txweb2.dav.method.propfind import propertyName
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.dav.method.report import max_number_of_matches
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_freebusypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_freebusy.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,12 +23,12 @@
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.http import HTTPError, Response, StatusResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.http import HTTPError, Response, StatusResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.ical import Component
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_multiget_commonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_multiget_common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,12 +23,12 @@
</span><span class="cx"> from urllib import unquote
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import AccessDeniedError
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import AccessDeniedError
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavmethodreport_sync_collectionpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/method/report_sync_collection.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,13 +25,13 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.http import ErrorResponse
-from twext.web2 import responsecode
-from twext.web2.dav.http import MultiStatusResponse, statusForFailure
-from twext.web2.dav.method.prop_common import responseForHref
-from twext.web2.dav.method.propfind import propertyName
-from twext.web2.dav.util import joinURL
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
+from txweb2 import responsecode
+from txweb2.dav.http import MultiStatusResponse, statusForFailure
+from txweb2.dav.method.prop_common import responseForHref
+from txweb2.dav.method.propfind import propertyName
+from txweb2.dav.util import joinURL
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavnotificationspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/notifications.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue,\
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -46,17 +46,17 @@
</span><span class="cx"> from txdav.xml import element
</span><span class="cx"> from txdav.xml.element import dav_namespace
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode, http, http_headers
-from twext.web2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
-from twext.web2.dav.idav import IDAVPrincipalCollectionResource
-from twext.web2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource, \
</del><ins>+from txweb2 import responsecode, http, http_headers
+from txweb2.dav.auth import AuthenticationWrapper as SuperAuthenticationWrapper
+from txweb2.dav.idav import IDAVPrincipalCollectionResource
+from txweb2.dav.resource import AccessDeniedError, DAVPrincipalCollectionResource, \
</ins><span class="cx">     davPrivilegeSet
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.dav.util import joinURL, parentForURL, normalizeURL
-from twext.web2.http import HTTPError, RedirectResponse, StatusResponse, Response
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http_headers import MimeType, ETag
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.dav.util import joinURL, parentForURL, normalizeURL
+from txweb2.http import HTTPError, RedirectResponse, StatusResponse, Response
+from txweb2.dav.http import ErrorResponse
+from txweb2.http_headers import MimeType, ETag
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml, customxml
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="lines">@@ -322,7 +322,7 @@
</span><span class="cx">         successfully rendered.
</span><span class="cx"> 
</span><span class="cx">         @param request: the request to generate a response for.
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">         @param transaction: optional transaction to use instead of associated transaction
</span><span class="cx">         @type transaction: L{txdav.caldav.idav.ITransaction}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1354,7 +1354,7 @@
</span><span class="cx">             if self.exists() and hasattr(self, &quot;scheduleEtags&quot;):
</span><span class="cx">                 etags = self.scheduleEtags
</span><span class="cx">                 if len(etags) &gt; 1:
</span><del>-                    # This is almost verbatim from twext.web2.static.checkPreconditions
</del><ins>+                    # This is almost verbatim from txweb2.static.checkPreconditions
</ins><span class="cx">                     if request.method not in (&quot;GET&quot;, &quot;HEAD&quot;):
</span><span class="cx"> 
</span><span class="cx">                         # Always test against the current etag first just in case schedule-etags is out of sync
</span><span class="lines">@@ -1402,7 +1402,7 @@
</span><span class="cx">         @param request: the request used to look up parent resources to
</span><span class="cx">             validate.
</span><span class="cx"> 
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @return: a deferred that fires when a calendar collection has been
</span><span class="cx">             created in this resource.
</span><span class="lines">@@ -1488,7 +1488,7 @@
</span><span class="cx">         @param request: the request used to look up parent resources to
</span><span class="cx">             validate.
</span><span class="cx"> 
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @return: a deferred that fires when an addressbook collection has been
</span><span class="cx">             created in this resource.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,11 +33,11 @@
</span><span class="cx"> # around that for now.
</span><span class="cx"> __import__(&quot;twistedcaldav.stdconfig&quot;) # FIXME
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import davPrivilegeSet
-from twext.web2.dav.util import joinURL, normalizeURL
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import davPrivilegeSet
+from txweb2.dav.util import joinURL, normalizeURL
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python.failure import Failure
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavscheduling_storecaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/scheduling_store/caldav/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> class Properties (StoreTestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/sharing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -25,11 +25,11 @@
</span><span class="cx">     &quot;SharedHomeMixin&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response, XMLResponse
-from twext.web2.dav.http import ErrorResponse, MultiStatusResponse
-from twext.web2.dav.resource import TwistedACLInheritable
-from twext.web2.dav.util import allDataFromStream, joinURL
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response, XMLResponse
+from txweb2.dav.http import ErrorResponse, MultiStatusResponse
+from txweb2.dav.resource import TwistedACLInheritable
+from txweb2.dav.util import allDataFromStream, joinURL
</ins><span class="cx"> 
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_OWN, \
</span><span class="cx">     _BIND_MODE_READ, _BIND_MODE_WRITE, _BIND_STATUS_INVITED, \
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx"> 
</span><span class="cx">         @return: the (asynchronous) HTTP result to respond to the direct-share
</span><span class="cx">             request.
</span><del>-        @rtype: L{Deferred} firing L{twext.web2.http.Response}, failing with
</del><ins>+        @rtype: L{Deferred} firing L{txweb2.http.Response}, failing with
</ins><span class="cx">             L{HTTPError}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -299,13 +299,13 @@
</span><span class="cx">         underlying shared collection.
</span><span class="cx"> 
</span><span class="cx">         @param request: the request used to locate the owner resource.
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @param args: The arguments for
</span><del>-            L{twext.web2.dav.idav.IDAVResource.accessControlList}
</del><ins>+            L{txweb2.dav.idav.IDAVResource.accessControlList}
</ins><span class="cx"> 
</span><span class="cx">         @param kwargs: The keyword arguments for
</span><del>-            L{twext.web2.dav.idav.IDAVResource.accessControlList}, plus
</del><ins>+            L{txweb2.dav.idav.IDAVResource.accessControlList}, plus
</ins><span class="cx">             keyword-only arguments.
</span><span class="cx"> 
</span><span class="cx">         @return: the appropriate WebDAV ACL for the sharee
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavsimpleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/simpleresource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,9 +26,9 @@
</span><span class="cx">     &quot;SimpleDataResource&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-from twext.web2 import http
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import Response
</del><ins>+from txweb2 import http
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import Response
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstdconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/stdconfig.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,9 +22,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.python.runtime import platform
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import PlistParser #@UnresolvedImport
</del><ins>+from plistlib import PlistParser #@UnresolvedImport
</ins><span class="cx"> from twext.python.log import Logger, InvalidLogLevelError, LogLevel
</span><del>-from twext.web2.dav.resource import TwistedACLInheritable
</del><ins>+from txweb2.dav.resource import TwistedACLInheritable
</ins><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> from twistedcaldav.util import getPasswordFromKeychain
</span><span class="cx"> from twistedcaldav.util import KeychainAccessError, KeychainPasswordNotFound
</span><span class="cx"> from twistedcaldav.util import computeProcessCount
</span><ins>+from twistedcaldav.datafilters.peruserdata import PerUserDataFilter
</ins><span class="cx"> 
</span><span class="cx"> from calendarserver.push.util import getAPNTopicFromCertificate
</span><span class="cx"> from twistedcaldav import ical
</span><span class="lines">@@ -166,7 +167,7 @@
</span><span class="cx"> DEFAULT_RESOURCE_PARAMS = {
</span><span class="cx">     &quot;twistedcaldav.directory.xmlfile.XMLDirectoryService&quot;: {
</span><span class="cx">         &quot;xmlFile&quot;: &quot;resources.xml&quot;,
</span><del>-        &quot;recordTypes&quot; : (&quot;locations&quot;, &quot;resources&quot;),
</del><ins>+        &quot;recordTypes&quot; : (&quot;locations&quot;, &quot;resources&quot;, &quot;addresses&quot;),
</ins><span class="cx">     },
</span><span class="cx">     &quot;twistedcaldav.directory.appleopendirectory.OpenDirectoryService&quot;: {
</span><span class="cx">         &quot;node&quot;: &quot;/Search&quot;,
</span><span class="lines">@@ -588,10 +589,13 @@
</span><span class="cx"> 
</span><span class="cx">         &quot;Calendars&quot; : {
</span><span class="cx">             &quot;Enabled&quot;         : True, # Calendar on/off switch
</span><ins>+            &quot;IgnorePerUserProperties&quot; : [
+                &quot;X-APPLE-STRUCTURED-LOCATION&quot;,
+            ],
</ins><span class="cx">         },
</span><span class="cx">         &quot;AddressBooks&quot; : {
</span><span class="cx">             &quot;Enabled&quot;         : False, # Address Books on/off switch
</span><del>-        }
</del><ins>+        },
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     &quot;RestrictCalendarsToOneComponentType&quot; : True, # Only allow calendars to be created with a single component type
</span><span class="lines">@@ -619,6 +623,8 @@
</span><span class="cx">     &quot;EnableDefaultAlarms&quot; : True, # Support for default alarms generated by the server
</span><span class="cx">     &quot;RemoveDuplicateAlarms&quot;: True, # Remove duplicate alarms on PUT
</span><span class="cx"> 
</span><ins>+    &quot;RemoveDuplicatePrivateComments&quot;: False, # Remove duplicate private comments on PUT
+
</ins><span class="cx">     # CardDAV Features
</span><span class="cx">     &quot;DirectoryAddressBook&quot;: {
</span><span class="cx">         &quot;Enabled&quot;: True,
</span><span class="lines">@@ -948,6 +954,7 @@
</span><span class="cx">         &quot;DatabaseName&quot;: &quot;caldav&quot;,
</span><span class="cx">         &quot;ClusterName&quot;: &quot;cluster&quot;,
</span><span class="cx">         &quot;LogFile&quot;: &quot;postgres.log&quot;,
</span><ins>+        &quot;SocketDirectory&quot;: &quot;&quot;,
</ins><span class="cx">         &quot;ListenAddresses&quot;: [],
</span><span class="cx">         &quot;SharedBuffers&quot;: 0, # BuffersToConnectionsRatio * MaxConnections
</span><span class="cx">                             # Note: don't set this, it will be computed dynamically
</span><span class="lines">@@ -1004,7 +1011,7 @@
</span><span class="cx">     &quot;FreeBusyIndexDelayedExpand&quot;: True,
</span><span class="cx"> 
</span><span class="cx">     # The RootResource uses a twext property store. Specify the class here
</span><del>-    &quot;RootResourcePropStoreClass&quot;: &quot;twext.web2.dav.xattrprops.xattrPropertyStore&quot;,
</del><ins>+    &quot;RootResourcePropStoreClass&quot;: &quot;txweb2.dav.xattrprops.xattrPropertyStore&quot;,
</ins><span class="cx"> 
</span><span class="cx">     # Used in the command line utilities to specify which service class to
</span><span class="cx">     # use to carry out work.
</span><span class="lines">@@ -1557,7 +1564,16 @@
</span><span class="cx">                         (direction,))
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def _updateSharing(configDict, reloading=False):
+    #
+    # Sharing
+    #
</ins><span class="cx"> 
</span><ins>+    # Transfer configured non-per-user property names to PerUserDataFilter
+    for propertyName in configDict.Sharing.Calendars.IgnorePerUserProperties:
+        PerUserDataFilter.IGNORE_X_PROPERTIES.append(propertyName)
+
+
</ins><span class="cx"> def _updateServers(configDict, reloading=False):
</span><span class="cx">     from txdav.caldav.datastore.scheduling.ischedule.localservers import Servers
</span><span class="cx">     if configDict.Servers.Enabled:
</span><span class="lines">@@ -1635,6 +1651,7 @@
</span><span class="cx">     _updateNotifications,
</span><span class="cx">     _updateICalendar,
</span><span class="cx">     _updateScheduling,
</span><ins>+    _updateSharing,
</ins><span class="cx">     _updateServers,
</span><span class="cx">     _updateCompliance,
</span><span class="cx">     )
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavstorebridgepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/storebridge.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,19 +17,22 @@
</span><span class="cx"> 
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> 
</span><ins>+from twext.enterprise.locking import LockTimeout
</ins><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse, ResponseQueue, MultiStatusResponse
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.dav.resource import TwistedACLInheritable, AccessDeniedError, \
</del><ins>+from txweb2 import responsecode, http_headers, http
+from txweb2.dav.http import ErrorResponse, ResponseQueue, MultiStatusResponse
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.dav.resource import TwistedACLInheritable, AccessDeniedError, \
</ins><span class="cx">     davPrivilegeSet
</span><del>-from twext.web2.dav.util import parentForURL, allDataFromStream, joinURL, davXMLFromStream
-from twext.web2.filter.location import addLocation
-from twext.web2.http import HTTPError, StatusResponse, Response
-from twext.web2.http_headers import ETag, MimeType, MimeDisposition
-from twext.web2.responsecode import \
</del><ins>+from txweb2.dav.util import parentForURL, allDataFromStream, joinURL, davXMLFromStream
+from txweb2.filter.location import addLocation
+from txweb2.http import HTTPError, StatusResponse, Response
+from txweb2.http_headers import ETag, MimeType, MimeDisposition
+from txweb2.iweb import IResponse
+from txweb2.responsecode import \
</ins><span class="cx">     FORBIDDEN, NO_CONTENT, NOT_FOUND, CREATED, CONFLICT, PRECONDITION_FAILED, \
</span><span class="cx">     BAD_REQUEST, OK, INSUFFICIENT_STORAGE_SPACE, SERVICE_UNAVAILABLE
</span><del>-from twext.web2.stream import ProducerStream, readStream, MemoryStream
</del><ins>+from txweb2.stream import ProducerStream, readStream, MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.internet.protocol import Protocol
</span><span class="lines">@@ -41,14 +44,20 @@
</span><span class="cx">     MaxInstances, NoUIDConflict
</span><span class="cx"> from twistedcaldav.carddavxml import carddav_namespace, NoUIDConflict as NovCardUIDConflict
</span><span class="cx"> from twistedcaldav.config import config
</span><ins>+from twistedcaldav.customxml import calendarserver_namespace
</ins><span class="cx"> from twistedcaldav.directory.wiki import WikiDirectoryService, getWikiAccess
</span><span class="cx"> from twistedcaldav.ical import Component as VCalendar, Property as VProperty, \
</span><span class="cx">     InvalidICalendarDataError, iCalendarProductID, Component
</span><ins>+from twistedcaldav.instance import InvalidOverriddenInstanceError, \
+    TooManyInstancesError
</ins><span class="cx"> from twistedcaldav.memcachelock import MemcacheLockTimeoutError
</span><span class="cx"> from twistedcaldav.notifications import NotificationCollectionResource, NotificationResource
</span><span class="cx"> from twistedcaldav.resource import CalDAVResource, GlobalAddressBookResource, \
</span><span class="cx">     DefaultAlarmPropertyMixin
</span><span class="cx"> from twistedcaldav.scheduling_store.caldav.resource import ScheduleInboxResource
</span><ins>+from twistedcaldav.sharing import invitationBindStatusToXMLMap, \
+    invitationBindModeToXMLMap
+from twistedcaldav.util import bestAcceptType
</ins><span class="cx"> from twistedcaldav.vcard import Component as VCard, InvalidVCardDataError
</span><span class="cx"> 
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="lines">@@ -58,7 +67,7 @@
</span><span class="cx">     TooManyAttendeesError, InvalidCalendarAccessError, ValidOrganizerError, \
</span><span class="cx">     InvalidPerUserDataMerge, \
</span><span class="cx">     AttendeeAllowedError, ResourceDeletedError, InvalidAttachmentOperation, \
</span><del>-    ShareeAllowedError
</del><ins>+    ShareeAllowedError, DuplicatePrivateCommentsError
</ins><span class="cx"> from txdav.carddav.iaddressbookstore import KindChangeNotAllowedError, \
</span><span class="cx">     GroupWithUnsharedAddressNotAllowedError
</span><span class="cx"> from txdav.common.datastore.sql_tables import _BIND_MODE_READ, _BIND_MODE_WRITE, \
</span><span class="lines">@@ -74,19 +83,10 @@
</span><span class="cx"> from txdav.xml.base import dav_namespace, WebDAVUnknownElement, encodeXMLName
</span><span class="cx"> 
</span><span class="cx"> from urlparse import urlsplit, urljoin
</span><ins>+import collections
</ins><span class="cx"> import hashlib
</span><span class="cx"> import time
</span><span class="cx"> import uuid
</span><del>-from twext.web2 import responsecode, http_headers, http
-from twext.web2.iweb import IResponse
-from twistedcaldav.customxml import calendarserver_namespace
-from twistedcaldav.instance import InvalidOverriddenInstanceError, \
-    TooManyInstancesError
-from twistedcaldav.util import bestAcceptType
-import collections
-from twistedcaldav.sharing import invitationBindStatusToXMLMap, \
-    invitationBindModeToXMLMap
-
</del><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> Wrappers to translate between the APIs in L{txdav.caldav.icalendarstore} and
</span><span class="cx"> L{txdav.carddav.iaddressbookstore} and those in L{twistedcaldav}.
</span><span class="lines">@@ -450,12 +450,12 @@
</span><span class="cx">             this is the request which I{triggered} the C{DELETE}, but which may
</span><span class="cx">             not actually be a C{DELETE} request itself.
</span><span class="cx"> 
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @return: an HTTP response suitable for sending to a client (or
</span><span class="cx">             including in a multi-status).
</span><span class="cx"> 
</span><del>-        @rtype: something adaptable to L{twext.web2.iweb.IResponse}
</del><ins>+        @rtype: something adaptable to L{txweb2.iweb.IResponse}
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Check sharee collection first
</span><span class="lines">@@ -2291,11 +2291,53 @@
</span><span class="cx">         returnValue(response)
</span><span class="cx"> 
</span><span class="cx">     # The following are used to map store exceptions into HTTP error responses
</span><del>-    StoreExceptionsStatusErrors = set()
</del><span class="cx">     StoreExceptionsErrors = {}
</span><del>-    StoreMoveExceptionsStatusErrors = set()
</del><span class="cx">     StoreMoveExceptionsErrors = {}
</span><ins>+    StoreRemoveExceptionsErrors = {}
</ins><span class="cx"> 
</span><ins>+    @classmethod
+    def _storeExceptionStatus(cls, err, arg):
+        &quot;&quot;&quot;
+        Raise a status error.
+
+        @param err: the actual exception that caused the error
+        @type err: L{Exception}
+        @param arg: description of error or C{None}
+        @type arg: C{str} or C{None}
+        &quot;&quot;&quot;
+        raise HTTPError(StatusResponse(responsecode.FORBIDDEN, arg if arg is not None else str(err)))
+
+
+    @classmethod
+    def _storeExceptionError(cls, err, arg):
+        &quot;&quot;&quot;
+        Raise a DAV:error error with the supplied error element.
+
+        @param err: the actual exception that caused the error
+        @type err: L{Exception}
+        @param arg: the error element
+        @type arg: C{tuple}
+        &quot;&quot;&quot;
+        raise HTTPError(ErrorResponse(
+            responsecode.FORBIDDEN,
+            arg,
+            str(err),
+        ))
+
+
+    @classmethod
+    def _storeExceptionUnavailable(cls, err, arg):
+        &quot;&quot;&quot;
+        Raise a service unavailable error.
+
+        @param err: the actual exception that caused the error
+        @type err: L{Exception}
+        @param arg: description of error or C{None}
+        @type arg: C{str} or C{None}
+        &quot;&quot;&quot;
+        raise HTTPError(StatusResponse(responsecode.SERVICE_UNAVAILABLE, arg if arg is not None else str(err)))
+
+
</ins><span class="cx">     @requiresPermissions(fromParent=[davxml.Unbind()])
</span><span class="cx">     def http_DELETE(self, request):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -2387,15 +2429,9 @@
</span><span class="cx">             # Grab the current exception state here so we can use it in a re-raise - we need this because
</span><span class="cx">             # an inlineCallback might be called and that raises an exception when it returns, wiping out the
</span><span class="cx">             # original exception &quot;context&quot;.
</span><del>-            if type(err) in self.StoreMoveExceptionsStatusErrors:
-                raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
-            elif type(err) in self.StoreMoveExceptionsErrors:
-                raise HTTPError(ErrorResponse(
-                    responsecode.FORBIDDEN,
-                    self.StoreMoveExceptionsErrors[type(err)],
-                    str(err),
-                ))
</del><ins>+            if type(err) in self.StoreMoveExceptionsErrors:
+                error, arg = self.StoreMoveExceptionsErrors[type(err)]
+                error(err, arg)
</ins><span class="cx">             else:
</span><span class="cx">                 # Return the original failure (exception) state
</span><span class="cx">                 raise
</span><span class="lines">@@ -2438,15 +2474,9 @@
</span><span class="cx"> 
</span><span class="cx">         # Map store exception to HTTP errors
</span><span class="cx">         except Exception as err:
</span><del>-            if type(err) in self.StoreExceptionsStatusErrors:
-                raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
-            elif type(err) in self.StoreExceptionsErrors:
-                raise HTTPError(ErrorResponse(
-                    responsecode.FORBIDDEN,
-                    self.StoreExceptionsErrors[type(err)],
-                    str(err),
-                ))
</del><ins>+            if type(err) in self.StoreExceptionsErrors:
+                error, arg = self.StoreExceptionsErrors[type(err)]
+                error(err, arg)
</ins><span class="cx">             else:
</span><span class="cx">                 raise
</span><span class="cx"> 
</span><span class="lines">@@ -2457,7 +2487,7 @@
</span><span class="cx">         Move this object to a different parent.
</span><span class="cx"> 
</span><span class="cx">         @param request:
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx">         @param destinationparent: Parent to move to
</span><span class="cx">         @type destinationparent: L{CommonHomeChild}
</span><span class="cx">         @param destination_name: name of new resource
</span><span class="lines">@@ -2476,12 +2506,12 @@
</span><span class="cx">         @param request: Unused by this implementation; present for signature
</span><span class="cx">             compatibility with L{CalendarCollectionResource.storeRemove}.
</span><span class="cx"> 
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @return: an HTTP response suitable for sending to a client (or
</span><span class="cx">             including in a multi-status).
</span><span class="cx"> 
</span><del>-         @rtype: something adaptable to L{twext.web2.iweb.IResponse}
</del><ins>+         @rtype: something adaptable to L{txweb2.iweb.IResponse}
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx">         # Do delete
</span><span class="lines">@@ -2491,6 +2521,14 @@
</span><span class="cx">         except NoSuchObjectResourceError:
</span><span class="cx">             raise HTTPError(NOT_FOUND)
</span><span class="cx"> 
</span><ins>+        # Map store exception to HTTP errors
+        except Exception as err:
+            if type(err) in self.StoreExceptionsErrors:
+                error, arg = self.StoreExceptionsErrors[type(err)]
+                error(err, arg)
+            else:
+                raise
+
</ins><span class="cx">         # Re-initialize to get stuff setup again now we have no object
</span><span class="cx">         self._initializeWithObject(None, self._newStoreParent)
</span><span class="cx"> 
</span><span class="lines">@@ -2624,50 +2662,51 @@
</span><span class="cx">         else:
</span><span class="cx">             return False
</span><span class="cx"> 
</span><del>-    StoreExceptionsStatusErrors = set((
-        ObjectResourceNameNotAllowedError,
-        ObjectResourceNameAlreadyExistsError,
-    ))
-
</del><span class="cx">     StoreExceptionsErrors = {
</span><del>-        TooManyObjectResourcesError: customxml.MaxResources(),
-        ObjectResourceTooBigError: (caldav_namespace, &quot;max-resource-size&quot;),
-        InvalidObjectResourceError: (caldav_namespace, &quot;valid-calendar-data&quot;),
-        InvalidComponentForStoreError: (caldav_namespace, &quot;valid-calendar-object-resource&quot;),
-        InvalidComponentTypeError: (caldav_namespace, &quot;supported-component&quot;),
-        TooManyAttendeesError: MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance)),
-        InvalidCalendarAccessError: (calendarserver_namespace, &quot;valid-access-restriction&quot;),
-        ValidOrganizerError: (calendarserver_namespace, &quot;valid-organizer&quot;),
-        UIDExistsError: NoUIDConflict(),
-        UIDExistsElsewhereError: (caldav_namespace, &quot;unique-scheduling-object-resource&quot;),
-        InvalidUIDError: NoUIDConflict(),
-        InvalidPerUserDataMerge: (caldav_namespace, &quot;valid-calendar-data&quot;),
-        AttendeeAllowedError: (caldav_namespace, &quot;attendee-allowed&quot;),
-        InvalidOverriddenInstanceError: (caldav_namespace, &quot;valid-calendar-data&quot;),
-        TooManyInstancesError: MaxInstances.fromString(str(config.MaxAllowedInstances)),
-        AttachmentStoreValidManagedID: (caldav_namespace, &quot;valid-managed-id&quot;),
-        ShareeAllowedError: (calendarserver_namespace, &quot;sharee-privilege-needed&quot;,),
</del><ins>+        ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+        ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+        TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+        ObjectResourceTooBigError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;max-resource-size&quot;),),
+        InvalidObjectResourceError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-calendar-data&quot;),),
+        InvalidComponentForStoreError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-calendar-object-resource&quot;),),
+        InvalidComponentTypeError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;supported-component&quot;),),
+        TooManyAttendeesError: (_CommonObjectResource._storeExceptionError, MaxAttendeesPerInstance.fromString(str(config.MaxAttendeesPerInstance)),),
+        InvalidCalendarAccessError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;valid-access-restriction&quot;),),
+        ValidOrganizerError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;valid-organizer&quot;),),
+        UIDExistsError: (_CommonObjectResource._storeExceptionError, NoUIDConflict(),),
+        UIDExistsElsewhereError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;unique-scheduling-object-resource&quot;),),
+        InvalidUIDError: (_CommonObjectResource._storeExceptionError, NoUIDConflict(),),
+        InvalidPerUserDataMerge: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-calendar-data&quot;),),
+        AttendeeAllowedError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;attendee-allowed&quot;),),
+        InvalidOverriddenInstanceError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-calendar-data&quot;),),
+        TooManyInstancesError: (_CommonObjectResource._storeExceptionError, MaxInstances.fromString(str(config.MaxAllowedInstances)),),
+        AttachmentStoreValidManagedID: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-managed-id&quot;),),
+        ShareeAllowedError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;sharee-privilege-needed&quot;,),),
+        DuplicatePrivateCommentsError: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;no-duplicate-private-comments&quot;,),),
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    StoreMoveExceptionsStatusErrors = set((
-        ObjectResourceNameNotAllowedError,
-        ObjectResourceNameAlreadyExistsError,
-    ))
-
</del><span class="cx">     StoreMoveExceptionsErrors = {
</span><del>-        TooManyObjectResourcesError: customxml.MaxResources(),
-        InvalidResourceMove: (calendarserver_namespace, &quot;valid-move&quot;),
-        InvalidComponentTypeError: (caldav_namespace, &quot;supported-component&quot;),
</del><ins>+        ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+        ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+        TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+        InvalidResourceMove: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;valid-move&quot;),),
+        InvalidComponentTypeError: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;supported-component&quot;),),
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    StoreRemoveExceptionsErrors = {
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
+    }
+
</ins><span class="cx">     StoreAttachmentValidErrors = set((
</span><span class="cx">         AttachmentStoreFailed,
</span><span class="cx">         InvalidAttachmentOperation,
</span><span class="cx">     ))
</span><span class="cx"> 
</span><span class="cx">     StoreAttachmentExceptionsErrors = {
</span><del>-        AttachmentStoreValidManagedID: (caldav_namespace, &quot;valid-managed-id-parameter&quot;,),
-        AttachmentRemoveFailed: (caldav_namespace, &quot;valid-attachment-remove&quot;,),
</del><ins>+        AttachmentStoreValidManagedID: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-managed-id-parameter&quot;,),),
+        AttachmentRemoveFailed: (_CommonObjectResource._storeExceptionError, (caldav_namespace, &quot;valid-attachment-remove&quot;,),),
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2683,7 +2722,7 @@
</span><span class="cx">             if self.exists():
</span><span class="cx">                 etags = self.scheduleEtags
</span><span class="cx">                 if len(etags) &gt; 1:
</span><del>-                    # This is almost verbatim from twext.web2.static.checkPreconditions
</del><ins>+                    # This is almost verbatim from txweb2.static.checkPreconditions
</ins><span class="cx">                     if request.method not in (&quot;GET&quot;, &quot;HEAD&quot;):
</span><span class="cx"> 
</span><span class="cx">                         # Always test against the current etag first just in case schedule-etags is out of sync
</span><span class="lines">@@ -2981,28 +3020,15 @@
</span><span class="cx">         except Exception as err:
</span><span class="cx"> 
</span><span class="cx">             if type(err) in self.StoreAttachmentValidErrors:
</span><del>-                raise HTTPError(ErrorResponse(
-                    responsecode.FORBIDDEN,
-                    (caldav_namespace, valid_preconditions[action],),
-                    str(err),
-                ))
</del><ins>+                self._storeExceptionError(err, (caldav_namespace, valid_preconditions[action],))
</ins><span class="cx"> 
</span><span class="cx">             elif type(err) in self.StoreAttachmentExceptionsErrors:
</span><del>-                raise HTTPError(ErrorResponse(
-                    responsecode.FORBIDDEN,
-                    self.StoreAttachmentExceptionsErrors[type(err)],
-                    str(err),
-                ))
</del><ins>+                error, arg = self.StoreAttachmentExceptionsErrors[type(err)]
+                error(err, arg)
</ins><span class="cx"> 
</span><del>-            elif type(err) in self.StoreExceptionsStatusErrors:
-                raise HTTPError(StatusResponse(responsecode.FORBIDDEN, str(err)))
-
</del><span class="cx">             elif type(err) in self.StoreExceptionsErrors:
</span><del>-                raise HTTPError(ErrorResponse(
-                    responsecode.FORBIDDEN,
-                    self.StoreExceptionsErrors[type(err)],
-                    str(err),
-                ))
</del><ins>+                error, arg = self.StoreExceptionsErrors[type(err)]
+                error(err, arg)
</ins><span class="cx"> 
</span><span class="cx">             else:
</span><span class="cx">                 raise
</span><span class="lines">@@ -3300,32 +3326,32 @@
</span><span class="cx"> 
</span><span class="cx">     vCard = _CommonObjectResource.component
</span><span class="cx"> 
</span><del>-    StoreExceptionsStatusErrors = set((
-        ObjectResourceNameNotAllowedError,
-        ObjectResourceNameAlreadyExistsError,
-    ))
-
</del><span class="cx">     StoreExceptionsErrors = {
</span><del>-        TooManyObjectResourcesError: customxml.MaxResources(),
-        ObjectResourceTooBigError: (carddav_namespace, &quot;max-resource-size&quot;),
-        InvalidObjectResourceError: (carddav_namespace, &quot;valid-address-data&quot;),
-        InvalidComponentForStoreError: (carddav_namespace, &quot;valid-addressbook-object-resource&quot;),
-        UIDExistsError: NovCardUIDConflict(),
-        InvalidUIDError: NovCardUIDConflict(),
-        InvalidPerUserDataMerge: (carddav_namespace, &quot;valid-address-data&quot;),
</del><ins>+        ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+        ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+        TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+        ObjectResourceTooBigError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, &quot;max-resource-size&quot;),),
+        InvalidObjectResourceError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, &quot;valid-address-data&quot;),),
+        InvalidComponentForStoreError: (_CommonObjectResource._storeExceptionError, (carddav_namespace, &quot;valid-addressbook-object-resource&quot;),),
+        UIDExistsError: (_CommonObjectResource._storeExceptionError, NovCardUIDConflict(),),
+        InvalidUIDError: (_CommonObjectResource._storeExceptionError, NovCardUIDConflict(),),
+        InvalidPerUserDataMerge: (_CommonObjectResource._storeExceptionError, (carddav_namespace, &quot;valid-address-data&quot;),),
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    StoreMoveExceptionsStatusErrors = set((
-        ObjectResourceNameNotAllowedError,
-        ObjectResourceNameAlreadyExistsError,
-    ))
-
</del><span class="cx">     StoreMoveExceptionsErrors = {
</span><del>-        TooManyObjectResourcesError: customxml.MaxResources(),
-        InvalidResourceMove: (calendarserver_namespace, &quot;valid-move&quot;),
</del><ins>+        ObjectResourceNameNotAllowedError: (_CommonObjectResource._storeExceptionStatus, None,),
+        ObjectResourceNameAlreadyExistsError: (_CommonObjectResource._storeExceptionStatus, None,),
+        TooManyObjectResourcesError: (_CommonObjectResource._storeExceptionError, customxml.MaxResources(),),
+        InvalidResourceMove: (_CommonObjectResource._storeExceptionError, (calendarserver_namespace, &quot;valid-move&quot;),),
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    StoreRemoveExceptionsErrors = {
+        LockTimeout: (_CommonObjectResource._storeExceptionUnavailable, &quot;Lock timed out.&quot;,),
+    }
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     def resourceType(self):
</span><span class="cx">         if self.isShared():
</span><span class="cx">             return customxml.ResourceType.sharedownergroup
</span><span class="lines">@@ -3488,13 +3514,13 @@
</span><span class="cx">         &quot;direct&quot; shares are not supported.
</span><span class="cx"> 
</span><span class="cx">         @param request: the request used to locate the owner resource.
</span><del>-        @type request: L{twext.web2.iweb.IRequest}
</del><ins>+        @type request: L{txweb2.iweb.IRequest}
</ins><span class="cx"> 
</span><span class="cx">         @param args: The arguments for
</span><del>-            L{twext.web2.dav.idav.IDAVResource.accessControlList}
</del><ins>+            L{txweb2.dav.idav.IDAVResource.accessControlList}
</ins><span class="cx"> 
</span><span class="cx">         @param kwargs: The keyword arguments for
</span><del>-            L{twext.web2.dav.idav.IDAVResource.accessControlList}, plus
</del><ins>+            L{txweb2.dav.idav.IDAVResource.accessControlList}, plus
</ins><span class="cx">             keyword-only arguments.
</span><span class="cx"> 
</span><span class="cx">         @return: the appropriate WebDAV ACL for the sharee
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_accountingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_accounting.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.channel.http import HTTPLoggingChannelRequest
-from twext.web2 import http_headers
-from twext.web2.channel.http import HTTPChannel
</del><ins>+from txweb2.channel.http import HTTPLoggingChannelRequest
+from txweb2 import http_headers
+from txweb2.channel.http import HTTPChannel
</ins><span class="cx"> from twistedcaldav.accounting import emitAccounting
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> import twistedcaldav.test.util
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookmultigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookmultiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,11 +16,11 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
-from twext.web2.dav.util import davXMLFromStream, joinURL
-from twext.web2.http_headers import Headers, MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
+from txweb2.dav.util import davXMLFromStream, joinURL
+from txweb2.http_headers import Headers, MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import carddavxml
</span><span class="cx"> from twistedcaldav import vcard
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_addressbookquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_addressbookquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,11 +16,11 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import davXMLFromStream, joinURL
</del><ins>+from txweb2.dav.util import davXMLFromStream, joinURL
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import carddavxml, vcard
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_cachepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_cache.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,9 +20,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, maybeDeferred, inlineCallbacks
</span><span class="cx"> 
</span><del>-from twext.web2.dav.util import allDataFromStream
-from twext.web2.stream import MemoryStream
-from twext.web2.http_headers import Headers
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.stream import MemoryStream
+from txweb2.http_headers import Headers
</ins><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_calendarquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_calendarquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,11 +18,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.trial.unittest import SkipTest
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.util import davXMLFromStream
</del><ins>+from txweb2.dav.util import davXMLFromStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav import ical
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_collectioncontentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_collectioncontents.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,10 +16,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream, FileStream
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream, FileStream
+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.ical import Component
</span><span class="cx"> from twistedcaldav.memcachelock import MemcacheLock
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><del>-from twext.web2.dav.util import joinURL
</del><ins>+from txweb2.dav.util import joinURL
</ins><span class="cx"> from txdav.caldav.datastore.sql import CalendarObject
</span><span class="cx"> 
</span><span class="cx"> class CollectionContents(StoreTestCase):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_configpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_config.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,7 +16,7 @@
</span><span class="cx"> 
</span><span class="cx"> import socket
</span><span class="cx"> 
</span><del>-from twext.python.plistlib import writePlist #@UnresolvedImport
</del><ins>+from plistlib import writePlist #@UnresolvedImport
</ins><span class="cx"> from twext.python.log import LogLevel
</span><span class="cx"> from twext.python.test.test_log import defaultLogLevel, logLevelForNamespace
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_extensionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_extensions.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,8 +16,8 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.static import MetaDataMixin
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.static import MetaDataMixin
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, Deferred, succeed
</span><span class="cx"> from twisted.web.microdom import parseString
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_freebusyquerypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_freebusyquery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,11 +21,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav import caldavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_icalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_icalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -10128,3 +10128,322 @@
</span><span class="cx">             ical2 = Component.fromString(calendar)
</span><span class="cx">             ical2.onlyPastInstances(rid)
</span><span class="cx">             self.assertEqual(str(ical2), split_past.replace(&quot;\n&quot;, &quot;\r\n&quot;), &quot;Failed past: %s&quot; % (title,))
</span><ins>+
+
+    def test_hasDuplicatePrivateComments(self):
+        &quot;&quot;&quot;
+        Test that L{Component.hasDuplicatePrivateComments} correctly detects, but does not fix, duplicate private comments.
+        &quot;&quot;&quot;
+
+        data = (
+            (
+                &quot;No comments&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;One comment&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;Two different comments&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;Two duplicates, one different&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                True,
+            ),
+
+            (
+                &quot;No duplicates in two components&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user03&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message3
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;Two duplicates in one component, three different in another&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user03&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message3
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                True,
+            ),
+        )
+
+        for title, txt, result in data:
+            component = Component.fromString(txt)
+            self.assertEqual(component.hasDuplicatePrivateComments(doFix=False), result, msg=title)
+            self.assertEqual(normalize_iCalStr(component), normalize_iCalStr(txt), msg=title)
+
+
+    def test_hasDuplicatePrivateComments_withFix(self):
+        &quot;&quot;&quot;
+        Test that L{Component.hasDuplicatePrivateComments} correctly removes duplicate comments.
+        &quot;&quot;&quot;
+
+        data = (
+            (
+                &quot;No comments&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;One comment&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;Two different comments&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+
+            (
+                &quot;Two duplicates, one different&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890
+DTSTART:20080601T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+END:VEVENT
+BEGIN:VEVENT
+UID:12345-67890
+RECURRENCE-ID:20080602T120000Z
+DTSTART:20080602T120000Z
+DURATION:PT1H
+DTSTAMP:20080601T120000Z
+SUMMARY:Test
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user01&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message1
+X-CALENDARSERVER-ATTENDEE-COMMENT;X-CALENDARSERVER-ATTENDEE-REF=&quot;urn:uuid:user02&quot;;X-CALENDARSERVER-DTSTAMP=20130606T152554Z:Message2
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;,
+                False,
+            ),
+        )
+
+        for title, txt, result, result_changed in data:
+            component = Component.fromString(txt)
+            changed = component.hasDuplicatePrivateComments(doFix=True)
+            self.assertEqual(sorted(normalize_iCalStr(component).splitlines()), sorted(normalize_iCalStr(result).splitlines()), msg=title)
+            self.assertEqual(changed, result_changed, msg=title)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_kerberospy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_kerberos.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx"> from twisted.cred.error import LoginFailed
</span><span class="cx"> from twisted.cred.error import UnauthorizedLogin
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import authkerb
</span><span class="cx"> import twistedcaldav.test.util
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_linkpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_link.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,9 +14,9 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachelockpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcachelock.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -5,16 +5,17 @@
</span><span class="cx"> Test the memcache client protocol.
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-from twext.protocols.memcache import MemCacheProtocol
-
</del><span class="cx"> from twisted.test.proto_helpers import StringTransportWithDisconnection
</span><span class="cx"> from twisted.internet.task import Clock
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><ins>+from twisted.protocols.memcache import MemCacheProtocol
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav.test.util import TestCase
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class MemCacheTestCase(TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Test client protocol class L{MemCacheProtocol}.
</span><span class="lines">@@ -22,22 +23,32 @@
</span><span class="cx"> 
</span><span class="cx">     class FakedMemcacheLock(MemcacheLock):
</span><span class="cx"> 
</span><del>-        def __init__(self, faked, namespace, locktoken, timeout=5.0, retry_interval=0.1, expire_time=0):
</del><ins>+        def __init__(
+            self, faked, namespace, locktoken,
+            timeout=5.0, retry_interval=0.1, expire_time=0
+        ):
</ins><span class="cx">             &quot;&quot;&quot;
</span><del>-
</del><span class="cx">             @param namespace: a unique namespace for this lock's tokens
</span><span class="cx">             @type namespace: C{str}
</span><ins>+
</ins><span class="cx">             @param locktoken: the name of the locktoken
</span><span class="cx">             @type locktoken: C{str}
</span><del>-            @param timeout: the maximum time in seconds that the lock should block
</del><ins>+
+            @param timeout: the maximum time in seconds that the lock should
+                block
</ins><span class="cx">             @type timeout: C{float}
</span><ins>+
</ins><span class="cx">             @param retry_interval: the interval to retry acquiring the lock
</span><span class="cx">             @type retry_interval: C{float}
</span><del>-            @param expiryTime: the time in seconds for the lock to expire. Zero: no expiration.
</del><ins>+
+            @param expiryTime: the time in seconds for the lock to expire.
+                Zero: no expiration.
</ins><span class="cx">             @type expiryTime: C{float}
</span><span class="cx">             &quot;&quot;&quot;
</span><span class="cx"> 
</span><del>-            super(MemCacheTestCase.FakedMemcacheLock, self).__init__(namespace, locktoken, timeout, retry_interval, expire_time)
</del><ins>+            super(MemCacheTestCase.FakedMemcacheLock, self).__init__(
+                namespace, locktoken, timeout, retry_interval, expire_time
+            )
</ins><span class="cx">             self.faked = faked
</span><span class="cx"> 
</span><span class="cx">         def _getMemcacheProtocol(self):
</span><span class="lines">@@ -90,11 +101,16 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;
+        )
</ins><span class="cx">         return self._test(
</span><span class="cx">             lock.get(&quot;foo&quot;),
</span><span class="cx">             &quot;get lock:foo-acbd18db4cc2f85cedef654fccc4a4d8\r\n&quot;,
</span><del>-            &quot;VALUE lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 3\r\nbar\r\nEND\r\n&quot;,
</del><ins>+            (
+                &quot;VALUE lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 3\r\n&quot;
+                &quot;bar\r\nEND\r\n&quot;
+            ),
</ins><span class="cx">             &quot;bar&quot;
</span><span class="cx">         )
</span><span class="cx"> 
</span><span class="lines">@@ -105,7 +121,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;
+        )
</ins><span class="cx">         return self._test(
</span><span class="cx">             lock.set(&quot;foo&quot;, &quot;bar&quot;),
</span><span class="cx">             &quot;set lock:foo-acbd18db4cc2f85cedef654fccc4a4d8 0 0 3\r\nbar\r\n&quot;,
</span><span class="lines">@@ -121,7 +139,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;
+        )
</ins><span class="cx">         yield self._test(
</span><span class="cx">             lock.acquire(),
</span><span class="cx">             &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</span><span class="lines">@@ -138,7 +158,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;, timeout=0)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;, timeout=0
+        )
</ins><span class="cx">         yield self._test(
</span><span class="cx">             lock.acquire(),
</span><span class="cx">             &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</span><span class="lines">@@ -155,11 +177,17 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;, timeout=0)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;, timeout=0
+        )
</ins><span class="cx">         try:
</span><span class="cx">             yield self._test(
</span><span class="cx">                 lock.acquire(),
</span><del>-                &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</del><ins>+                (
+                    &quot;add lock:&quot;
+                    &quot;locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n&quot;
+                    &quot;1\r\n&quot;
+                ),
</ins><span class="cx">                 &quot;NOT_STORED\r\n&quot;,
</span><span class="cx">                 True
</span><span class="cx">             )
</span><span class="lines">@@ -179,7 +207,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;
+        )
</ins><span class="cx">         yield self._test(
</span><span class="cx">             lock.acquire(),
</span><span class="cx">             &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</span><span class="lines">@@ -203,7 +233,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, &quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, &quot;locking&quot;
+        )
</ins><span class="cx">         yield self._test(
</span><span class="cx">             lock.acquire(),
</span><span class="cx">             &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</span><span class="lines">@@ -225,7 +257,9 @@
</span><span class="cx">         called back with the value and the flag associated with the given key
</span><span class="cx">         if the server returns a successful result.
</span><span class="cx">         &quot;&quot;&quot;
</span><del>-        lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, u&quot;locking&quot;)
</del><ins>+        lock = MemCacheTestCase.FakedMemcacheLock(
+            self.proto, &quot;lock&quot;, u&quot;locking&quot;
+        )
</ins><span class="cx">         yield self._test(
</span><span class="cx">             lock.acquire(),
</span><span class="cx">             &quot;add lock:locking-559159aa00cc525bfe5c4b34cf16cccb 0 0 1\r\n1\r\n&quot;,
</span><span class="lines">@@ -253,7 +287,9 @@
</span><span class="cx">             self.fail(&quot;AssertionError not raised&quot;)
</span><span class="cx"> 
</span><span class="cx">         try:
</span><del>-            lock = MemCacheTestCase.FakedMemcacheLock(self.proto, &quot;lock&quot;, (&quot;abc&quot;,))
</del><ins>+            lock = MemCacheTestCase.FakedMemcacheLock(
+                self.proto, &quot;lock&quot;, (&quot;abc&quot;,)
+            )
</ins><span class="cx">             yield lock.acquire()
</span><span class="cx">             self.fail(&quot;AssertionError not raised&quot;)
</span><span class="cx">         except AssertionError:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_memcachepropspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_memcacheprops.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> 
</span><span class="cx"> import os
</span><span class="cx"> 
</span><del>-from twext.web2.http import HTTPError
</del><ins>+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_mkcalendarpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_mkcalendar.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,11 +18,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.fileop import rmdir
</del><ins>+from txweb2.dav.fileop import rmdir
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_multigetpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_multiget.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,11 +14,11 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import davXMLFromStream, joinURL
-from twext.web2.http_headers import Headers, MimeType
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import davXMLFromStream, joinURL
+from txweb2.http_headers import Headers, MimeType
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_optionspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_options.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.iweb import IResponse
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.iweb import IResponse
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_propspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_props.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,10 +14,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode, http_headers
-from twext.web2.dav.util import davXMLFromStream
-from twext.web2.iweb import IResponse
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode, http_headers
+from txweb2.dav.util import davXMLFromStream
+from txweb2.iweb import IResponse
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,8 +15,8 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml.element import HRef, Principal, Unauthenticated
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.http import HTTPError
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_sharingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_sharing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,10 +14,10 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http_headers import MimeType
-from twext.web2.iweb import IResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.util import allDataFromStream
+from txweb2.http_headers import MimeType
+from txweb2.iweb import IResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.http_headers import Headers
</del><ins>+from txweb2.http_headers import Headers
</ins><span class="cx"> 
</span><span class="cx"> import twistedcaldav.test.util
</span><span class="cx"> from twistedcaldav.util import bestAcceptType
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtesttest_wrappingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/test_wrapping.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,41 +19,37 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-from twext.web2.responsecode import UNAUTHORIZED
-from twext.web2.http_headers import Headers
</del><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><ins>+from twext.enterprise.locking import NamedLock
+from txweb2 import responsecode
+from txweb2.http import HTTPError
+from txweb2.http_headers import Headers, MimeType
+from txweb2.responsecode import INSUFFICIENT_STORAGE_SPACE
+from txweb2.responsecode import UNAUTHORIZED
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><del>-from txdav.xml import element as davxml
-from twistedcaldav.config import config
-
</del><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><ins>+from twisted.internet.defer import maybeDeferred
</ins><span class="cx"> 
</span><ins>+from twistedcaldav.config import config
+from twistedcaldav.directory.test.test_xmlfile import XMLFileBase
</ins><span class="cx"> from twistedcaldav.ical import Component as VComponent
</span><del>-from twistedcaldav.vcard import Component as VCComponent
-
</del><span class="cx"> from twistedcaldav.storebridge import DropboxCollection, \
</span><span class="cx">     CalendarCollectionResource
</span><del>-
</del><span class="cx"> from twistedcaldav.test.util import StoreTestCase, SimpleStoreRequest
</span><ins>+from twistedcaldav.vcard import Component as VCComponent
</ins><span class="cx"> 
</span><del>-from txdav.idav import IDataStore
</del><ins>+from txdav.caldav.datastore.file import Calendar
</ins><span class="cx"> from txdav.caldav.datastore.test.test_file import test_event_text
</span><del>-
</del><ins>+from txdav.caldav.icalendarstore import ICalendarHome
</ins><span class="cx"> from txdav.carddav.datastore.test.test_file import vcard4_text
</span><del>-
</del><ins>+from txdav.carddav.iaddressbookstore import IAddressBookHome
</ins><span class="cx"> from txdav.common.datastore.test.util import assertProvides
</span><del>-
-
-from twext.web2.http import HTTPError
-from twext.web2.responsecode import INSUFFICIENT_STORAGE_SPACE
-from twext.web2.stream import MemoryStream
</del><span class="cx"> from txdav.common.datastore.test.util import deriveQuota
</span><del>-from twistedcaldav.directory.test.test_xmlfile import XMLFileBase
-from txdav.caldav.icalendarstore import ICalendarHome
-from txdav.carddav.iaddressbookstore import IAddressBookHome
</del><ins>+from txdav.idav import IDataStore
+from txdav.xml import element as davxml
</ins><span class="cx"> 
</span><del>-from twisted.internet.defer import maybeDeferred
-from txdav.caldav.datastore.file import Calendar
</del><ins>+import hashlib
</ins><span class="cx"> 
</span><span class="cx"> def _todo(f, why):
</span><span class="cx">     f.todo = why
</span><span class="lines">@@ -560,3 +556,90 @@
</span><span class="cx">         self.requestUnderTest = None
</span><span class="cx">         yield self.assertCalendarEmpty(wsanchez)
</span><span class="cx">         yield self.assertCalendarEmpty(cdaboo)
</span><ins>+
+
+
+class TimeoutTests(StoreTestCase):
+    &quot;&quot;&quot;
+    Tests for L{twistedcaldav.storebridge} lock timeouts.
+    &quot;&quot;&quot;
+
+    @inlineCallbacks
+    def test_timeoutOnPUT(self):
+        &quot;&quot;&quot;
+        PUT gets a 503 on a lock timeout.
+        &quot;&quot;&quot;
+
+        # Create a fake lock
+        txn = self.transactionUnderTest()
+        yield NamedLock.acquire(txn, &quot;ImplicitUIDLock:%s&quot; % (hashlib.md5(&quot;uid1&quot;).hexdigest(),))
+
+        # PUT fails
+        request = SimpleStoreRequest(
+            self,
+            &quot;PUT&quot;,
+            &quot;/calendars/users/wsanchez/calendar/1.ics&quot;,
+            headers=Headers({&quot;content-type&quot;: MimeType.fromString(&quot;text/calendar&quot;)}),
+            authid=&quot;wsanchez&quot;
+        )
+        request.stream = MemoryStream(&quot;&quot;&quot;BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:uid1
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
+SUMMARY:New Year's Day
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;))
+        response = yield self.send(request)
+        self.assertEqual(response.code, responsecode.SERVICE_UNAVAILABLE)
+
+
+    @inlineCallbacks
+    def test_timeoutOnDELETE(self):
+        &quot;&quot;&quot;
+        DELETE gets a 503 on a lock timeout.
+        &quot;&quot;&quot;
+
+        # PUT works
+        request = SimpleStoreRequest(
+            self,
+            &quot;PUT&quot;,
+            &quot;/calendars/users/wsanchez/calendar/1.ics&quot;,
+            headers=Headers({&quot;content-type&quot;: MimeType.fromString(&quot;text/calendar&quot;)}),
+            authid=&quot;wsanchez&quot;
+        )
+        request.stream = MemoryStream(&quot;&quot;&quot;BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
+VERSION:2.0
+BEGIN:VEVENT
+UID:uid1
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+DTSTAMP:20020101T121212Z
+ORGANIZER:mailto:wsanchez@example.com
+ATTENDEE:mailto:wsanchez@example.com
+SUMMARY:New Year's Day
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;))
+        response = yield self.send(request)
+        self.assertEqual(response.code, responsecode.CREATED)
+
+        # Create a fake lock
+        txn = self.transactionUnderTest()
+        yield NamedLock.acquire(txn, &quot;ImplicitUIDLock:%s&quot; % (hashlib.md5(&quot;uid1&quot;).hexdigest(),))
+
+        request = SimpleStoreRequest(
+            self,
+            &quot;DELETE&quot;,
+            &quot;/calendars/users/wsanchez/calendar/1.ics&quot;,
+            authid=&quot;wsanchez&quot;
+        )
+        response = yield self.send(request)
+        self.assertEqual(response.code, responsecode.SERVICE_UNAVAILABLE)
</ins></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,13 +26,13 @@
</span><span class="cx"> from twisted.internet.defer import succeed, fail, inlineCallbacks, returnValue
</span><span class="cx"> from twisted.internet.protocol import ProcessProtocol
</span><span class="cx"> 
</span><del>-from twext.python.memcacheclient import ClientFactory
</del><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><del>-import twext.web2.dav.test.util
</del><ins>+import txweb2.dav.test.util
</ins><span class="cx"> from txdav.xml import element as davxml, element
</span><del>-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import memcacher
</span><ins>+from twistedcaldav.memcacheclient import ClientFactory
</ins><span class="cx"> from twistedcaldav.bind import doBind
</span><span class="cx"> from twistedcaldav.directory import augment
</span><span class="cx"> from twistedcaldav.directory.addressbook import DirectoryAddressBookHomeProvisioningResource
</span><span class="lines">@@ -52,7 +52,7 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.caldav.datastore.test.util import buildCalendarStore
</span><span class="cx"> from calendarserver.tap.util import getRootResource, directoryFromConfig
</span><del>-from twext.web2.dav.test.util import SimpleRequest
</del><ins>+from txweb2.dav.test.util import SimpleRequest
</ins><span class="cx"> from twistedcaldav.directory.util import transactionFromRequest
</span><span class="cx"> from twistedcaldav.directory.directory import DirectoryService
</span><span class="cx"> 
</span><span class="lines">@@ -187,7 +187,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class StoreTestCase(CommonCommonTests, twext.web2.dav.test.util.TestCase):
</del><ins>+class StoreTestCase(CommonCommonTests, txweb2.dav.test.util.TestCase):
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     A base class for tests that use the SQL store.
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -268,7 +268,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-class TestCase(twext.web2.dav.test.util.TestCase):
</del><ins>+class TestCase(txweb2.dav.test.util.TestCase):
</ins><span class="cx">     resource_class = RootResource
</span><span class="cx"> 
</span><span class="cx">     def createDataStore(self):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezoneservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezoneservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,17 +22,17 @@
</span><span class="cx">     &quot;TimezoneServiceResource&quot;,
</span><span class="cx"> ]
</span><span class="cx"> 
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> 
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.method.propfind import http_PROPFIND
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import HTTPError
-from twext.web2.http import Response
-from twext.web2.http import XMLResponse
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.method.propfind import http_PROPFIND
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import HTTPError
+from txweb2.http import Response
+from txweb2.http import XMLResponse
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavtimezonestdservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/timezonestdservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,13 +26,13 @@
</span><span class="cx"> ]
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.method.propfind import http_PROPFIND
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.http import HTTPError, JSONResponse
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.method.propfind import http_PROPFIND
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.http import HTTPError, JSONResponse
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue, \
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavupgradepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/upgrade.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element
</span><del>-from twext.web2.dav.fileop import rmdir
</del><ins>+from txweb2.dav.fileop import rmdir
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.directory import calendaruserproxy
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,14 +35,20 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> try:
</span><del>-    from ctypes import *
-    import ctypes.util
</del><ins>+    from ctypes import (
+        cdll,
+        c_int, c_uint64, c_ulong,
+        c_char_p, c_void_p,
+        addressof, sizeof, c_size_t,
+        connect,
+    )
+    from ctypes.util import find_library
</ins><span class="cx">     hasCtypes = True
</span><span class="cx"> except ImportError:
</span><span class="cx">     hasCtypes = False
</span><span class="cx"> 
</span><span class="cx"> if sys.platform == &quot;darwin&quot; and hasCtypes:
</span><del>-    libc = cdll.LoadLibrary(ctypes.util.find_library(&quot;libc&quot;))
</del><ins>+    libc = cdll.LoadLibrary(find_library(&quot;libc&quot;))
</ins><span class="cx"> 
</span><span class="cx">     def getNCPU():
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -56,8 +62,8 @@
</span><span class="cx">         ]
</span><span class="cx">         libc.sysctlbyname(
</span><span class="cx">             &quot;hw.ncpu&quot;,
</span><del>-            c_voidp(addressof(ncpu)),
-            c_voidp(addressof(size)),
</del><ins>+            c_void_p(addressof(ncpu)),
+            c_void_p(addressof(size)),
</ins><span class="cx">             None,
</span><span class="cx">             0
</span><span class="cx">         )
</span><span class="lines">@@ -77,8 +83,8 @@
</span><span class="cx">         ]
</span><span class="cx">         libc.sysctlbyname(
</span><span class="cx">             &quot;hw.memsize&quot;,
</span><del>-            c_voidp(addressof(memsize)),
-            c_voidp(addressof(size)),
</del><ins>+            c_void_p(addressof(memsize)),
+            c_void_p(addressof(size)),
</ins><span class="cx">             None,
</span><span class="cx">             0
</span><span class="cx">         )
</span><span class="lines">@@ -87,7 +93,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> elif sys.platform == &quot;linux2&quot; and hasCtypes:
</span><del>-    libc = cdll.LoadLibrary(ctypes.util.find_library(&quot;libc&quot;))
</del><ins>+    libc = cdll.LoadLibrary(find_library(&quot;libc&quot;))
</ins><span class="cx"> 
</span><span class="cx">     def getNCPU():
</span><span class="cx">         return libc.get_nprocs()
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestwistedcaldavvcardpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/twistedcaldav/vcard.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,8 +28,8 @@
</span><span class="cx"> import codecs
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.stream import IStream
-from twext.web2.dav.util import allDataFromStream
</del><ins>+from txweb2.stream import IStream
+from txweb2.dav.util import allDataFromStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.config import config
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdav__init__py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/__init__.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,3 @@
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="cx"> WebDAV support for Twisted.
</span><span class="cx"> &quot;&quot;&quot;
</span><del>-
-# Make sure we have twext's required Twisted patches loaded before we do
-# anything at all.
-__import__(&quot;twext&quot;)
</del></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
</ins><span class="cx"> from txdav.idav import IDataStoreObject
</span><span class="cx"> from txdav.base.propertystore.base import PropertyName
</span><span class="cx"> from txdav.xml.element import GETContentType
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasedatastoresubpostgrespy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/datastore/subpostgres.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx">     def __init__(self, dataStoreDirectory, subServiceFactory,
</span><span class="cx">                  schema, resetSchema=False, databaseName='subpostgres',
</span><span class="cx">                  clusterName=&quot;cluster&quot;,
</span><del>-                 logFile=&quot;postgres.log&quot;, socketDir=&quot;/tmp&quot;,
</del><ins>+                 logFile=&quot;postgres.log&quot;, socketDir=&quot;&quot;,
</ins><span class="cx">                  listenAddresses=[], sharedBuffers=30,
</span><span class="cx">                  maxConnections=20, options=[],
</span><span class="cx">                  testMode=False,
</span><span class="lines">@@ -223,20 +223,15 @@
</span><span class="cx">             self.host, self.port = listenAddresses[0].split(&quot;:&quot;) if &quot;:&quot; in listenAddresses[0] else (listenAddresses[0], None,)
</span><span class="cx">             self.listenAddresses = [addr.split(&quot;:&quot;)[0] for addr in listenAddresses]
</span><span class="cx">         else:
</span><del>-            if socketDir:
-                # Unix socket length path limit
-                self.socketDir = CachingFilePath(&quot;%s/ccs_postgres_%s/&quot; %
-                    (socketDir, md5(dataStoreDirectory.path).hexdigest()))
-                if len(self.socketDir.path) &gt; 64:
-                    socketDir = &quot;/tmp&quot;
-                    self.socketDir = CachingFilePath(&quot;/tmp/ccs_postgres_%s/&quot; %
-                        (md5(dataStoreDirectory.path).hexdigest()))
-                self.host = self.socketDir.path
-                self.port = None
-            else:
-                self.socketDir = None
-                self.host = &quot;localhost&quot;
-                self.port = None
</del><ins>+            if not socketDir:
+                # Socket directory was not specified, so come up with one
+                # in /tmp and based on a hash of the data store directory
+                digest = md5(dataStoreDirectory.path).hexdigest()
+                socketDir = &quot;/tmp/ccs_postgres_&quot; + digest
+                
+            self.socketDir = CachingFilePath(socketDir)
+            self.host = self.socketDir.path
+            self.port = None
</ins><span class="cx">             self.listenAddresses = []
</span><span class="cx">         self.sharedBuffers = sharedBuffers if not testMode else 16
</span><span class="cx">         self.maxConnections = maxConnections if not testMode else 4
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorebasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/base.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.base import encodeXMLName
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5, \
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5, \
</ins><span class="cx">     TwistedQuotaRootProperty
</span><span class="cx"> 
</span><span class="cx"> from txdav.idav import IPropertyStore, IPropertyName
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavbasepropertystorexattrpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/base/propertystore/xattr.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx"> 
</span><span class="cx">     # Mimic old xattr-prefix behavior by importing it directly.
</span><span class="cx">     deadPropertyXattrPrefix = namedAny(
</span><del>-        &quot;twext.web2.dav.xattrprops.xattrPropertyStore.deadPropertyXattrPrefix&quot;
</del><ins>+        &quot;txweb2.dav.xattrprops.xattrPropertyStore.deadPropertyXattrPrefix&quot;
</ins><span class="cx">     )
</span><span class="cx"> 
</span><span class="cx">     # There is a 127 character limit for xattr keys so we need to
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -35,11 +35,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed, fail
</span><span class="cx"> 
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from txdav.xml import element as davxml
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
-from twext.web2.http_headers import generateContentType, MimeType
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
+from txweb2.http_headers import generateContentType, MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml, customxml, ical
</span><span class="cx"> from twistedcaldav.caldavxml import ScheduleCalendarTransp, Opaque, Transparent
</span><span class="lines">@@ -78,6 +78,8 @@
</span><span class="cx"> 
</span><span class="cx"> IGNORE_NAMES = ('dropbox', 'notification', 'freebusy')
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class CalendarHome(CommonHome):
</span><span class="cx">     implements(ICalendarHome)
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,12 +15,12 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger, LogLevel
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python.failure import Failure
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingcaldavschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/caldav/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,9 +15,9 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http import HTTPError, StatusResponse
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.http import HTTPError, StatusResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipdeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,9 +21,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.queue import inTransaction
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.http import HTTPError
</ins><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.failure import Failure
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimipschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> from twisted.internet.defer import succeed
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from txdav.caldav.datastore.scheduling.cuaddress import RemoteCalendarUser
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimiptesttest_deliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/imip/test/test_delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> from twisted.trial import unittest
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingimplicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/implicit.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,11 +15,11 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.http import ErrorResponse
</del><ins>+from txweb2.dav.http import ErrorResponse
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span><span class="cx"> from twistedcaldav.config import config
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledeliverypy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/delivery.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,15 +20,15 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.internet.gaiendpoint import GAIEndpoint
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.client.http import ClientRequest
-from twext.web2.client.http import HTTPClientProtocol
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.util import davXMLFromStream, joinURL, allDataFromStream
-from twext.web2.http import HTTPError
-from twext.web2.http_headers import Headers
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2 import responsecode
+from txweb2.client.http import ClientRequest
+from txweb2.client.http import HTTPClientProtocol
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.util import davXMLFromStream, joinURL, allDataFromStream
+from txweb2.http import HTTPError
+from txweb2.http_headers import Headers
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, DeferredList, returnValue
</span><span class="cx"> from twisted.internet.protocol import Factory
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduledkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/dkim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,11 +15,11 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.client.http import ClientRequest
-from twext.web2.dav.util import allDataFromStream, joinURL
-from twext.web2.http import Response
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.client.http import ClientRequest
+from txweb2.dav.util import allDataFromStream, joinURL
+from txweb2.http import Response
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twistedcaldav.client.geturl import getURL
</span><span class="lines">@@ -516,7 +516,7 @@
</span><span class="cx">     def __init__(self, headers, body, key_lookup=None, protocol_debug=False):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         @param headers: The HTTP request headers to process
</span><del>-        @type headers: L{twext.web2.http_headers.Headers}
</del><ins>+        @type headers: L{txweb2.http_headers.Headers}
</ins><span class="cx">         @param body: The HTTP request body to process
</span><span class="cx">         @type body: C{str}
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -17,12 +17,12 @@
</span><span class="cx"> from pycalendar.datetime import DateTime
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.dav.http import ErrorResponse
-from twext.web2.dav.noneprops import NonePropertyStore
-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http import Response, HTTPError, StatusResponse, XMLResponse
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.dav.http import ErrorResponse
+from txweb2.dav.noneprops import NonePropertyStore
+from txweb2.dav.util import allDataFromStream
+from txweb2.http import Response, HTTPError, StatusResponse, XMLResponse
+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, returnValue, inlineCallbacks
</span><span class="cx"> from twisted.python.failure import Failure
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduleschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,9 +15,9 @@
</span><span class="cx"> ##
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response
+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.abstract import isIPAddress
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_dkimpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_dkim.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -16,9 +16,9 @@
</span><span class="cx"> 
</span><span class="cx"> from Crypto.PublicKey import RSA
</span><span class="cx"> 
</span><del>-from twext.web2.dav.util import allDataFromStream
-from twext.web2.http_headers import Headers, MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.dav.util import allDataFromStream
+from txweb2.http_headers import Headers, MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, succeed
</span><span class="cx"> from twisted.names import client
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_localserverspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_localservers.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingischeduletesttest_resourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/ischedule/test/test_resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,8 +14,8 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2 import http_headers, responsecode
-from twext.web2.test.test_server import SimpleRequest
</del><ins>+from txweb2 import http_headers, responsecode
+from txweb2.test.test_server import SimpleRequest
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span><span class="lines">@@ -28,10 +28,10 @@
</span><span class="cx"> from txdav.common.datastore.test.util import populateCalendarsFrom, \
</span><span class="cx">     CommonCommonTests
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-import twext.web2.dav.test.util
</del><ins>+import txweb2.dav.test.util
</ins><span class="cx"> from txdav.caldav.datastore.test.util import buildCalendarStore
</span><span class="cx"> 
</span><del>-class iSchedulePOST (CommonCommonTests, twext.web2.dav.test.util.TestCase):
</del><ins>+class iSchedulePOST (CommonCommonTests, txweb2.dav.test.util.TestCase):
</ins><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><span class="cx">     def setUp(self):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingitippy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/itip.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -309,8 +309,8 @@
</span><span class="cx">             calendar_master.addProperty(Property(&quot;EXDATE&quot;, exdates))
</span><span class="cx"> 
</span><span class="cx">         # See if there are still components in the calendar - we might have deleted the last overridden instance
</span><del>-        # in which case the calendar object is empty (except for VTIMEZONEs).
-        if calendar.mainType() is None:
</del><ins>+        # in which case the calendar object is empty (except for VTIMEZONEs) or has only hidden components.
+        if calendar.mainType() is None or calendar.hasPropertyValueInAllComponents(Property(Component.HIDDEN_INSTANCE_PROPERTY, &quot;T&quot;)):
</ins><span class="cx">             # Delete the now empty calendar object
</span><span class="cx">             return True, True, None
</span><span class="cx">         else:
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingprocessingpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/processing.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,8 +19,8 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.dav.method.report import NumberOfMatchesWithinLimits
-from twext.web2.http import HTTPError
</del><ins>+from txweb2.dav.method.report import NumberOfMatchesWithinLimits
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingschedulerpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/scheduler.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -19,11 +19,11 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.locking import NamedLock
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError, Response
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError, Response
+from txweb2.http_headers import MimeType
</ins><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.http import messageForFailure, statusForFailure, \
</del><ins>+from txweb2.dav.http import messageForFailure, statusForFailure, \
</ins><span class="cx">     ErrorResponse
</span><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreschedulingtesttest_implicitpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/scheduling/test/test_implicit.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,8 +18,8 @@
</span><span class="cx"> from pycalendar.timezone import Timezone
</span><span class="cx"> 
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2 import responsecode
-from twext.web2.http import HTTPError
</del><ins>+from txweb2 import responsecode
+from txweb2.http import HTTPError
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -14,7 +14,6 @@
</span><span class="cx"> # See the License for the specific language governing permissions and
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><del>-from txdav.xml import element
</del><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><span class="lines">@@ -41,9 +40,9 @@
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.python.vcomponent import VComponent
-from twext.web2.http_headers import MimeType, generateContentType
-from twext.web2.stream import readStream
</del><ins>+from twistedcaldav.ical import Component as VComponent
+from txweb2.http_headers import MimeType, generateContentType
+from txweb2.stream import readStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, succeed
</span><span class="cx"> from twisted.python import hashlib
</span><span class="lines">@@ -73,7 +72,7 @@
</span><span class="cx">     AttendeeAllowedError, InvalidPerUserDataMerge, ComponentUpdateState, \
</span><span class="cx">     ValidOrganizerError, ShareeAllowedError, ComponentRemoveState, \
</span><span class="cx">     InvalidDefaultCalendar, \
</span><del>-    InvalidAttachmentOperation
</del><ins>+    InvalidAttachmentOperation, DuplicatePrivateCommentsError
</ins><span class="cx"> from txdav.caldav.icalendarstore import QuotaExceeded
</span><span class="cx"> from txdav.common.datastore.sql import CommonHome, CommonHomeChild, \
</span><span class="cx">     CommonObjectResource, ECALENDARTYPE
</span><span class="lines">@@ -89,6 +88,7 @@
</span><span class="cx">     ObjectResourceNameNotAllowedError, TooManyObjectResourcesError, \
</span><span class="cx">     InvalidUIDError, UIDExistsError, UIDExistsElsewhereError, \
</span><span class="cx">     InvalidResourceMove, InvalidComponentForStoreError
</span><ins>+from txdav.xml import element
</ins><span class="cx"> 
</span><span class="cx"> from txdav.idav import ChangeCategory
</span><span class="cx"> 
</span><span class="lines">@@ -109,6 +109,8 @@
</span><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span><ins>+
+
</ins><span class="cx"> class CalendarStoreFeatures(object):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Manages store-wide operations specific to calendars.
</span><span class="lines">@@ -580,6 +582,14 @@
</span><span class="cx">         returnValue(self._cachedCalendarResourcesForUID[uid])
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def removedCalendarResource(self, uid):
+        &quot;&quot;&quot;
+        Clean-up cache when resource is removed.
+        &quot;&quot;&quot;
+        if hasattr(self, &quot;_cachedCalendarResourcesForUID&quot;) and uid in self._cachedCalendarResourcesForUID:
+            del self._cachedCalendarResourcesForUID[uid]
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def calendarObjectWithDropboxID(self, dropboxID):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1069,6 +1079,12 @@
</span><span class="cx">         returnValue(objectResource)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def removedObjectResource(self, child):
+        yield super(Calendar, self).removedObjectResource(child)
+        self.viewerHome().removedCalendarResource(child.uid())
+
+
</ins><span class="cx">     def calendarObjectsInTimeRange(self, start, end, timeZone):
</span><span class="cx">         raise NotImplementedError()
</span><span class="cx"> 
</span><span class="lines">@@ -1790,7 +1806,14 @@
</span><span class="cx"> 
</span><span class="cx">             self.hasPrivateComment = new_has_private_comments
</span><span class="cx"> 
</span><ins>+            # Some clients appear to be buggy and are duplicating the &quot;X-CALENDARSERVER-ATTENDEE-COMMENT&quot; comment. We want
+            # to raise an error to prevent that so the client bugs can be tracked down.
</ins><span class="cx"> 
</span><ins>+            # Look for properties with duplicate &quot;X-CALENDARSERVER-ATTENDEE-REF&quot; values in the same component
+            if component.hasDuplicatePrivateComments(doFix=config.RemoveDuplicatePrivateComments):
+                raise DuplicatePrivateCommentsError(&quot;Duplicate X-CALENDARSERVER-ATTENDEE-COMMENT properties present.&quot;)
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def replaceMissingToDoProperties(self, calendar, inserting, internal_state):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="lines">@@ -1970,6 +1993,43 @@
</span><span class="cx">             self._componentChanged = True
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def addStructuredLocation(self, component):
+        &quot;&quot;&quot;
+        Scan the component for ROOM attendees; if any are associated with an
+        address record which has street address and geo coordinates, add an
+        X-APPLE-STRUCTURED-LOCATION property and update the LOCATION property
+        to contain the name and street address.
+        &quot;&quot;&quot;
+        for sub in component.subcomponents():
+            for attendee in sub.getAllAttendeeProperties():
+                if attendee.parameterValue(&quot;CUTYPE&quot;) == &quot;ROOM&quot;:
+                    value = attendee.value()
+                    if value.startswith(&quot;urn:uuid:&quot;):
+                        guid = value[9:]
+                        loc = self.directoryService().recordWithGUID(guid)
+                        if loc is not None:
+                            guid = loc.extras.get(&quot;associatedAddress&quot;,
+                                None)
+                            if guid is not None:
+                                addr = self.directoryService().recordWithGUID(guid)
+                                if addr is not None:
+                                    street = addr.extras.get(&quot;streetAddress&quot;, &quot;&quot;)
+                                    geo = addr.extras.get(&quot;geo&quot;, &quot;&quot;)
+                                    if street and geo:
+                                        title = attendee.parameterValue(&quot;CN&quot;)
+                                        params = {
+                                            &quot;X-ADDRESS&quot; : street,
+                                            &quot;X-APPLE-RADIUS&quot; : &quot;71&quot;,
+                                            &quot;X-TITLE&quot; : title,
+                                        }
+                                        structured = Property(&quot;X-APPLE-STRUCTURED-LOCATION&quot;,
+                                            &quot;geo:%s&quot; % (geo,), params=params,
+                                            valuetype=Value.VALUETYPE_URI)
+                                        sub.replaceProperty(structured)
+                                        sub.replaceProperty(Property(&quot;LOCATION&quot;,
+                                            &quot;%s\n%s&quot; % (title, street)))
+
+
</ins><span class="cx">     @inlineCallbacks
</span><span class="cx">     def doImplicitScheduling(self, component, inserting, internal_state, split_details=None):
</span><span class="cx"> 
</span><span class="lines">@@ -2182,6 +2242,9 @@
</span><span class="cx">             # Default/duplicate alarms
</span><span class="cx">             self.processAlarms(component, inserting)
</span><span class="cx"> 
</span><ins>+            # Process structured location
+            self.addStructuredLocation(component)
+
</ins><span class="cx">             # Do scheduling
</span><span class="cx">             implicit_result = (yield self.doImplicitScheduling(component, inserting, internal_state))
</span><span class="cx">             if isinstance(implicit_result, int):
</span><span class="lines">@@ -2242,7 +2305,7 @@
</span><span class="cx">         elif internal_state == ComponentUpdateState.ORGANIZER_ITIP_UPDATE:
</span><span class="cx">             category = ChangeCategory.organizerITIPUpdate
</span><span class="cx">         elif (internal_state == ComponentUpdateState.ATTENDEE_ITIP_UPDATE and
</span><del>-            hasattr(self._txn, &quot;doing_attende_refresh&quot;)):
</del><ins>+            hasattr(self._txn, &quot;doing_attendee_refresh&quot;)):
</ins><span class="cx">             category = ChangeCategory.attendeeITIPUpdate
</span><span class="cx"> 
</span><span class="cx">         yield self._calendar.notifyChanged(category=category)
</span><span class="lines">@@ -2681,6 +2744,19 @@
</span><span class="cx">             yield scheduler.doImplicitScheduling()
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def removeNotifyCategory(self):
+        &quot;&quot;&quot;
+        Indicates what category to use when determining the priority of push
+        notifications when this object is removed.
+
+        @returns: The &quot;inbox&quot; category if this object is in the inbox, otherwise
+            the &quot;default&quot; category
+        @rtype: L{ChangeCategory}
+        &quot;&quot;&quot;
+        return (ChangeCategory.inbox if self._calendar.isInbox() else
+                ChangeCategory.default)
+
+
</ins><span class="cx">     @classproperty
</span><span class="cx">     def _recurrenceMinMaxByIDQuery(cls): #@NoSelf
</span><span class="cx">         &quot;&quot;&quot;
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx"> from twisted.python import hashlib
</span><span class="cx"> 
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_attachmentspy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_attachments.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,8 +21,8 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python.filepath import FilePath
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_filepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> 
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> 
</span><span class="cx"> from txdav.common.icommondatastore import HomeChildNameNotAllowedError
</span><span class="cx"> from txdav.common.icommondatastore import ObjectResourceNameNotAllowedError
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_sqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">     LocalCalendarUser
</span><span class="cx"> from txdav.caldav.datastore.scheduling.caldav.scheduler import CalDAVScheduler
</span><span class="cx"> from txdav.caldav.datastore.scheduling.scheduler import ScheduleResponseQueue
</span><del>-from twext.web2 import responsecode
</del><ins>+from txweb2 import responsecode
</ins><span class="cx"> from txdav.caldav.datastore.scheduling.itip import iTIPRequestStatus
</span><span class="cx"> from twistedcaldav.instance import InvalidOverriddenInstanceError
</span><span class="cx"> 
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.enterprise.dal.syntax import Select, Parameter, Insert, Delete, \
</span><span class="cx">     Update
</span><del>-from twext.python.vcomponent import VComponent
-from twext.web2.http_headers import MimeType
-from twext.web2.stream import MemoryStream
</del><ins>+from twistedcaldav.ical import Component as VComponent
+from txweb2.http_headers import MimeType
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet import reactor
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, DeferredList, \
</span><span class="lines">@@ -64,6 +64,7 @@
</span><span class="cx">     CommonCommonTests
</span><span class="cx"> from txdav.common.icommondatastore import NoSuchObjectResourceError
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentLanguage, ResourceType
</span><ins>+from txdav.idav import ChangeCategory
</ins><span class="cx"> 
</span><span class="cx"> import datetime
</span><span class="cx"> 
</span><span class="lines">@@ -915,6 +916,32 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @inlineCallbacks
</span><ins>+    def test_removeNotifyCategoryInbox(self):
+        &quot;&quot;&quot;
+        Inbox object removal should be categorized as ChangeCategory.inbox
+        &quot;&quot;&quot;
+        home = yield self.homeUnderTest()
+        inbox = yield home.createCalendarWithName(&quot;inbox&quot;)
+        component = VComponent.fromString(test_event_text)
+        inboxItem = yield inbox.createCalendarObjectWithName(&quot;inbox.ics&quot;, component)
+        self.assertEquals(ChangeCategory.inbox, inboxItem.removeNotifyCategory())
+        yield self.commit()
+
+
+    @inlineCallbacks
+    def test_removeNotifyCategoryNonInbox(self):
+        &quot;&quot;&quot;
+        Non-Inbox object removal should be categorized as ChangeCategory.default
+        &quot;&quot;&quot;
+        home = yield self.homeUnderTest()
+        nonInbox = yield home.createCalendarWithName(&quot;noninbox&quot;)
+        component = VComponent.fromString(test_event_text)
+        nonInboxItem = yield nonInbox.createCalendarObjectWithName(&quot;inbox.ics&quot;, component)
+        self.assertEquals(ChangeCategory.default, nonInboxItem.removeNotifyCategory())
+        yield self.commit()
+
+
+    @inlineCallbacks
</ins><span class="cx">     def test_directShareCreateConcurrency(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Test that two concurrent attempts to create a direct shared calendar
</span><span class="lines">@@ -2050,7 +2077,82 @@
</span><span class="cx">         self.assertEqual(len(self.flushLoggedErrors(InvalidOverriddenInstanceError)), 1)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    @inlineCallbacks
+    def test_setComponent_structuredLocation(self):
+        &quot;&quot;&quot;
+        Verify ROOM attendees who have street address and geo information
+        within the directory will get X-APPLE-STRUCTURED-LOCATION properties
+        added, as well as updated LOCATION properties.
+        &quot;&quot;&quot;
</ins><span class="cx"> 
</span><ins>+        data = &quot;&quot;&quot;BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Apple Inc.//Mac OS X 10.9.1//EN
+BEGIN:VEVENT
+UID:561F5DBB-3F38-4B3A-986F-DD05CBAF554F
+DTSTART;TZID=America/Los_Angeles:20131211T164500
+DTEND;TZID=America/Los_Angeles:20131211T174500
+ATTENDEE;CN=Conference Room One;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
+ T;SCHEDULE-STATUS=2.0:urn:uuid:room1
+ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
+ CEPTED:urn:uuid:user01
+CREATED:20131211T221854Z
+DTSTAMP:20131211T230632Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+RRULE:FREQ=DAILY;COUNT=5
+SEQUENCE:8
+SUMMARY:locations
+TRANSP:OPAQUE
+END:VEVENT
+BEGIN:VEVENT
+UID:561F5DBB-3F38-4B3A-986F-DD05CBAF554F
+RECURRENCE-ID;TZID=America/Los_Angeles:20131214T164500
+DTSTART;TZID=America/Los_Angeles:20131214T160000
+DTEND;TZID=America/Los_Angeles:20131214T170000
+ATTENDEE;CN=Conference Room Two;CUTYPE=ROOM;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPAN
+ T;SCHEDULE-STATUS=2.0:urn:uuid:room2
+ATTENDEE;CN=User 01;CUTYPE=INDIVIDUAL;EMAIL=user01@example.com;PARTSTAT=AC
+ CEPTED:urn:uuid:user01
+CREATED:20131211T221854Z
+DTSTAMP:20131211T230632Z
+ORGANIZER;CN=User 01;EMAIL=user01@example.com:urn:uuid:user01
+SEQUENCE:8
+SUMMARY:locations
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+&quot;&quot;&quot;.replace(&quot;\n&quot;, &quot;\r\n&quot;)
+
+        calendar = yield self.calendarUnderTest(name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        yield calendar.createCalendarObjectWithName(&quot;structured.ics&quot;,
+            Component.fromString(data))
+        cobj = yield self.calendarObjectUnderTest(name=&quot;structured.ics&quot;,
+            calendar_name=&quot;calendar&quot;, home=&quot;user01&quot;)
+        comp = yield cobj.component()
+        components = list(comp.subcomponents())
+
+        # Check first component
+        locProp = components[0].getProperty(&quot;LOCATION&quot;)
+        self.assertEquals(locProp.value(),
+            &quot;Conference Room One\n1 Infinite Loop, Cupertino, CA 95014&quot;)
+        structProp = components[0].getProperty(&quot;X-APPLE-STRUCTURED-LOCATION&quot;)
+        self.assertEquals(structProp.value(),
+            &quot;geo:37.331741,-122.030333&quot;)
+
+        # Check second component
+        locProp = components[1].getProperty(&quot;LOCATION&quot;)
+        self.assertEquals(locProp.value(),
+            &quot;Conference Room Two\n2 Infinite Loop, Cupertino, CA 95014&quot;)
+        structProp = components[1].getProperty(&quot;X-APPLE-STRUCTURED-LOCATION&quot;)
+        self.assertEquals(structProp.value(),
+            &quot;geo:37.332633,-122.030502&quot;)
+
+        yield self.commit()
+
+
+
+
</ins><span class="cx"> class CalendarObjectSplitting(CommonCommonTests, unittest.TestCase):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     CalendarObject splitting tests
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretesttest_utilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/test_util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -22,7 +22,7 @@
</span><span class="cx"> import textwrap
</span><span class="cx"> 
</span><span class="cx"> from twisted.trial.unittest import TestCase as BaseTestCase
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -62,9 +62,11 @@
</span><span class="cx">         calendarUserAddresses,
</span><span class="cx">         cutype=&quot;INDIVIDUAL&quot;,
</span><span class="cx">         thisServer=True,
</span><ins>+        extras={},
</ins><span class="cx">     ):
</span><span class="cx"> 
</span><del>-        super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames, fullName)
</del><ins>+        super(TestCalendarStoreDirectoryRecord, self).__init__(uid, shortNames,
+            fullName, extras=extras)
</ins><span class="cx">         self.uid = uid
</span><span class="cx">         self.shortNames = shortNames
</span><span class="cx">         self.fullName = fullName
</span><span class="lines">@@ -158,6 +160,36 @@
</span><span class="cx">     for uid in homes:
</span><span class="cx">         directory.addRecord(buildDirectoryRecord(uid))
</span><span class="cx"> 
</span><ins>+    # Structured Locations
+    directory.addRecord(TestCalendarStoreDirectoryRecord(
+        &quot;il1&quot;, (&quot;il1&quot;,), &quot;1 Infinite Loop&quot;, [],
+        extras={
+            &quot;geo&quot; : &quot;37.331741,-122.030333&quot;,
+            &quot;streetAddress&quot; : &quot;1 Infinite Loop, Cupertino, CA 95014&quot;,
+        }
+    ))
+    directory.addRecord(TestCalendarStoreDirectoryRecord(
+        &quot;il2&quot;, (&quot;il2&quot;,), &quot;2 Infinite Loop&quot;, [],
+        extras={
+            &quot;geo&quot; : &quot;37.332633,-122.030502&quot;,
+            &quot;streetAddress&quot; : &quot;2 Infinite Loop, Cupertino, CA 95014&quot;,
+        }
+    ))
+    directory.addRecord(TestCalendarStoreDirectoryRecord(
+        &quot;room1&quot;, (&quot;room1&quot;,), &quot;Conference Room One&quot;,
+        frozenset((&quot;urn:uuid:room1&quot;,)),
+        extras={
+            &quot;associatedAddress&quot; : &quot;il1&quot;,
+        }
+    ))
+    directory.addRecord(TestCalendarStoreDirectoryRecord(
+        &quot;room2&quot;, (&quot;room2&quot;,), &quot;Conference Room Two&quot;,
+        frozenset((&quot;urn:uuid:room2&quot;,)),
+        extras={
+            &quot;associatedAddress&quot; : &quot;il2&quot;,
+        }
+    ))
+
</ins><span class="cx">     return directory
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavdatastoreutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/datastore/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,10 +32,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> 
</span><del>-from twext.web2 import http_headers
</del><ins>+from txweb2 import http_headers
</ins><span class="cx"> 
</span><del>-from twext.python.vcomponent import InvalidICalendarDataError
-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import InvalidICalendarDataError
+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import ical
</span><span class="cx"> from twistedcaldav.datafilters.hiddeninstance import HiddenInstanceFilter
</span><span class="lines">@@ -283,7 +283,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-# MIME helpers - mostly copied from twext.web2.static
</del><ins>+# MIME helpers - mostly copied from txweb2.static
</ins><span class="cx"> 
</span><span class="cx"> def loadMimeTypes(mimetype_locations=['/etc/mime.types']):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="lines">@@ -507,7 +507,7 @@
</span><span class="cx">     def __init__(self, attachment, contentType, dispositionName):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Create a storage transport with a reference to an L{IAttachment} and a
</span><del>-        L{twext.web2.http_headers.MimeType}.
</del><ins>+        L{txweb2.http_headers.MimeType}.
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         from twisted.internet import reactor
</span><span class="cx">         self._clock = reactor
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavicalendarstorepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/icalendarstore.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -658,7 +658,7 @@
</span><span class="cx"> 
</span><span class="cx">         @param contentType: The content type of the data which will be stored.
</span><span class="cx"> 
</span><del>-        @type contentType: L{twext.web2.http_headers.MimeType}
</del><ins>+        @type contentType: L{txweb2.http_headers.MimeType}
</ins><span class="cx"> 
</span><span class="cx">         @return: A transport which stores the contents written to it.
</span><span class="cx"> 
</span><span class="lines">@@ -740,6 +740,13 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+class DuplicatePrivateCommentsError(CommonStoreError):
+    &quot;&quot;&quot;
+    Calendar data cannot contain duplicate private comment properties.
+    &quot;&quot;&quot;
+
+
+
</ins><span class="cx"> class InvalidPerUserDataMerge(CommonStoreError):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Per-user data merge failed.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcaldavresourcepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/caldav/resource.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml.base import dav_namespace
</span><del>-from twext.web2.http_headers import MimeType
-from twext.web2.http import RedirectResponse, Response
-from twext.web2.stream import MemoryStream
</del><ins>+from txweb2.http_headers import MimeType
+from txweb2.http import RedirectResponse, Response
+from txweb2.stream import MemoryStream
</ins><span class="cx"> 
</span><span class="cx"> from twistedcaldav import caldavxml
</span><span class="cx"> from twistedcaldav.caldavxml import caldav_namespace
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -30,8 +30,8 @@
</span><span class="cx"> from errno import ENOENT
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.python import hashlib
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx">     Update, Union, Max, Select, utcNowSQL
</span><span class="cx"> from twext.enterprise.locking import NamedLock
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.http_headers import MimeType
-from twext.web2.responsecode import FORBIDDEN
</del><ins>+from txweb2.http import HTTPError
+from txweb2.http_headers import MimeType
+from txweb2.responsecode import FORBIDDEN
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue
</span><span class="cx"> from twisted.python import hashlib
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcarddavdatastoretestcommonpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/test/common.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -20,8 +20,8 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.filepath import CachingFilePath as FilePath
</span><span class="cx"> 
</span><del>-from twext.web2.http import HTTPError
-from twext.web2.responsecode import FORBIDDEN
</del><ins>+from txweb2.http import HTTPError
+from txweb2.responsecode import FORBIDDEN
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred
</span><span class="cx"> from twisted.python import hashlib
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastorefilepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/file.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -24,8 +24,8 @@
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from txdav.xml.rfc2518 import GETContentType, HRef
</span><span class="cx"> from txdav.xml.rfc5842 import ResourceID
</span><del>-from twext.web2.http_headers import generateContentType, MimeType
-from twext.web2.dav.resource import TwistedGETContentMD5, \
</del><ins>+from txweb2.http_headers import generateContentType, MimeType
+from txweb2.dav.resource import TwistedGETContentMD5, \
</ins><span class="cx">     TwistedQuotaUsedProperty
</span><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import succeed, inlineCallbacks, returnValue
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoresqlpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/sql.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx"> from twext.internet.decorate import memoizedKey, Memoizable
</span><span class="cx"> from twext.python.clsprop import classproperty
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.internet import reactor
</span><span class="lines">@@ -4288,7 +4288,7 @@
</span><span class="cx">         if self._objectNames and child.name() in self._objectNames:
</span><span class="cx">             self._objectNames.remove(child.name())
</span><span class="cx">         yield self._deleteRevision(child.name())
</span><del>-        yield self.notifyChanged()
</del><ins>+        yield self.notifyChanged(category=child.removeNotifyCategory())
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     @classproperty
</span><span class="lines">@@ -5095,6 +5095,18 @@
</span><span class="cx">         self._notificationData = None
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+    def removeNotifyCategory(self):
+        &quot;&quot;&quot;
+        Indicates what category to use when determining the priority of push
+        notifications when this object is removed.
+
+        @returns: The &quot;default&quot; category (but should be overridden to return
+            values such as &quot;inbox&quot;)
+        @rtype: L{ChangeCategory}
+        &quot;&quot;&quot;
+        return ChangeCategory.default
+
+
</ins><span class="cx">     def uid(self):
</span><span class="cx">         return self._uid
</span><span class="cx"> 
</span><span class="lines">@@ -5616,6 +5628,8 @@
</span><span class="cx">                 child._notificationType = json.loads(child._notificationType)
</span><span class="cx">             except ValueError:
</span><span class="cx">                 pass
</span><ins>+            if isinstance(child._notificationType, unicode):
+                child._notificationType = child._notificationType.encode(&quot;utf-8&quot;)
</ins><span class="cx">             child._loadPropertyStore(
</span><span class="cx">                 props=propertyStores.get(child._resourceID, None)
</span><span class="cx">             )
</span><span class="lines">@@ -5664,6 +5678,8 @@
</span><span class="cx">                 self._notificationType = json.loads(self._notificationType)
</span><span class="cx">             except ValueError:
</span><span class="cx">                 pass
</span><ins>+            if isinstance(self._notificationType, unicode):
+                self._notificationType = self._notificationType.encode(&quot;utf-8&quot;)
</ins><span class="cx">             self._loadPropertyStore()
</span><span class="cx">             returnValue(self)
</span><span class="cx">         else:
</span><span class="lines">@@ -5777,6 +5793,8 @@
</span><span class="cx">                 self._notificationData = json.loads(self._notificationData)
</span><span class="cx">             except ValueError:
</span><span class="cx">                 pass
</span><ins>+            if isinstance(self._notificationData, unicode):
+                self._notificationData = self._notificationData.encode(&quot;utf-8&quot;)
</ins><span class="cx">         returnValue(self._notificationData)
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoretestutilpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/test/util.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -38,10 +38,10 @@
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><del>-from twext.python.vcomponent import VComponent
</del><ins>+from twistedcaldav.ical import Component as VComponent
</ins><span class="cx"> from twext.enterprise.adbapi2 import ConnectionPool
</span><span class="cx"> from twext.enterprise.ienterprise import AlreadyFinishedError
</span><del>-from twext.web2.dav.resource import TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedGETContentMD5
</ins><span class="cx"> 
</span><span class="cx"> from twisted.application.service import Service
</span><span class="cx"> from twisted.internet import reactor
</span><span class="lines">@@ -112,6 +112,11 @@
</span><span class="cx">     def recordWithUID(self, uid):
</span><span class="cx">         return self.records.get(uid)
</span><span class="cx"> 
</span><ins>+    def recordWithGUID(self, guid):
+        for record in self.records.itervalues():
+            if record.guid == guid:
+                return record
+        return None
</ins><span class="cx"> 
</span><span class="cx">     def addRecord(self, record):
</span><span class="cx">         self.records[record.uid] = record
</span><span class="lines">@@ -122,11 +127,13 @@
</span><span class="cx"> 
</span><span class="cx">     implements(IStoreDirectoryRecord)
</span><span class="cx"> 
</span><del>-    def __init__(self, uid, shortNames, fullName):
</del><ins>+    def __init__(self, uid, shortNames, fullName, extras={}):
</ins><span class="cx">         self.uid = uid
</span><ins>+        self.guid = uid
</ins><span class="cx">         self.shortNames = shortNames
</span><span class="cx">         self.fullName = fullName
</span><span class="cx">         self.displayName = self.fullName if self.fullName else self.shortNames[0]
</span><ins>+        self.extras = extras
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradesqlupgradescalendar_upgrade_from_4_to_5py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/sql/upgrades/calendar_upgrade_from_4_to_5.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -15,7 +15,7 @@
</span><span class="cx"> # limitations under the License.
</span><span class="cx"> ##
</span><span class="cx"> 
</span><del>-from twext.web2.dav.resource import TwistedQuotaUsedProperty, TwistedGETContentMD5
</del><ins>+from txweb2.dav.resource import TwistedQuotaUsedProperty, TwistedGETContentMD5
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommondatastoreupgradetesttest_migratepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/datastore/upgrade/test/test_migrate.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> from twext.enterprise.adbapi2 import Pickle
</span><span class="cx"> from twext.enterprise.dal.syntax import Delete
</span><span class="cx"> from twext.python.filepath import CachingFilePath
</span><del>-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from twisted.internet.defer import inlineCallbacks, Deferred, returnValue
</span><span class="cx"> from twisted.internet.protocol import Protocol
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavcommonidirectoryservicepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/common/idirectoryservice.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -39,8 +39,15 @@
</span><span class="cx">         @rtype: L{IStoreDirectoryRecord}
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx"> 
</span><ins>+    def recordWithGUID(guid): #@NoSelf
+        &quot;&quot;&quot;
+        Return the record for the specified store guid.
</ins><span class="cx"> 
</span><ins>+        @return: the record.
+        @rtype: L{IStoreDirectoryRecord}
+        &quot;&quot;&quot;
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> class IStoreDirectoryRecord(Interface):
</span><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     Directory record object
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavidavpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/idav.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -87,7 +87,7 @@
</span><span class="cx">     using C{abort()}.
</span><span class="cx"> 
</span><span class="cx">     Also, keys must be L{IPropertyName} providers and values must be
</span><del>-    L{twext.web2.element.dav.base.WeDAVElement}s.
</del><ins>+    L{txweb2.element.dav.base.WeDAVElement}s.
</ins><span class="cx">     &quot;&quot;&quot;
</span><span class="cx">     # FIXME: the type for values isn't quite right, there should be some more
</span><span class="cx">     # specific interface for that.
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmlbasepy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/base.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -51,7 +51,7 @@
</span><span class="cx"> import re
</span><span class="cx"> 
</span><span class="cx"> from twext.python.log import Logger
</span><del>-from twext.web2.http_headers import parseDateTime
</del><ins>+from txweb2.http_headers import parseDateTime
</ins><span class="cx"> 
</span><span class="cx"> log = Logger()
</span><span class="cx"> 
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmlrfc2518py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/rfc2518.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -33,8 +33,8 @@
</span><span class="cx"> __all__ = []
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-from twext.web2 import responsecode
-from twext.web2.http_headers import MimeType
</del><ins>+from txweb2 import responsecode
+from txweb2.http_headers import MimeType
</ins><span class="cx"> 
</span><span class="cx"> from txdav.xml.base import WebDAVElement, WebDAVTextElement, PCDATAElement
</span><span class="cx"> from txdav.xml.base import WebDAVEmptyElement, WebDAVOneShotElement
</span><span class="lines">@@ -366,7 +366,7 @@
</span><span class="cx">     def fromResponseCode(clazz, code):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         code must be an integer response code in
</span><del>-        twext.web2.responsecode.RESPONSES.keys()
</del><ins>+        txweb2.responsecode.RESPONSES.keys()
</ins><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         if code not in responsecode.RESPONSES:
</span><span class="cx">             raise ValueError(&quot;Invalid response code: %r&quot; % (code,))
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxdavxmltesttest_xml_rfc3744py"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py (12141 => 12142)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py        2013-12-19 03:09:42 UTC (rev 12141)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/xml/test/test_xml_rfc3744.py        2013-12-19 04:51:29 UTC (rev 12142)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx"> from twisted.trial import unittest
</span><span class="cx"> 
</span><span class="cx"> from txdav.xml import element as davxml
</span><del>-from twext.web2.dav.resource import davPrivilegeSet
</del><ins>+from txweb2.dav.resource import davPrivilegeSet
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> class XML_3744(unittest.TestCase):
</span></span></pre></div>
<a id="CalendarServerbranchesusersgayasharedgroupfixestxweb2"></a>
<div class="propset"><h4>Property changes: CalendarServer/branches/users/gaya/sharedgroupfixes/txweb2</h4>
<pre class="diff"><span>
</span></pre></div>
<a id="svnignore"></a>
<div class="addfile"><h4>Added: svn:ignore</h4></div>
</div>

</body>
</html>