summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThomas Bruederli <bruederli@kolabsys.com>2013-07-17 15:19:33 (GMT)
committerThomas Bruederli <bruederli@kolabsys.com>2013-07-17 15:19:33 (GMT)
commit358afce60a38f8e6da0dba9fdc0241237e2947d5 (patch)
tree337150ac8f96dc78a18e1aa7d122b11f455ddbf0 /test
parent113f921dfeece7e3115fd861016c4943e0cc0571 (diff)
downloadiRony-358afce60a38f8e6da0dba9fdc0241237e2947d5.tar.gz
Add integration tests based on the CalDAVTester suite
Diffstat (limited to 'test')
-rw-r--r--test/README.md56
-rw-r--r--test/Resource/CalDAV/caldaviop/1/1_1.txt31
-rw-r--r--test/Resource/CalDAV/caldaviop/1/1_2.txt31
-rw-r--r--test/Resource/CalDAV/caldaviop/1/1_3.txt34
-rw-r--r--test/Resource/CalDAV/caldaviop/1/1_4.txt34
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_1.txt33
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_2.txt33
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_3.txt33
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_4.txt36
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_5.txt40
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_6.txt43
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_7.txt35
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_8.txt44
-rw-r--r--test/Resource/CalDAV/caldaviop/2/2_9.txt40
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_1.txt30
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_2.txt31
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_3.txt39
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_4a.txt31
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_4b.txt34
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_5a.txt39
-rw-r--r--test/Resource/CalDAV/caldaviop/4/4_5b.txt34
-rw-r--r--test/Resource/CalDAV/ctag/1.xml6
-rw-r--r--test/Resource/CalDAV/ctag/2.ics33
-rw-r--r--test/Resource/CalDAV/ctag/3.xml11
-rw-r--r--test/Resource/CalDAV/current-user-principal/1.xml6
-rw-r--r--test/Resource/CalDAV/event/1.txt30
-rw-r--r--test/Resource/CalDAV/event/2.txt31
-rw-r--r--test/Resource/CalDAV/event/3.txt32
-rw-r--r--test/Resource/CalDAV/event/4.txt34
-rwxr-xr-xtest/runtests.sh31
-rw-r--r--test/scripts/tests/CalDAV/caldavIOP.xml360
-rw-r--r--test/scripts/tests/CalDAV/ctag.xml802
-rw-r--r--test/scripts/tests/CalDAV/current-user-principal.xml178
-rw-r--r--test/serverinfo.xml809
34 files changed, 3124 insertions, 0 deletions
diff --git a/test/README.md b/test/README.md
new file mode 100644
index 0000000..296974d
--- /dev/null
+++ b/test/README.md
@@ -0,0 +1,56 @@
+Unit Tests for iRony CalDAV/CardDAV/WebDAV Server
+=================================================
+
+The tests are based on the [CalDAVTester][1] suite and require the Python-based
+suite to be installed and set up before.
+
+
+Installation
+------------
+
+Download and configure the CalDAVTester suite according to the descroptions
+in the [wiki][1]. Install it anywhere on your system.
+
+Make sure the pxcalendar package is installed. Do this by running
+
+ $ cd <path-to-caldavtester-directory>
+ $ ./run.py -s
+
+
+
+Configure Tests
+---------------
+
+The settings for the Kolab server to test are saved in `serverinfo.xml`
+located in this `test` folder.
+
+Adjust the following properties in your local `serverinfo.xml` file:
+
+* serverinfo.host
+
+as well as the values of the following substitution keys:
+
+* $root:
+* $userid%d:
+* $username%d:
+* $username-encoded%d:
+* $firstname%d:
+* $lastname%d:
+* $pswd%d:
+
+Make sure that two users matching the patterns of $userid%d and subsequent do
+exist on the Kolab server that is to be tested with. Default user accounts
+are set to dav.user01@<domain> and dav.user02@<domain> with password "12345".
+
+
+Running the Tests
+-----------------
+
+This `test` directory contains a helper script `runtests.sh` that runs all
+tests with the CalDAVTester suite. Run it as follows:
+
+ $ cd <iRony-directory>/test
+ $ ./runtests.sh <path-to-caldavtester-directory>
+
+
+[1]: http://trac.calendarserver.org/wiki/CalDAVTester
diff --git a/test/Resource/CalDAV/caldaviop/1/1_1.txt b/test/Resource/CalDAV/caldaviop/1/1_1.txt
new file mode 100644
index 0000000..02d4093
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/1/1_1.txt
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T090000
+DURATION:PT1H
+LOCATION:Durham
+SUMMARY:Meeting 1.1
+UID:1-1_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/1/1_2.txt b/test/Resource/CalDAV/caldaviop/1/1_2.txt
new file mode 100644
index 0000000..26c859a
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/1/1_2.txt
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232548Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T100000
+DURATION:PT1H
+RRULE:FREQ=WEEKLY;COUNT=4
+SUMMARY:Meeting 1.2
+UID:1-1_2
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/1/1_3.txt b/test/Resource/CalDAV/caldaviop/1/1_3.txt
new file mode 100644
index 0000000..b7e1415
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/1/1_3.txt
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED:$cuaddr1:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr2:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr3:
+DTSTAMP:20051228T232640Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T111500
+DURATION:PT1H
+ORGANIZER;CN=$username1::$cuaddr1:
+SUMMARY:Meeting 1.3
+UID:1-1_3
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/1/1_4.txt b/test/Resource/CalDAV/caldaviop/1/1_4.txt
new file mode 100644
index 0000000..5a69565
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/1/1_4.txt
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T234558Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T120000
+DURATION:PT1H
+SUMMARY:Meeting 1.4
+UID:1-1_4
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT15M
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_1.txt b/test/Resource/CalDAV/caldaviop/2/2_1.txt
new file mode 100644
index 0000000..1e40ee2
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_1.txt
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T090000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031237Z
+LOCATION:Durham
+SEQUENCE:1
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_2.txt b/test/Resource/CalDAV/caldaviop/2/2_2.txt
new file mode 100644
index 0000000..4e6ca18
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_2.txt
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T090000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031253Z
+LOCATION:Seattle bis
+SEQUENCE:2
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_3.txt b/test/Resource/CalDAV/caldaviop/2/2_3.txt
new file mode 100644
index 0000000..51b0f06
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_3.txt
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T090000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031307Z
+LOCATION:Seattle bis
+SEQUENCE:3
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_4.txt b/test/Resource/CalDAV/caldaviop/2/2_4.txt
new file mode 100644
index 0000000..f37ef76
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_4.txt
@@ -0,0 +1,36 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED;ROLE=CHAIR:$cuaddr1:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr2:
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T090000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031335Z
+LOCATION:Seattle bis
+ORGANIZER;CN=$username1::$cuaddr1:
+SEQUENCE:4
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_5.txt b/test/Resource/CalDAV/caldaviop/2/2_5.txt
new file mode 100644
index 0000000..857e604
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_5.txt
@@ -0,0 +1,40 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED;ROLE=CHAIR:$cuaddr1:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr2:
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T090000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031502Z
+LOCATION:Seattle bis
+ORGANIZER;CN=$username1::$cuaddr1:
+SEQUENCE:5
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT15M
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_6.txt b/test/Resource/CalDAV/caldaviop/2/2_6.txt
new file mode 100644
index 0000000..b0267b5
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_6.txt
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232548Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T100000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031626Z
+RRULE:FREQ=WEEKLY;COUNT=4
+SEQUENCE:1
+SUMMARY:Meeting 1.2
+UID:1-1_2
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20051228T232548Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T100000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031626Z
+SEQUENCE:1
+SUMMARY:Meeting 1.2bis
+UID:1-1_2
+RECURRENCE-ID:$now.year.1:0109T150000Z
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_7.txt b/test/Resource/CalDAV/caldaviop/2/2_7.txt
new file mode 100644
index 0000000..6231689
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_7.txt
@@ -0,0 +1,35 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED:$cuaddr1:
+ATTENDEE;PARTSTAT=DECLINED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr2:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr3:
+DTSTAMP:20051228T232640Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T111500
+DURATION:PT1H
+ORGANIZER;CN=$username1::$cuaddr1:
+SEQUENCE:1
+SUMMARY:Meeting 1.3
+UID:1-1_3
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_8.txt b/test/Resource/CalDAV/caldaviop/2/2_8.txt
new file mode 100644
index 0000000..564b4d6
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_8.txt
@@ -0,0 +1,44 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051228T232548Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T100000
+DURATION:PT1H
+EXDATE;TZID=US/Eastern:$now.year.1:0130T100000
+LAST-MODIFIED:20051229T031649Z
+RRULE:FREQ=WEEKLY;COUNT=4
+SEQUENCE:2
+SUMMARY:Meeting 1.2
+UID:1-1_2
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20051228T232548Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T100000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031626Z
+SEQUENCE:2
+SUMMARY:Meeting 1.2bis
+UID:1-1_2
+RECURRENCE-ID:$now.year.1:0109T150000Z
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/2/2_9.txt b/test/Resource/CalDAV/caldaviop/2/2_9.txt
new file mode 100644
index 0000000..50e6c66
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/2/2_9.txt
@@ -0,0 +1,40 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+ATTENDEE;CN=$username1:;PARTSTAT=ACCEPTED;ROLE=CHAIR:$cuaddr1:
+ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:$cuaddr2:
+DTSTAMP:20051228T232517Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T120000
+DURATION:PT1H
+LAST-MODIFIED:20051229T031502Z
+LOCATION:Seattle bis
+ORGANIZER;CN=$username1::$cuaddr1:
+SEQUENCE:5
+SUMMARY:Meeting 1.1bis
+UID:1-1_1
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT15M
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_1.txt b/test/Resource/CalDAV/caldaviop/4/4_1.txt
new file mode 100644
index 0000000..b4ef093
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_1.txt
@@ -0,0 +1,30 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035051Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T110000
+DURATION:PT1H
+SUMMARY:Meeting 4.1
+UID:4-4_1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_2.txt b/test/Resource/CalDAV/caldaviop/4/4_2.txt
new file mode 100644
index 0000000..7f28371
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_2.txt
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035131Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T120000
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=5
+SUMMARY:Meeting 4.2
+UID:4-4_2
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_3.txt b/test/Resource/CalDAV/caldaviop/4/4_3.txt
new file mode 100644
index 0000000..f46dc65
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_3.txt
@@ -0,0 +1,39 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035241Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T130000
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=5
+SUMMARY:Meeting 4.3
+UID:4-4_3
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20051229T035241Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T130000
+DURATION:PT2H
+RECURRENCE-ID:$now.year.1:0110T180000Z
+SUMMARY:Meeting 4.3
+UID:4-4_3
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_4a.txt b/test/Resource/CalDAV/caldaviop/4/4_4a.txt
new file mode 100644
index 0000000..8cd09bc
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_4a.txt
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035317Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T140000
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=5
+SUMMARY:Meeting 4.4
+UID:4-4_4
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_4b.txt b/test/Resource/CalDAV/caldaviop/4/4_4b.txt
new file mode 100644
index 0000000..fc3ef20
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_4b.txt
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035317Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T140000
+DURATION:PT1H
+EXDATE;TZID=US/Eastern:$now.year.1:0110T140000
+LAST-MODIFIED:20051229T035328Z
+RRULE:FREQ=DAILY;COUNT=5
+SEQUENCE:1
+SUMMARY:Meeting 4.4
+UID:4-4_4
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_5a.txt b/test/Resource/CalDAV/caldaviop/4/4_5a.txt
new file mode 100644
index 0000000..21a066d
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_5a.txt
@@ -0,0 +1,39 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035352Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T150000
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=5
+SUMMARY:Meeting 4.5
+UID:4-4_5
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20051229T035352Z
+DTSTART;TZID=US/Eastern:$now.year.1:0110T150000
+DURATION:PT2H
+RECURRENCE-ID:$now.year.1:0110T200000Z
+SUMMARY:Meeting 4.5
+UID:4-4_5
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/caldaviop/4/4_5b.txt b/test/Resource/CalDAV/caldaviop/4/4_5b.txt
new file mode 100644
index 0000000..a5ce450
--- /dev/null
+++ b/test/Resource/CalDAV/caldaviop/4/4_5b.txt
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051229T035352Z
+DTSTART;TZID=US/Eastern:$now.year.1:0109T150000
+DURATION:PT1H
+EXDATE;TZID=US/Eastern:$now.year.1:0110T150000
+LAST-MODIFIED:20051229T035404Z
+RRULE:FREQ=DAILY;COUNT=5
+SEQUENCE:1
+SUMMARY:Meeting 4.5
+UID:4-4_5
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/ctag/1.xml b/test/Resource/CalDAV/ctag/1.xml
new file mode 100644
index 0000000..657fa27
--- /dev/null
+++ b/test/Resource/CalDAV/ctag/1.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:" xmlns:A="http://calendarserver.org/ns/">
+<D:prop>
+<A:getctag/>
+</D:prop>
+</D:propfind>
diff --git a/test/Resource/CalDAV/ctag/2.ics b/test/Resource/CalDAV/ctag/2.ics
new file mode 100644
index 0000000..b259a29
--- /dev/null
+++ b/test/Resource/CalDAV/ctag/2.ics
@@ -0,0 +1,33 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T205953Z
+CREATED:20060101T150000Z
+DTSTART;TZID=US/Eastern:$now.year.1:0101T100000
+DURATION:PT1H
+SUMMARY:event 1
+UID:2
+ORGANIZER;CN=$username1::$cuaddr2:
+ATTENDEE;CN=$username2::$cuaddr1:
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/ctag/3.xml b/test/Resource/CalDAV/ctag/3.xml
new file mode 100644
index 0000000..2ab1ce8
--- /dev/null
+++ b/test/Resource/CalDAV/ctag/3.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:" xmlns:A="http://calendarserver.org/ns/" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:I="com.apple.ical:">
+<D:prop>
+<D:resourcetype/>
+<D:displayname/>
+<A:getctag/>
+<I:calendarcolor/>
+<C:calendar-description/>
+<D:resourcetype/>
+</D:prop>
+</D:propfind>
diff --git a/test/Resource/CalDAV/current-user-principal/1.xml b/test/Resource/CalDAV/current-user-principal/1.xml
new file mode 100644
index 0000000..dffedc6
--- /dev/null
+++ b/test/Resource/CalDAV/current-user-principal/1.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<D:propfind xmlns:D="DAV:">
+<D:prop>
+<D:current-user-principal/>
+</D:prop>
+</D:propfind>
diff --git a/test/Resource/CalDAV/event/1.txt b/test/Resource/CalDAV/event/1.txt
new file mode 100644
index 0000000..c5b7f9b
--- /dev/null
+++ b/test/Resource/CalDAV/event/1.txt
@@ -0,0 +1,30 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T205953Z
+DTSTART;TZID=US/Eastern:$now.year.1:0101T100000
+DURATION:PT1H
+SUMMARY:event 1
+UID:1
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/event/2.txt b/test/Resource/CalDAV/event/2.txt
new file mode 100644
index 0000000..68a601b
--- /dev/null
+++ b/test/Resource/CalDAV/event/2.txt
@@ -0,0 +1,31 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Mountain
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:MDT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:MST
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T210052Z
+DTSTART;TZID=US/Mountain:$now.year.1:0101T110000
+DURATION:PT1H
+SUMMARY:event 2
+DESCRIPTION:Some notes
+UID:2
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/event/3.txt b/test/Resource/CalDAV/event/3.txt
new file mode 100644
index 0000000..7cb5da6
--- /dev/null
+++ b/test/Resource/CalDAV/event/3.txt
@@ -0,0 +1,32 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Pacific
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T210146Z
+DTSTART;TZID=US/Pacific:$now.year.1:0101T130000
+DURATION:PT1H
+LAST-MODIFIED:20051222T210203Z
+SEQUENCE:1
+SUMMARY:event 3
+UID:3
+END:VEVENT
+END:VCALENDAR
diff --git a/test/Resource/CalDAV/event/4.txt b/test/Resource/CalDAV/event/4.txt
new file mode 100644
index 0000000..b078d46
--- /dev/null
+++ b/test/Resource/CalDAV/event/4.txt
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Example Inc.//Example Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+LAST-MODIFIED:20040110T032845Z
+TZID:US/Eastern
+BEGIN:DAYLIGHT
+DTSTART:20000404T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20001026T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20051222T210310Z
+DTSTART;TZID=US/Eastern:$now.year.1:0101T180000
+DURATION:PT1H
+SUMMARY:event 4
+UID:4
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT10M
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/test/runtests.sh b/test/runtests.sh
new file mode 100755
index 0000000..f4b4160
--- /dev/null
+++ b/test/runtests.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright (C) 2013, Kolab Systems AG <contact@kolabsys.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+##
+# Initializes the CalDAVTester environment and runs all test scripts
+#
+
+CALDAVTESTER=$1
+PYTHONPATH=`$CALDAVTESTER/run.py -p`
+
+export PYTHONPATH="$PYTHONPATH:$CALDAVTESTER/../pycalendar/src"
+
+$CALDAVTESTER/testcaldav.py --print-details-onfail -s serverinfo.xml \
+ CalDAV/current-user-principal.xml \
+ CalDAV/caldavIOP.xml \
+ CalDAV/ctag.xml
+
+
diff --git a/test/scripts/tests/CalDAV/caldavIOP.xml b/test/scripts/tests/CalDAV/caldavIOP.xml
new file mode 100644
index 0000000..0665bda
--- /dev/null
+++ b/test/scripts/tests/CalDAV/caldavIOP.xml
@@ -0,0 +1,360 @@
+<?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>
+
+ <require-feature>
+ <feature>caldav</feature>
+ </require-feature>
+
+ <start/>
+
+ <test-suite name='1. Event Creation'>
+ <test name='1.1'>
+ <description>Create new single-instance meeting titled "Meeting 1.1" with the location "Durham".</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/1/1_1.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='1.2'>
+ <description>Create new meeting titled "Meeting 1.2" recurring every Monday from 10:00 AM to 11:00 AM for 4 weeks.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/1/1_2.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='1.3'>
+ <description>Create new single-instance meeting titled "Meeting 1.3" with 2 other attendees.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_3.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/1/1_3.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='1.4'>
+ <description>Create new single-instance meeting titled "Meeting 1.4" with an alarm set to trigger 15 minutes prior to the schedule time of the meeting.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_4.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/1/1_4.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='2. Event Modification'>
+ <test name='2.1'>
+ <description>Modify the title of meeting "Meeting 1.1" to "Meeting 1.1bis".</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_1.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.2'>
+ <description>Modify the location of the meeting "Meeting 1.1bis" to "Seattle bis".</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_2.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.3'>
+ <description>Reschedule meeting "Meeting 1.1bis" to the next day.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_3.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.4'>
+ <description>Add an attendee to "Meeting 1.1bis".</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_4.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.5'>
+ <description>Add an alarm to "Meeting 1.1bis".</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_5.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.6'>
+ <description>Modify the title of the 1st instance of the recurring meeting created in 1.2.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_6.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.7'>
+ <description>Modify the participation status of 1st instance to DECLINED.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_3.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_7.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.8'>
+ <description>Cancel the 4th instance of the recurring meeting created in 1.2.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_8.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='2.9'>
+ <description>One client changes "Meeting 1.1bis" to a different time, second client 'refreshes' its display to see the modification.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1-1_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/2/2_9.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='4. Event Deletion'>
+ <test name='4.1'>
+ <description>Delete a single non-recurring meeting.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_1.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarpath1:/4-4_1.ics</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='4.2'>
+ <description>Delete a single recurring meeting with no overridden instances.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_2.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarpath1:/4-4_2.ics</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='4.3'>
+ <description>Delete a single recurring meeting with overridden instances.</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_3.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_3.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarpath1:/4-4_3.ics</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='4.4'>
+ <description>Delete a non-overridden instance of a recurring meeting.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_4.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_4a.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_4.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_4b.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='4.5'>
+ <description>Delete an overridden instance of a recurring meeting.</description>
+ <request end-delete='yes'>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_5.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_5a.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/4-4_5.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/caldaviop/4/4_5b.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <end>
+ <request user="$userid1:" pswd="$pswd1:">
+ <method>DELETEALL</method>
+ <ruri>$calendarpath1:/</ruri>
+ </request>
+ <request user="$userid1:" pswd="$pswd1:">
+ <method>DELETEALL</method>
+ <ruri>$inboxpath1:/</ruri>
+ </request>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>DELETEALL</method>
+ <ruri>$calendarpath2:/</ruri>
+ </request>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>DELETEALL</method>
+ <ruri>$inboxpath2:/</ruri>
+ </request>
+ <request user="$userid3:" pswd="$pswd3:">
+ <method>DELETEALL</method>
+ <ruri>$calendarpath3:/</ruri>
+ </request>
+ <request user="$userid3:" pswd="$pswd3:">
+ <method>DELETEALL</method>
+ <ruri>$inboxpath3:/</ruri>
+ </request>
+ </end>
+
+</caldavtest>
diff --git a/test/scripts/tests/CalDAV/ctag.xml b/test/scripts/tests/CalDAV/ctag.xml
new file mode 100644
index 0000000..fbcb0ed
--- /dev/null
+++ b/test/scripts/tests/CalDAV/ctag.xml
@@ -0,0 +1,802 @@
+<?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 the collection entity tag behavior on calendar collections</description>
+
+ <require-feature>
+ <feature>caldav</feature>
+ <feature>ctag</feature>
+ </require-feature>
+
+ <start>
+ <request end-delete="yes">
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/event/1.txt</filepath>
+ </data>
+ </request>
+ <request>
+ <method>MKCALENDAR</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ </request>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarhome1:/movecopy/2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/event/2.txt</filepath>
+ </data>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag2:</variable>
+ </grabproperty>
+ </request>
+ </start>
+
+ <test-suite name='PUT/DELETE/COPY/MOVE' ignore='no'>
+ <test name='1'>
+ <description>Check for CTag</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='2'>
+ <description>Check for CTag</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag1:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='3'>
+ <description>Check for CTag change on DELETE</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='4'>
+ <description>Check for CTag change on PUT of new resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/event/1.txt</filepath>
+ </data>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='5'>
+ <description>Check for CTag change on PUT of existing resource</description>
+ <request>
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/event/1.txt</filepath>
+ </data>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='6'>
+ <require-feature>
+ <feature>MOVE Method</feature>
+ </require-feature>
+ <description>Check for CTag change on MOVE of new resource</description>
+ <request>
+ <method>MOVE</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <header>
+ <name>Destination</name>
+ <value>$host:$calendarhome1:/movecopy/1.ics</value>
+ </header>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag2:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag2:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='7'>
+ <require-feature>
+ <feature>COPY Method</feature>
+ </require-feature>
+ <exclude-feature>
+ <feature>no-duplicate-uids</feature>
+ </exclude-feature>
+ <description>Check for CTag change on COPY of new resource</description>
+ <request>
+ <method>COPY</method>
+ <ruri>$calendarhome1:/movecopy/2.ics</ruri>
+ <header>
+ <name>Destination</name>
+ <value>$host:$calendarpath1:/2.ics</value>
+ </header>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag2:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='8'>
+ <require-feature>
+ <feature>COPY Method</feature>
+ </require-feature>
+ <exclude-feature>
+ <feature>no-duplicate-uids</feature>
+ </exclude-feature>
+ <description>Check for CTag change on COPY of existing resource</description>
+ <request>
+ <method>COPY</method>
+ <ruri>$calendarhome1:/movecopy/2.ics</ruri>
+ <header>
+ <name>Destination</name>
+ <value>$host:$calendarpath1:/2.ics</value>
+ </header>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag2:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <!-- TODO: kolab_storage_cache::uid2msguid() returns false resutls after copy (multiple messages for one UID exist) -->
+ <test name='9' ignore='yes'>
+ <require-feature>
+ <feature>MOVE Method</feature>
+ </require-feature>
+ <exclude-feature>
+ <feature>no-duplicate-uids</feature>
+ </exclude-feature>
+ <description>Check for no CTag change on failed MOVE of existing resource</description>
+ <request>
+ <method>MOVE</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <header>
+ <name>Destination</name>
+ <value>$host:$calendarhome1:/movecopy/2.ics</value>
+ </header>
+ <verify>
+ <callback>statusCode</callback>
+ <arg>
+ <name>status</name>
+ <value>404</value>
+ </arg>
+ </verify>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag1:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag2:</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag2:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ </test-suite>
+
+ <!-- TODO: enable these tests once scheduling is implemented -->
+ <test-suite name='Scheduling' ignore='no'>
+ <require-feature>
+ <feature>schedule-inbox</feature>
+ </require-feature>
+
+ <test name='1'>
+ <description>Check for CTag on calendar</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag3:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='2'>
+ <description>Check for CTag on inbox</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$inboxpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag4:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='3'>
+ <description>PUT invite</description>
+ <request user="$userid2:" pswd="$pswd2:" print-response='no'>
+ <method>PUT</method>
+ <ruri>$calendarpath2:/2.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/2.ics</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name="4">
+ <description>Test calendar ctag change</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag3:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name="5">
+ <require-feature>
+ <feature>schedule-ext</feature>
+ </require-feature>
+ <description>Test inbox ctag change</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$inboxpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag!$getctag4:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='Same for each Depth' ignore='no'>
+ <test name='1'>
+ <description>Check for CTag Depth:0</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='2'>
+ <description>Check for CTag Depth:1</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>only</name>
+ <value>$calendarpath1:/</value>
+ </arg>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag1:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='3'>
+ <description>Add/update resource</description>
+ <request end-delete="yes">
+ <method>PUT</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <data>
+ <content-type>text/calendar; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/event/1.txt</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='4'>
+ <description>Check for CTag Depth:0</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='5'>
+ <description>Check for CTag Depth:1</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>only</name>
+ <value>$calendarpath1:/</value>
+ </arg>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag1:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='6'>
+ <description>Delete resource</description>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarpath1:/1.ics</ruri>
+ <verify>
+ <callback>statusCode</callback>
+ </verify>
+ </request>
+ </test>
+ <test name='7'>
+ <description>Check for CTag Depth:0</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarpath1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag</value>
+ </arg>
+ </verify>
+ <grabproperty>
+ <property>{http://calendarserver.org/ns/}getctag</property>
+ <variable>$getctag1:</variable>
+ </grabproperty>
+ </request>
+ </test>
+ <test name='8'>
+ <description>Check for CTag Depth:1</description>
+ <request print-response='no'>
+ <method>PROPFIND</method>
+ <ruri>$calendarhome1:/</ruri>
+ <header>
+ <name>Depth</name>
+ <value>1</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/ctag/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>only</name>
+ <value>$calendarpath1:/</value>
+ </arg>
+ <arg>
+ <name>okprops</name>
+ <value>{http://calendarserver.org/ns/}getctag$$getctag1:</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <end>
+ <request>
+ <method>DELETEALL</method>
+ <ruri>$calendarpath1:/</ruri>
+ </request>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>DELETEALL</method>
+ <ruri>$calendarpath2:/</ruri>
+ </request>
+ <request>
+ <method>DELETEALL</method>
+ <ruri>$inboxpath1:/</ruri>
+ </request>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>DELETEALL</method>
+ <ruri>$inboxpath2:/</ruri>
+ </request>
+ <request>
+ <method>DELETE</method>
+ <ruri>$calendarhome1:/movecopy/</ruri>
+ </request>
+ </end>
+
+</caldavtest>
diff --git a/test/scripts/tests/CalDAV/current-user-principal.xml b/test/scripts/tests/CalDAV/current-user-principal.xml
new file mode 100644
index 0000000..4324903
--- /dev/null
+++ b/test/scripts/tests/CalDAV/current-user-principal.xml
@@ -0,0 +1,178 @@
+<?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 DAV:current-user-principal support</description>
+
+ <require-feature>
+ <feature>caldav</feature>
+ <feature>current-user-principal</feature>
+ </require-feature>
+
+ <start/>
+
+ <test-suite name='Check for the property on /' ignore='no'>
+ <test name='1' ignore='no'>
+ <description>Check for authenticated property on /</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$root:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value><![CDATA[{DAV:}current-user-principal$<href xmlns="DAV:">$principaluri1:</href>]]></value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='2' ignore='no'>
+ <description>Check for unauthenticated property on /</description>
+ <request auth="no">
+ <method>PROPFIND</method>
+ <ruri>$root:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ <arg>
+ <name>status</name>
+ <value>401</value>
+ </arg>
+ </verify>
+<!-- <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value><![CDATA[{DAV:}current-user-principal$<unauthenticated xmlns="DAV:"/>]]></value>
+ </arg>
+ </verify>
+-->
+ </request>
+ </test>
+ <test name='3' ignore='no'>
+ <description>Check for authenticated property on / (user02)</description>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>PROPFIND</method>
+ <ruri>$root:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value><![CDATA[{DAV:}current-user-principal$<href xmlns="DAV:">$principaluri2:</href>]]></value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <test-suite name='Check for the property on /principals/' ignore='no'>
+ <test name='1' ignore='no'>
+ <description>Check for authenticated property on /</description>
+ <request>
+ <method>PROPFIND</method>
+ <ruri>$principalcollection:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value><![CDATA[{DAV:}current-user-principal$<href xmlns="DAV:">$principaluri1:</href>]]></value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='2' ignore='no'>
+ <description>Check for unauthenticated property on /</description>
+ <request auth="no">
+ <method>PROPFIND</method>
+ <ruri>$principalcollection:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>statusCode</callback>
+ <arg>
+ <name>status</name>
+ <value>401</value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ <test name='3' ignore='no'>
+ <description>Check for authenticated property on / (user02)</description>
+ <request user="$userid2:" pswd="$pswd2:">
+ <method>PROPFIND</method>
+ <ruri>$principalcollection:</ruri>
+ <header>
+ <name>Depth</name>
+ <value>0</value>
+ </header>
+ <data>
+ <content-type>text/xml; charset=utf-8</content-type>
+ <filepath>Resource/CalDAV/current-user-principal/1.xml</filepath>
+ </data>
+ <verify>
+ <callback>propfindItems</callback>
+ <arg>
+ <name>okprops</name>
+ <value><![CDATA[{DAV:}current-user-principal$<href xmlns="DAV:">$principaluri2:</href>]]></value>
+ </arg>
+ </verify>
+ </request>
+ </test>
+ </test-suite>
+
+ <end/>
+</caldavtest>
diff --git a/test/serverinfo.xml b/test/serverinfo.xml
new file mode 100644
index 0000000..30c4df3
--- /dev/null
+++ b/test/serverinfo.xml
@@ -0,0 +1,809 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE serverinfo SYSTEM "serverinfo.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.
+-->
+
+<serverinfo>
+ <host>localhost</host>
+ <nonsslport>80</nonsslport>
+ <sslport>443</sslport>
+ <authtype>basic</authtype>
+
+ <features>
+ <!-- Generic WebDAV extensions -->
+ <feature>COPY Method</feature> <!-- COPY method -->
+ <feature>MOVE Method</feature> <!-- MOVE method -->
+ <feature>Extended MKCOL</feature> <!-- Extended MKCOL -->
+
+ <!-- ACL related -->
+ <!-- <feature>ACL Method</feature> --> <!-- ACL method -->
+ <!-- <feature>acl-principal-prop-set REPORT</feature> --> <!-- ACL acl-principal-prop-set REPORT -->
+ <!-- <feature>principal-match REPORT</feature> --> <!-- ACL principal-match REPORT -->
+ <!-- <feature>principal-property-search REPORT</feature> --> <!-- ACL principal-property-search REPORT -->
+ <!-- <feature>principal-search-property-set REPORT</feature> --> <!-- ACL principal-search-property-set REPORT -->
+
+ <!-- <feature>add-member</feature> --> <!-- Add-member used to create resources -->
+ <!-- <feature>brief</feature> --> <!-- Brief header for PROPFIND, REPORT -->
+ <!-- <feature>bulk-post</feature> --> <!-- Bulk POST requests -->
+ <feature>ctag</feature> <!-- ctag extension -->
+ <feature>current-user-principal</feature> <!-- current-user-principal extension -->
+ <!-- <feature>directory listing</feature> --> <!-- GET on collection -->
+ <!-- <feature>extended-principal-search</feature> --> <!-- Extended principal-property-search REPORT extension -->
+ <!-- <feature>expand-property</feature> --> <!-- Expand property REPORT -->
+ <!-- <feature>only-proxy-groups</feature> --> <!-- Group-membership only includes delegated-to groups -->
+ <!-- <feature>limits</feature> --> <!-- max-collections and max-resources limits -->
+ <!-- <feature>prefer</feature> --> <!-- Prefer header overall support -->
+ <!-- <feature>prefer-minimal</feature> --> <!-- Prefer header return=minimal -->
+ <!-- <feature>prefer-representation</feature> --> <!-- Prefer header return=representation -->
+ <!-- <feature>prefer-noroot</feature> --> <!-- Prefer header depth-noroot -->
+ <!-- <feature>quota</feature> --> <!-- WebDAV QUOTA -->
+ <!-- <feature>quota-on-resources</feature> --> <!-- WebDAV QUOTA on calendar and address book object resources -->
+ <!-- <feature>resource-id</feature> --> <!-- WebDAV BIND DAV:resource-id property -->
+ <!-- <feature>sync-report</feature> --> <!-- WebDAV collection sync REPORT -->
+ <!-- <feature>sync-report-home</feature> --> <!-- WebDAV collection sync REPORT on Homes -->
+ <feature>well-known</feature> <!-- well-known feature -->
+
+ <!-- <feature>per-object-ACLs</feature> --> <!-- ACL for objects in calendar/address books -->
+ <!-- <feature>regular-collection</feature> --> <!-- Regular collections allowed in calendar/address book homes -->
+
+ <!-- CalDAV specific extension -->
+ <feature>caldav</feature> <!-- Basic CalDAV feature enabler -->
+ <!-- <feature>auto-accept</feature> --> <!-- Auto-accept for rooms & locations -->
+ <!-- <feature>auto-accept-modes</feature> --> <!-- Auto-accept modes -->
+ <!--<feature>dropbox</feature> --> <!-- dropbox extension -->
+ <!-- <feature>default-alarms</feature> --> <!-- default alarms extension -->
+ <!-- <feature>EMAIL parameter</feature> --> <!-- Server normalizes cuaddress and adds EMAIL parameter -->
+ <!-- <feature>extended-freebusy</feature> --> <!-- Extended freebusy response -->
+ <!-- <feature>implicit-scheduling</feature> --> <!-- CalDAV scheduling - implicit -->
+ <!-- <feature>location-resource-tracking</feature> --> <!-- Server tracks who makes unscheduled changes to locations and resources -->
+ <!-- <feature>managed-attachments</feature> --> <!-- CalDAV Managed Attachments -->
+ <!-- <feature>maskuid</feature> --> <!-- maskuid extension -->
+ <!-- <feature>partitioning</feature> --> <!-- Partitioned server -->
+ <!-- <feature>no-duplicate-uids</feature> --> <!-- duplicate UIDs in same home not supported -->
+ <!-- <feature>partstat-timestamp</feature> --> <!-- Time stamps when PARTSTAT changes extension -->
+ <!-- <feature>private-comments</feature> --> <!-- private-comments extension -->
+ <!-- <feature>private-events</feature> --> <!-- private-events extension -->
+ <!-- <feature>proxy</feature> --> <!-- calendar-user-proxy extension -->
+ <!-- <feature>proxy-authz</feature> --> <!-- sudo user extension -->
+ <!-- <feature>remove-duplicate-alarms</feature> --> <!-- Server removes any duplicate alarms on PUT -->
+ <!-- <feature>query-extended</feature> --> <!-- calendar-query-extended extension -->
+ <!-- <feature>shared-calendars</feature> --> <!-- Shared calendars extension -->
+ <!--><feature>schedule-inbox</feature> --> <!-- Scheduling Extension -->
+ <!-- <feature>schedule-changes</feature> --> <!-- schedule-changes property extension -->
+ <!-- <feature>split-calendars</feature> --> <!-- Calendars are split by component type -->
+ <!-- <feature>supported-component-sets</feature> --> <!-- CALDAV:supported-calendar-component-sets on calendar homes -->
+ <!-- <feature>supported-component-sets-one</feature> --> <!-- Only single component calendars allowed to be created -->
+ <!-- <feature>timerange-low-limit</feature> --> <!-- Time-range only valid one year back -->
+ <!-- <feature>timerange-high-limit</feature> --> <!-- Time-range only valid 5 years ahead -->
+ <!-- <feature>timezone-service</feature> --> <!-- Timezone service extension for Wiki-->
+ <!-- <feature>timezone-std-service</feature> --> <!-- Timezone standard service extension -->
+ <!-- <feature>vavailability</feature> --> <!-- VAVAILABILITY on inbox -->
+ <!-- <feature>webcal</feature> --> <!-- Internet calendar subscription via GET on calendar collection -->
+
+ <!-- CardDAV specific extension -->
+ <!-- <feature>carddav</feature> --> <!-- Basic CardDAV feature enabler -->
+ <!-- <feature>default-addressbook</feature> --> <!-- Default address book behavior -->
+ <!-- <feature>global-addressbook</feature> --> <!-- Global address book for each user -->
+ <!-- <feature>shared-addressbooks</feature> --> <!-- Shared address books extension -->
+ <!-- <feature>directory-gateway</feature> --> <!-- Directory gateway extension -->
+
+ </features>
+
+ <substitutions>
+ <!-- relative path to caldav root-->
+ <substitution>
+ <key>$root:</key>
+ <value>/dav/</value>
+ </substitution>
+
+ <!-- Useful xpath shortcuts for verifiers -->
+ <substitution>
+ <key>$multistatus-response-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response</value>
+ </substitution>
+ <substitution>
+ <key>$multistatus-href-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}href</value>
+ </substitution>
+ <substitution>
+ <key>$verify-response-prefix:</key>
+ <value>{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-property-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-bad-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}status</value>
+ </substitution>
+ <substitution>
+ <key>$verify-error-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}error</value>
+ </substitution>
+ <substitution>
+ <key>$CALDAV:</key>
+ <value>urn:ietf:params:xml:ns:caldav</value>
+ </substitution>
+ <substitution>
+ <key>$CARDDAV:</key>
+ <value>urn:ietf:params:xml:ns:carddav</value>
+ </substitution>
+ <substitution>
+ <key>$CS:</key>
+ <value>http://calendarserver.org/ns/</value>
+ </substitution>
+
+ <!-- Server configuration settings -->
+ <!-- $host: and $hostssl: are implicitly added by CalDAVTester based
+ on the host/nonsslport/sslport values and ssl command line switch -->
+
+ <!-- relative path to main principal collection-->
+ <substitution>
+ <key>$principalcollection:</key>
+ <value>$root:principals/</value>
+ </substitution>
+
+ <!-- the core recored type collections-->
+ <substitution>
+ <key>$uidstype:</key>
+ <value>__uids__</value>
+ </substitution>
+ <substitution>
+ <key>$userstype:</key>
+ <value>users</value>
+ </substitution>
+ <substitution>
+ <key>$groupstype:</key>
+ <value>groups</value>
+ </substitution>
+ <substitution>
+ <key>$locationstype:</key>
+ <value>locations</value>
+ </substitution>
+ <substitution>
+ <key>$resourcestype:</key>
+ <value>resources</value>
+ </substitution>
+
+ <!-- relative path to record type principal collections-->
+ <substitution>
+ <key>$principals_uids:</key>
+ <value>$principalcollection:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_users:</key>
+ <value>$principalcollection:$userstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_groups:</key>
+ <value>$principalcollection:$groupstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_resources:</key>
+ <value>$principalcollection:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_locations:</key>
+ <value>$principalcollection:$locationstype:/</value>
+ </substitution>
+
+ <!-- relative path to calendars collection-->
+ <substitution>
+ <key>$calendars:</key>
+ <value>$root:calendars/</value>
+ </substitution>
+
+ <!-- relative path to record type calendar collections-->
+ <substitution>
+ <key>$calendars_uids:</key>
+ <value>$calendars:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_users:</key>
+ <value>$calendars:$userstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_groups:</key>
+ <value>$calendars:$groupstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_resources:</key>
+ <value>$calendars:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_locations:</key>
+ <value>$calendars:$locationstype:/</value>
+ </substitution>
+
+ <!-- primary calendar name-->
+ <substitution>
+ <key>$calendar:</key>
+ <value>Calendar</value>
+ </substitution>
+
+ <!-- primary tasks-only calendar name-->
+ <substitution>
+ <key>$tasks:</key>
+ <value>Tasks</value>
+ </substitution>
+
+ <!-- inbox name-->
+ <substitution>
+ <key>$inbox:</key>
+ <value>inbox</value>
+ </substitution>
+
+ <!-- outbox name-->
+ <substitution>
+ <key>$outbox:</key>
+ <value>outbox</value>
+ </substitution>
+
+ <!-- dropbox name-->
+ <substitution>
+ <key>$dropbox:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- attachments name-->
+ <substitution>
+ <key>$attachments:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- notification name-->
+ <substitution>
+ <key>$notification:</key>
+ <value>notification</value>
+ </substitution>
+
+ <!-- freebusy name-->
+ <substitution>
+ <key>$freebusy:</key>
+ <value>freebusy</value>
+ </substitution>
+
+ <!-- server-to-server inbox-->
+ <substitution>
+ <key>$servertoserver:</key>
+ <value>$root:inbox</value>
+ </substitution>
+
+ <!-- timezone service-->
+ <substitution>
+ <key>$timezoneservice:</key>
+ <value>$root:timezones</value>
+ </substitution>
+
+ <!-- timezone std service-->
+ <substitution>
+ <key>$timezonestdservice:</key>
+ <value>$root:stdtimezones</value>
+ </substitution>
+
+ <!-- relative path to calendars collection-->
+ <substitution>
+ <key>$addressbooks:</key>
+ <value>$root:addressbooks/</value>
+ </substitution>
+
+ <!-- relative path to record type calendar collections-->
+ <substitution>
+ <key>$addressbooks_uids:</key>
+ <value>$addressbooks:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$addressbooks_users:</key>
+ <value>$addressbooks:$userstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$addressbooks_groups:</key>
+ <value>$addressbooks:$groupstype:/</value>
+ </substitution>
+
+ <!-- primary addressbook name -->
+ <substitution>
+ <key>$addressbook:</key>
+ <value>Contacts</value>
+ </substitution>
+
+ <!-- directory name -->
+ <substitution>
+ <key>$directory:</key>
+ <value>$root:directory/</value>
+ </substitution>
+
+ <!-- global-addressbook name -->
+ <substitution>
+ <key>$global_addressbook:</key>
+ <value>global-addressbook</value>
+ </substitution>
+
+ <!-- POST add-member URI suffix -->
+ <substitution>
+ <key>$add-member:</key>
+ <value>;add-member</value>
+ </substitution>
+
+ <!-- user id for admin user -->
+ <substitution>
+ <key>$useradmin:</key>
+ <value>admin</value>
+ </substitution>
+ <!-- guid for admin user -->
+ <substitution>
+ <key>$useradminguid:</key>
+ <value>admin</value>
+ </substitution>
+ <!-- password for admin user -->
+ <substitution>
+ <key>$pswdadmin:</key>
+ <value>admin</value>
+ </substitution>
+
+ <!-- relative path to admin principal resource-->
+ <substitution>
+ <key>$principal_admin:</key>
+ <value>$principalcollection:$useradmin:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_admin:</key>
+ <value>$principalcollection:$useradminguid:/</value>
+ </substitution>
+
+ <!-- user id for apprentice user -->
+ <substitution>
+ <key>$userapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+ <!-- guid for apprentice user -->
+ <substitution>
+ <key>$userapprenticeguid:</key>
+ <value>apprentice</value>
+ </substitution>
+ <!-- password for apprentice user -->
+ <substitution>
+ <key>$pswdapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+
+ <!-- relative path to apprentice principal resource-->
+ <substitution>
+ <key>$principal_apprentice:</key>
+ <value>$principalcollection:$userapprentice:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_apprentice:</key>
+ <value>$principalcollection:$userapprenticeguid:/</value>
+ </substitution>
+
+ <!-- user id for proxy user -->
+ <substitution>
+ <key>$userproxy:</key>
+ <value>superuser</value>
+ </substitution>
+ <!-- password for proxy user -->
+ <substitution>
+ <key>$pswdproxy:</key>
+ <value>superuser</value>
+ </substitution>
+
+ <!-- User accounts -->
+ <repeat count="2">
+ <!-- user id -->
+ <substitution>
+ <key>$userid%d:</key>
+ <value>dav.user%02d@brotherli.ch</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$userguid%d:</key>
+ <value>$userid%d:</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$username%d:</key>
+ <value>DAV User%02d</value>
+ </substitution>
+ <!-- user name URI encoded -->
+ <substitution>
+ <key>$username-encoded%d:</key>
+ <value>DAV%%20User%02d</value>
+ </substitution>
+ <!-- first name -->
+ <substitution>
+ <key>$firstname%d:</key>
+ <value>DAV</value>
+ </substitution>
+ <!-- last name -->
+ <substitution>
+ <key>$lastname%d:</key>
+ <value>User %02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$pswd%d:</key>
+ <value>12345</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$principal%d:</key>
+ <value>$principalcollection:$userid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri%d:</key>
+ <value>$principalcollection:$userguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principal%dnoslash:</key>
+ <value>$principalcollection:$userid%d:</value>
+ </substitution>
+
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$calendarhome%d:</key>
+ <value>$calendars:$userguid%d:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar home-->
+ <substitution>
+ <key>$calendarhomealt%d:</key>
+ <value>$calendars:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$calendarpath%d:</key>
+ <value>$calendarhome%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar-->
+ <substitution>
+ <key>$calendarpathalt%d:</key>
+ <value>$calendarhomealt%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user tasks calendar-->
+ <substitution>
+ <key>$taskspath%d:</key>
+ <value>$calendarhome%d:/$tasks:</value>
+ </substitution>
+ <!-- relative path to user inbox-->
+ <substitution>
+ <key>$inboxpath%d:</key>
+ <value>$calendarhome%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to user outbox-->
+ <substitution>
+ <key>$outboxpath%d:</key>
+ <value>$calendarhome%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to user dropbox-->
+ <substitution>
+ <key>$dropboxpath%d:</key>
+ <value>$calendarhome%d:/$dropbox:</value>
+ </substitution>
+ <!-- relative path to user notification-->
+ <substitution>
+ <key>$notificationpath%d:</key>
+ <value>$calendarhome%d:/$notification:</value>
+ </substitution>
+ <!-- relative path to user freebusy-->
+ <substitution>
+ <key>$freebusypath%d:</key>
+ <value>$calendarhome%d:/$freebusy:</value>
+ </substitution>
+ <substitution>
+ <key>$email%d:</key>
+ <value>$userid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$cuaddr%d:</key>
+ <value>mailto:$email%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddralt%d:</key>
+ <value>$principaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddraltnoslash%d:</key>
+ <value>$principals_uids:$userguid%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddrurn%d:</key>
+ <value>urn:uuid:$userguid%d:</value>
+ </substitution>
+
+ <!-- relative path to user addressbook home-->
+ <substitution>
+ <key>$addressbookhome%d:</key>
+ <value>$addressbooks_uids:$userguid%d:</value>
+ </substitution>
+ <!-- relative path to user addressbook-->
+ <substitution>
+ <key>$addressbookpath%d:</key>
+ <value>$addressbooks_uids:$userguid%d:/$addressbook:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Public accounts -->
+ <repeat count="0">
+ <!-- user id -->
+ <substitution>
+ <key>$publicuserid%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$publicuserguid%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$publicusername%d:</key>
+ <value>Public %02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$publicpswd%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$publicprincipal%d:</key>
+ <value>$principals_users:$publicuserid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$publicprincipaluri%d:</key>
+ <value>$principals_uids:$publicuserguid%d:/</value>
+ </substitution>
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$publiccalendarhome%d:</key>
+ <value>$calendars:$publicuserguid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$publiccalendarpath%d:</key>
+ <value>$calendars:$publicuserguid%d:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$publicemail%d:</key>
+ <value>$publicuserid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$publiccuaddr%d:</key>
+ <value>mailto:$publicemail%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddralt%d:</key>
+ <value>$publicprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddrurn%d:</key>
+ <value>urn:uuid:$publicuserguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Resource accounts -->
+ <repeat count="0">
+ <substitution>
+ <key>$resourceid%d:</key>
+ <value>resource%02d</value>
+ </substitution>
+ <!-- resource guid-->
+ <substitution>
+ <key>$resourceguid%d:</key>
+ <value>resource%02d</value>
+ </substitution>
+ <!-- resource name-->
+ <substitution>
+ <key>$resourcename%d:</key>
+ <value>Resource %02d</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarhome%d:</key>
+ <value>$calendars:$resourceguid%d:</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarpath%d:</key>
+ <value>$calendars:$resourceguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first resource inbox-->
+ <substitution>
+ <key>$rinboxpath%d:</key>
+ <value>$calendars:$resourceguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first resource outbox-->
+ <substitution>
+ <key>$routboxpath%d:</key>
+ <value>$calendars:$resourceguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first resource principal resource-->
+ <substitution>
+ <key>$rprincipal%d:</key>
+ <value>$principals_resources:$resourceid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rprincipaluri%d:</key>
+ <value>$principals_uids:$resourceguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddralt%d:</key>
+ <value>$rprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddrurn%d:</key>
+ <value>urn:uuid:$resourceguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Location accounts -->
+ <repeat count="0">
+ <substitution>
+ <key>$locationid%d:</key>
+ <value>location%02d</value>
+ </substitution>
+ <!-- location guid-->
+ <substitution>
+ <key>$locationguid%d:</key>
+ <value>location%02d</value>
+ </substitution>
+ <!-- location name-->
+ <substitution>
+ <key>$locationname%d:</key>
+ <value>Location %02d</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarhome%d:</key>
+ <value>$calendars:$locationguid%d:</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarpath%d:</key>
+ <value>$calendars:$locationguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first location inbox-->
+ <substitution>
+ <key>$linboxpath%d:</key>
+ <value>$calendars:$locationguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first location outbox-->
+ <substitution>
+ <key>$loutboxpath%d:</key>
+ <value>$calendars:$locationguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first location principal resource-->
+ <substitution>
+ <key>$lprincipal%d:</key>
+ <value>$principals_resources:$locationid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lprincipaluri%d:</key>
+ <value>$principals_uids:$locationguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddralt%d:</key>
+ <value>$lprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddrurn%d:</key>
+ <value>urn:uuid:$locationguid%d:</value>
+ </substitution>
+ </repeat>
+
+
+ <!-- Group accounts -->
+ <repeat count="0">
+ <substitution>
+ <key>$groupid%d:</key>
+ <value>group%02d</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$groupguid%d:</key>
+ <value>group%02d</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$groupname%d:</key>
+ <value>Group %02d</value>
+ </substitution>
+ <!-- relative path to first group principal resource-->
+ <substitution>
+ <key>$gprincipal%d:</key>
+ <value>$principals_resources:$groupid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gprincipaluri%d:</key>
+ <value>$principals_uids:$groupguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddralt%d:</key>
+ <value>$gprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddrurn%d:</key>
+ <value>urn:uuid:$groupguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- User with non-ascii name -->
+ <substitution>
+ <key>$i18nid:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$i18nguid:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$i18nname:</key>
+ <value>まだ</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$i18npswd:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$i18ncalendarpath:</key>
+ <value>$calendars:$i18nguid:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$i18nemail:</key>
+ <value>$i18nid:@example.com</value>
+ </substitution>
+ <!-- CUAddrs -->
+ <substitution>
+ <key>$i18ncuaddr:</key>
+ <value>mailto:$i18nemail:</value>
+ </substitution>
+ <substitution>
+ <key>$i18ncuaddrurn:</key>
+ <value>urn:uuid:$i18nguid:</value>
+ </substitution>
+
+ <!-- relative path to disabled group principal resource-->
+ <substitution>
+ <key>$principaldisabled:</key>
+ <value>$principals_groups:disabledgroup/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluridisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+ <!-- calendar user address of disabled group-->
+ <substitution>
+ <key>$cuaddrdisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+
+ <!-- calendar user address of second user-->
+ <substitution>
+ <key>$cuaddr2:</key>
+ <value>MAILTO:$email2:</value>
+ </substitution>
+
+ </substitutions>
+</serverinfo>