[CalendarServer-changes] [11797]

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 8 16:02:09 PDT 2013


Revision: 11797
          http://trac.calendarserver.org//changeset/11797
Author:   gaya at apple.com
Date:     2013-10-08 16:02:09 -0700 (Tue, 08 Oct 2013)
Log Message:
-----------
sync report for shared groups cleaning - all tests now pass

Modified Paths:
--------------
    CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py

Removed Paths:
-------------
    CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync-groups.xml

Deleted: CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync-groups.xml
===================================================================
--- CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync-groups.xml	2013-10-08 00:31:49 UTC (rev 11796)
+++ CalDAVTester/branches/users/gaya/sharedgroupfixestester/scripts/tests/CardDAV/sharing-sync-groups.xml	2013-10-08 23:02:09 UTC (rev 11797)
@@ -1,1461 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-
-<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
-
-<!--
- Copyright (c) 2006-2013 Apple Inc. All rights reserved.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<caldavtest>
-	<description>Test address book/group sharing and cached home sync tokens</description>
-
-	<require-feature>
-		<feature>carddav</feature>
-		<feature>shared-addressbooks</feature>
-		<feature>sync-report</feature>
-	</require-feature>
-
-	<start>
-		<request user="$useradmin:" pswd="$pswdadmin:">
-			<method>DELETEALL</method>
-			<ruri>$addressbookhome1:/</ruri>
-			<ruri>$addressbookhome2:/</ruri>
-			<ruri>$notificationpath1:/</ruri>
-			<ruri>$notificationpath2:/</ruri>
-		</request>
-	</start>
-	
-
-	<!-- test suite below is similar to test suite in ../CalDAV/sharing-sync.xml -->
-	<test-suite name='two shared groups' ignore='no'>
-		<test name='0' ignore='no'>
-			<description>clean up old data</description>
-			<request user="$useradmin:" pswd="$pswdadmin:">
-				<method>DELETEALL</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<ruri>$addressbookhome2:/</ruri>
-				<ruri>$notificationpath1:/</ruri>
-				<ruri>$notificationpath2:/</ruri>
-			</request>
-			<description>create users groups</description>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/1.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/1.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/2.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/2.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/4.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/4.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/5.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/5.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/6.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/6.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/7.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/7.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='1a' ignore='no'>
-			<description>Initial sync tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='1b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='1c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='1d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='1e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='2' ignore='no'>
-			<description>user1 POSTs invitation</description>
-			<request print-response="no">
-				<method>POST</method>
-				<ruri>$addressbookpath1:/6.vcf</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/11.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='3'>
-			<description>Check user2 notification collection and get invite uid</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>WAITCOUNT 1</method>
-				<ruri>$notificationpath2:/</ruri>
-			</request>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>GETNEW</method>
-				<ruri>$notificationpath2:/</ruri>
-				<grabelement>
-					<name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
-					<variable>$inviteuid:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='4'>
-			<description>user2 replies ACCEPTED and deletes notification</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>POST</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions="yes">
-					<content-type>application/xml; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/12.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>DELETE</method>
-				<ruri>$notificationpath2:/$inviteuid:</ruri>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='5a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='5b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='5c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='5d-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='5d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='5e-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='5e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/1.vcf</value>
-						<value>$userguid1:/2.vcf</value>
-						<value>$userguid1:/6.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='5f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>1.vcf</value>
-						<value>2.vcf</value>
-						<value>6.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='6' ignore='no'>
-			<description>user1 POSTs invitation</description>
-			<request print-response="no">
-				<method>POST</method>
-				<ruri>$addressbookpath1:/7.vcf</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/14.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='7'>
-			<description>Check user2 notification collection and get invite uid</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>WAITCOUNT 1</method>
-				<ruri>$notificationpath2:/</ruri>
-			</request>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>GETNEW</method>
-				<ruri>$notificationpath2:/</ruri>
-				<grabelement>
-					<name>{http://calendarserver.org/ns/}invite-notification/{http://calendarserver.org/ns/}uid</name>
-					<variable>$inviteuid:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='8'>
-			<description>user2 replies ACCEPTED and deletes notification</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>POST</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions="yes">
-					<content-type>application/xml; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/15.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>DELETE</method>
-				<ruri>$notificationpath2:/$inviteuid:</ruri>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='9a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='9b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='9c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='9d-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='9d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='9e-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='9e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/1.vcf</value>
-						<value>$userguid1:/2.vcf</value>
-						<value>$userguid1:/4.vcf</value>
-						<value>$userguid1:/5.vcf</value>
-						<value>$userguid1:/6.vcf</value>
-						<value>$userguid1:/7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='9f-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='9f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>1.vcf</value>
-						<value>2.vcf</value>
-						<value>4.vcf</value>
-						<value>5.vcf</value>
-						<value>6.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-
-		<test name='10'>
-			<description>Sharee creates vcard</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>PUT</method>
-				<ruri>$addressbookhome2:/$userguid1:/3.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/3.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='11a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='11b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$addressbook:/3.vcf</value>
-						<value>$addressbook:/6.vcf</value>
-						<value>$addressbook:/7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='11c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>3.vcf</value>
-						<value>6.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='11d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='11e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/3.vcf</value>
-						<value>$userguid1:/6.vcf</value>
-						<value>$userguid1:/7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='11f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>3.vcf</value>
-						<value>6.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='12'>
-			<description>Sharer changes vcard</description>
-			<request print-response='no'>
-				<method>PUT</method>
-				<ruri>$addressbookpath1:/3.vcf</ruri>
-				<data>
-					<content-type>text/vcard; charset=utf-8</content-type>
-					<filepath>Resource/CardDAV/sharing/sync/group-two/3.vcf</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='13a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$addressbook:/3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='13'>
-			<description>Sharee deletes vcard</description>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>DELETE</method>
-				<ruri>$addressbookhome2:/$userguid1:/3.vcf</ruri>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='14a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='14b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$addressbook:/6.vcf</value>
-						<value>$addressbook:/7.vcf</value>
-					</arg>
-					<arg>
-						<name>badhrefs</name>
-						<value>$addressbook:/3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='14c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>6.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-					<arg>
-						<name>badhrefs</name>
-						<value>3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='14d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='14e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/6.vcf</value>
-						<value>$userguid1:/7.vcf</value>
-					</arg>
-					<arg>
-						<name>badhrefs</name>
-						<value>$userguid1:/3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='14f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>6.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-					<arg>
-						<name>badhrefs</name>
-						<value>3.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='15'>
-			<description>Sharer unshares first group</description>
-			<request print-response='no'>
-				<method>POST</method>
-				<ruri>$addressbookpath1:/6.vcf</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/POST/sharingremove2.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='16a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='16b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='16c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='16d-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='16d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='16e-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='16e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-						<value>$userguid1:/</value>
-						<value>$userguid1:/4.vcf</value>
-						<value>$userguid1:/5.vcf</value>
-						<value>$userguid1:/7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='16f-' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>403</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-		<test name='16f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-init-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>4.vcf</value>
-						<value>5.vcf</value>
-						<value>7.vcf</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken6:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='17'>
-			<description>Sharer unshares 2nd group</description>
-			<request print-response='no'>
-				<method>POST</method>
-				<ruri>$addressbookpath1:/7.vcf</ruri>
-				<data>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/POST/sharingremove2.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-				</verify>
-			</request>
-		</test>
-		<test name='18a' ignore='no'>
-			<description>Updated tokens</description>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token1-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken1:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='18b' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token2-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>okhrefs</name>
-						<value>$addressbook:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken2:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='18c' ignore='no'>
-			<request print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookpath1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token3-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken3:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='18d' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token4-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>badhrefs</name>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken4:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='18e' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token5-level-infinite.xml</filepath>
-				</data>
-				<verify>
-					<callback>multistatusItems</callback>
-					<arg>
-						<name>badhrefs</name>
-						<value>$userguid1:/</value>
-					</arg>
-				</verify>
-				<grabelement>
-					<name>/{DAV:}multistatus/{DAV:}sync-token</name>
-					<variable>$synctoken5:</variable>
-				</grabelement>
-			</request>
-		</test>
-		<test name='18f' ignore='no'>
-			<request user="$userid2:" pswd="$pswd2:" print-response='no'>
-				<method>REPORT</method>
-				<ruri>$addressbookhome2:/$userguid1:/</ruri>
-				<data substitutions='yes'>
-					<content-type>text/xml; charset=utf-8</content-type>
-					<filepath>Resource/Common/REPORT/sync-token6-level-1.xml</filepath>
-				</data>
-				<verify>
-					<callback>statusCode</callback>
-					<arg>
-						<name>status</name>
-						<value>404</value>
-					</arg>
-				</verify>
-			</request>
-		</test>
-	</test-suite>
-	
-	<end>
-		<request user="$useradmin:" pswd="$pswdadmin:">
-			<method>DELETEALL</method>
-			<ruri>$addressbookhome1:/</ruri>
-			<ruri>$addressbookhome2:/</ruri>
-			<ruri>$addressbookhome3:/</ruri>
-			<ruri>$addressbookhome4:/</ruri>
-			<ruri>$notificationpath1:/</ruri>
-			<ruri>$notificationpath2:/</ruri>
-			<ruri>$notificationpath3:/</ruri>
-			<ruri>$notificationpath4:/</ruri>
-		</request>
-	</end>
-	
-</caldavtest>

Modified: CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py
===================================================================
--- CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py	2013-10-08 00:31:49 UTC (rev 11796)
+++ CalendarServer/branches/users/gaya/sharedgroupfixes/txdav/carddav/datastore/sql.py	2013-10-08 23:02:09 UTC (rev 11797)
@@ -604,10 +604,11 @@
             # add change for addressbook group
             changed, deleted = yield super(AddressBook, self).sharedChildResourceNamesSinceRevision(revision, depth)
 
-            ''' add the following for have addressbook group in sync report
-            if changed or deleted and depth != "1":
-                changed.add("%s/%s" % (path, self._groupForSharedAddressBookName(),))
-            '''
+            #===================================================================
+            # # Add the following for have addressbook group in sync report
+            # if changed or deleted and depth != "1":
+            #     changed.add("%s/%s" % (path, self._groupForSharedAddressBookName(),))
+            #===================================================================
 
             returnValue((changed, deleted))
 
@@ -1465,11 +1466,13 @@
                         shareeView.viewerHome()._children.pop(self.shareeName(), None)
                         shareeView.viewerHome()._children.pop(shareeView._resourceID, None)
                     else:
-                        #update all bind revisions
+                        #update revision in all remaining bind table rows for this address book
                         yield shareeView.notifyPropertyChanged()
                         for groupBindRow in groupBindRows:
                             groupObject = yield shareeView.objectResourceWithID(groupBindRow[2])
                             yield groupObject._initBindRevision()
+                        shareeView._objects = {}
+                        shareeView._objectNames = None
 
             if bind.MESSAGE in columnMap:
                 shareeView._bindMessage = columnMap[bind.MESSAGE]
@@ -1491,7 +1494,7 @@
     @inlineCallbacks
     def shareWith(self, shareeHome, mode, status=None, message=None):
         """
-            call super and set isShared = True
+            call super and set self.isShared True
         """
 
         # Note: super always calls shareView._initSyncToken():
@@ -1534,10 +1537,12 @@
                 shareeHome._children.pop(shareeAddressBook._resourceID, None)
             else:
                 yield shareeAddressBook.notifyPropertyChanged()
-                #update all bind revisions
+                #update revision in all remaining bind table rows for this address book
                 for groupBindRow in groupBindRows:
                     groupObject = yield shareeAddressBook.objectResourceWithID(groupBindRow[2])
                     yield groupObject._initBindRevision()
+                shareeAddressBook._objects = {}
+                shareeAddressBook._objectNames = None
 
             # Must send notification to ensure cache invalidation occurs
             yield self.notifyPropertyChanged()
@@ -1640,7 +1645,7 @@
         aboMembers = schema.ABO_MEMBERS
         groupRows = yield Select([aboMembers.GROUP_ID, aboMembers.MEMBER_ID, aboMembers.REMOVED, aboMembers.REVISION],
             From=aboMembers,
-            Where=(aboMembers.MEMBER_ID == self._resourceID)
+            Where=aboMembers.MEMBER_ID == self._resourceID,
         ).on(self._txn)
 
         # combine by groupID
@@ -2521,12 +2526,14 @@
                 shareeHome._children.pop(self.addressbook()._resourceID, None)
             else:
                 shareeAddressBook.notifyPropertyChanged()
-                #update all bind revisions
+                #update revision in all remaining bind table rows for this address book
                 for groupBindRow in groupBindRows:
                     groupObject = yield shareeAddressBook.objectResourceWithID(groupBindRow[2])
                     yield groupObject._initBindRevision()
                 if shareeAddressBook.fullyShared():
                     yield shareeAddressBook._initBindRevision()
+                shareeAddressBook._objects = {}
+                shareeAddressBook._objectNames = None
 
             # Must send notification to ensure cache invalidation occurs
             yield self.addressbook().notifyPropertyChanged()
@@ -2606,13 +2613,13 @@
         else:
             if status == _BIND_STATUS_ACCEPTED:
                 shareeView = yield shareeHome.objectWithShareUID(bindName)
-                groupBindRows = yield AddressBookObject._acceptedBindForHomeIDAndAddressBookID.on(
-                        self._txn, homeID=shareeView.viewerHome()._resourceID, addressbookID=shareeView.addressbook()._resourceID
-                )
-                currentAcceptedBindCount = len(groupBindRows)
                 if not shareeView.addressbook().fullyShared():
-                    if currentAcceptedBindCount == 1:
+                    groupBindRows = yield AddressBookObject._acceptedBindForHomeIDAndAddressBookID.on(
+                            self._txn, homeID=shareeView.viewerHome()._resourceID, addressbookID=shareeView.addressbook()._resourceID
+                    )
+                    if len(groupBindRows) == 1:
                         yield shareeView.addressbook()._initSyncToken()
+                yield shareeView._initBindRevision()
 
         queryCacher = self._txn._queryCacher
         if queryCacher:
@@ -2639,11 +2646,11 @@
     @inlineCallbacks
     def updateShare(self, shareeView, mode=None, status=None, message=None):
         """
-        Update share mode, status, and message for a home child shared with
-        this (owned) L{CommonHomeChild}.
+        Update share mode, status, and message for a address book group with
+        this (owned) L{AddressBookObject}.
 
-        @param shareeView: The sharee home child that shares this.
-        @type shareeView: L{CommonHomeChild}
+        @param shareeView: The sharee addressbook group that shares this.
+        @type shareeView: L{AddressBookObject}
 
         @param mode: The sharing mode; L{_BIND_MODE_READ} or
             L{_BIND_MODE_WRITE} or None to not update
@@ -2708,7 +2715,7 @@
                         shareeView.viewerHome()._children.pop(self.addressbook().shareeName(), None)
                         shareeView.viewerHome()._children.pop(shareeView._resourceID, None)
                     else:
-                        # update all bind revisions
+                        # update revision in all remaining bind table rows for this address book
                         yield shareeView.addressbook().notifyPropertyChanged()
                         for groupBindRow in groupBindRows:
                             if groupBindRow[2] != shareeView._resourceID:
@@ -2716,6 +2723,8 @@
                                 yield groupObject._initBindRevision()
                         if shareeView.addressbook().fullyShared():
                             yield shareeView.addressbook()._initBindRevision()
+                        shareeView.addressbook()._objects = {}
+                        shareeView.addressbook()._objectNames = None
 
             if bind.MESSAGE in columnMap:
                 shareeView._bindMessage = columnMap[bind.MESSAGE]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20131008/01c86b8c/attachment-0001.html>


More information about the calendarserver-changes mailing list