[CalendarServer-changes] [10138] CalDAVTester/branches/users/cdaboo/managed-attachments

source_changes at macosforge.org source_changes at macosforge.org
Fri Dec 7 13:01:33 PST 2012


Revision: 10138
          http://trac.calendarserver.org//changeset/10138
Author:   cdaboo at apple.com
Date:     2012-12-07 13:01:33 -0800 (Fri, 07 Dec 2012)
Log Message:
-----------
Merged from trunk.

Modified Paths:
--------------
    CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-All
    CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CalDAV
    CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CardDAV
    CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-All
    CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CalDAV
    CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CardDAV
    CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-partitioning.xml
    CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-template.xml
    CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo.xml

Added Paths:
-----------
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/tests/CalDAV/timezonestdservice.xml
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/jsonPointer.py
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py
    CalDAVTester/branches/users/cdaboo/managed-attachments/verifiers/jsonPointerMatch.py

Removed Paths:
-------------
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py
    CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py

Property Changed:
----------------
    CalDAVTester/branches/users/cdaboo/managed-attachments/


Property changes on: CalDAVTester/branches/users/cdaboo/managed-attachments
___________________________________________________________________
Modified: svn:mergeinfo
   - /CalDAVTester/branches/release/CalDAVTester-3.0-dev:7584
/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
/CalDAVTester/trunk:9986-10090
   + /CalDAVTester/branches/release/CalDAVTester-3.0-dev:7584
/CalDAVTester/branches/users/cdaboo/attendee-comments-2887:2888-2910
/CalDAVTester/branches/users/cdaboo/better-proxy-3148:3149-3163
/CalDAVTester/branches/users/cdaboo/component-set-fixes:8221-8346
/CalDAVTester/branches/users/cdaboo/conditional-4466:4467-4469
/CalDAVTester/branches/users/cdaboo/implicitauto-2948:2949-2989
/CalDAVTester/branches/users/cdaboo/location-partial-accept-3574:3575-3581
/CalDAVTester/branches/users/cdaboo/normalize-cuaddr-3533:3534-3558
/CalDAVTester/branches/users/cdaboo/pycalendar:7160-7206
/CalDAVTester/branches/users/cdaboo/pycard:7226-7237
/CalDAVTester/branches/users/cdaboo/sharing-5228:5229-5440
/CalDAVTester/trunk:9986-10136

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-All
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-All	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-All	2012-12-07 21:01:33 UTC (rev 10138)
@@ -20,7 +20,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
     CalDAV/caldavIOP.xml \
     CalDAV/errors.xml \
     CalDAV/get.xml \

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CalDAV
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CalDAV	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CalDAV	2012-12-07 21:01:33 UTC (rev 10138)
@@ -20,7 +20,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
 	CalDAV/caldavIOP.xml \
 	CalDAV/errors.xml \
 	CalDAV/get.xml \

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CardDAV
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CardDAV	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/QuickLook-CardDAV	2012-12-07 21:01:33 UTC (rev 10138)
@@ -20,7 +20,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml \
 	CardDAV/ab-client.xml \
 	CardDAV/errors.xml \
 	CardDAV/get.xml \

Deleted: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics
===================================================================
--- CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/GB.ics	2012-12-07 19:20:46 UTC (rev 10136)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -1,291 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//calendarserver.org//Zonal//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:GB
-X-LIC-LOCATION:GB
-BEGIN:STANDARD
-DTSTART:18471201T000000
-RDATE:18471201T000000
-TZNAME:S
-TZOFFSETFROM:-000115
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19160521T020000
-RDATE:19160521T020000
-RDATE:19170408T020000
-RDATE:19180324T020000
-RDATE:19190330T020000
-RDATE:19200328T020000
-RDATE:19210403T020000
-RDATE:19220326T020000
-RDATE:19230422T020000
-RDATE:19240413T020000
-RDATE:19270410T020000
-RDATE:19300413T020000
-RDATE:19330409T020000
-RDATE:19340422T020000
-RDATE:19350414T020000
-RDATE:19380410T020000
-RDATE:19390416T020000
-RDATE:19400225T020000
-RDATE:19460414T020000
-RDATE:19470316T020000
-RDATE:19480314T020000
-RDATE:19490403T020000
-RDATE:19530419T020000
-RDATE:19540411T020000
-RDATE:19570414T020000
-RDATE:19600410T020000
-RDATE:19680218T020000
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19161001T030000
-RDATE:19161001T030000
-RDATE:19170917T030000
-RDATE:19180930T030000
-RDATE:19190929T030000
-RDATE:19201025T030000
-RDATE:19211003T030000
-RDATE:19221008T030000
-RDATE:19391119T030000
-RDATE:19471102T030000
-RDATE:19481031T030000
-RDATE:19491030T030000
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19230916T030000
-RRULE:FREQ=YEARLY;UNTIL=19240921T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=9
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19250419T020000
-RRULE:FREQ=YEARLY;UNTIL=19260418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19251004T030000
-RRULE:FREQ=YEARLY;UNTIL=19381002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19280422T020000
-RRULE:FREQ=YEARLY;UNTIL=19290421T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19310419T020000
-RRULE:FREQ=YEARLY;UNTIL=19320417T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19360419T020000
-RRULE:FREQ=YEARLY;UNTIL=19370418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19410504T020000
-RDATE:19410504T020000
-RDATE:19450402T020000
-RDATE:19470413T020000
-TZNAME:BDST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19410810T030000
-RRULE:FREQ=YEARLY;UNTIL=19430815T010000Z;BYDAY=SU;BYMONTHDAY=9,10,11,12,13
- ,14,15;BYMONTH=8
-TZNAME:BST
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19420405T020000
-RRULE:FREQ=YEARLY;UNTIL=19440402T010000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=4
-TZNAME:BDST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19440917T030000
-RDATE:19440917T030000
-RDATE:19450715T030000
-RDATE:19470810T030000
-TZNAME:BST
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19451007T030000
-RRULE:FREQ=YEARLY;UNTIL=19461006T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500416T020000
-RRULE:FREQ=YEARLY;UNTIL=19520420T020000Z;BYDAY=SU;BYMONTHDAY=14,15,16,17,1
- 8,19,20;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19501022T030000
-RRULE:FREQ=YEARLY;UNTIL=19521026T020000Z;BYDAY=SU;BYMONTHDAY=21,22,23,24,2
- 5,26,27;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19531004T030000
-RRULE:FREQ=YEARLY;UNTIL=19601002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19550417T020000
-RRULE:FREQ=YEARLY;UNTIL=19560422T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19580420T020000
-RRULE:FREQ=YEARLY;UNTIL=19590419T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19610326T020000
-RRULE:FREQ=YEARLY;UNTIL=19630331T020000Z;BYDAY=-1SU;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19611029T030000
-RRULE:FREQ=YEARLY;UNTIL=19671029T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19640322T020000
-RRULE:FREQ=YEARLY;UNTIL=19670319T020000Z;BYDAY=SU;BYMONTHDAY=19,20,21,22,2
- 3,24,25;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19681027T000000
-RDATE:19681027T000000
-TZNAME:BST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0100
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19711031T030000
-RDATE:19711031T030000
-TZNAME:S
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19720319T020000
-RRULE:FREQ=YEARLY;UNTIL=19800316T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19721029T030000
-RRULE:FREQ=YEARLY;UNTIL=19801026T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19810329T010000
-RRULE:FREQ=YEARLY;UNTIL=19950326T010000Z;BYDAY=-1SU;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19811025T020000
-RRULE:FREQ=YEARLY;UNTIL=19891029T010000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19901028T020000
-RRULE:FREQ=YEARLY;UNTIL=19951022T010000Z;BYDAY=4SU;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19960101T000000
-RDATE:19960101T000000
-TZNAME:GMT/BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19960331T010000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
-TZNAME:GMT/BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19961027T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZNAME:GMT/BST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-END:VTIMEZONE
-END:VCALENDAR

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics (from rev 10136, CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/GB.ics)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/GB.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,291 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//calendarserver.org//Zonal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:GB
+X-LIC-LOCATION:GB
+BEGIN:STANDARD
+DTSTART:18471201T000000
+RDATE:18471201T000000
+TZNAME:S
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19270410T020000
+RDATE:19300413T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19570414T020000
+RDATE:19600410T020000
+RDATE:19680218T020000
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19391119T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19230916T030000
+RRULE:FREQ=YEARLY;UNTIL=19240921T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=9
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19250419T020000
+RRULE:FREQ=YEARLY;UNTIL=19260418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19251004T030000
+RRULE:FREQ=YEARLY;UNTIL=19381002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19280422T020000
+RRULE:FREQ=YEARLY;UNTIL=19290421T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19310419T020000
+RRULE:FREQ=YEARLY;UNTIL=19320417T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19360419T020000
+RRULE:FREQ=YEARLY;UNTIL=19370418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+TZNAME:BDST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19410810T030000
+RRULE:FREQ=YEARLY;UNTIL=19430815T010000Z;BYDAY=SU;BYMONTHDAY=9,10,11,12,13
+ ,14,15;BYMONTH=8
+TZNAME:BST
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19420405T020000
+RRULE:FREQ=YEARLY;UNTIL=19440402T010000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=4
+TZNAME:BDST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19440917T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+TZNAME:BST
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19451007T030000
+RRULE:FREQ=YEARLY;UNTIL=19461006T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500416T020000
+RRULE:FREQ=YEARLY;UNTIL=19520420T020000Z;BYDAY=SU;BYMONTHDAY=14,15,16,17,1
+ 8,19,20;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19501022T030000
+RRULE:FREQ=YEARLY;UNTIL=19521026T020000Z;BYDAY=SU;BYMONTHDAY=21,22,23,24,2
+ 5,26,27;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19531004T030000
+RRULE:FREQ=YEARLY;UNTIL=19601002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19550417T020000
+RRULE:FREQ=YEARLY;UNTIL=19560422T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19580420T020000
+RRULE:FREQ=YEARLY;UNTIL=19590419T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19610326T020000
+RRULE:FREQ=YEARLY;UNTIL=19630331T020000Z;BYDAY=-1SU;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19611029T030000
+RRULE:FREQ=YEARLY;UNTIL=19671029T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19640322T020000
+RRULE:FREQ=YEARLY;UNTIL=19670319T020000Z;BYDAY=SU;BYMONTHDAY=19,20,21,22,2
+ 3,24,25;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19681027T000000
+RDATE:19681027T000000
+TZNAME:BST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19711031T030000
+RDATE:19711031T030000
+TZNAME:S
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19720319T020000
+RRULE:FREQ=YEARLY;UNTIL=19800316T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19721029T030000
+RRULE:FREQ=YEARLY;UNTIL=19801026T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;UNTIL=19950326T010000Z;BYDAY=-1SU;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19811025T020000
+RRULE:FREQ=YEARLY;UNTIL=19891029T010000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19901028T020000
+RRULE:FREQ=YEARLY;UNTIL=19951022T010000Z;BYDAY=4SU;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19960101T000000
+RDATE:19960101T000000
+TZNAME:GMT/BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19960331T010000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+TZNAME:GMT/BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:GMT/BST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR

Deleted: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics
===================================================================
--- CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/London.ics	2012-12-07 19:20:46 UTC (rev 10136)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -1,291 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//calendarserver.org//Zonal//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:Europe/London
-X-LIC-LOCATION:Europe/London
-BEGIN:STANDARD
-DTSTART:18471201T000000
-RDATE:18471201T000000
-TZNAME:S
-TZOFFSETFROM:-000115
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19160521T020000
-RDATE:19160521T020000
-RDATE:19170408T020000
-RDATE:19180324T020000
-RDATE:19190330T020000
-RDATE:19200328T020000
-RDATE:19210403T020000
-RDATE:19220326T020000
-RDATE:19230422T020000
-RDATE:19240413T020000
-RDATE:19270410T020000
-RDATE:19300413T020000
-RDATE:19330409T020000
-RDATE:19340422T020000
-RDATE:19350414T020000
-RDATE:19380410T020000
-RDATE:19390416T020000
-RDATE:19400225T020000
-RDATE:19460414T020000
-RDATE:19470316T020000
-RDATE:19480314T020000
-RDATE:19490403T020000
-RDATE:19530419T020000
-RDATE:19540411T020000
-RDATE:19570414T020000
-RDATE:19600410T020000
-RDATE:19680218T020000
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19161001T030000
-RDATE:19161001T030000
-RDATE:19170917T030000
-RDATE:19180930T030000
-RDATE:19190929T030000
-RDATE:19201025T030000
-RDATE:19211003T030000
-RDATE:19221008T030000
-RDATE:19391119T030000
-RDATE:19471102T030000
-RDATE:19481031T030000
-RDATE:19491030T030000
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19230916T030000
-RRULE:FREQ=YEARLY;UNTIL=19240921T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=9
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19250419T020000
-RRULE:FREQ=YEARLY;UNTIL=19260418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19251004T030000
-RRULE:FREQ=YEARLY;UNTIL=19381002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19280422T020000
-RRULE:FREQ=YEARLY;UNTIL=19290421T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19310419T020000
-RRULE:FREQ=YEARLY;UNTIL=19320417T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19360419T020000
-RRULE:FREQ=YEARLY;UNTIL=19370418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19410504T020000
-RDATE:19410504T020000
-RDATE:19450402T020000
-RDATE:19470413T020000
-TZNAME:BDST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19410810T030000
-RRULE:FREQ=YEARLY;UNTIL=19430815T010000Z;BYDAY=SU;BYMONTHDAY=9,10,11,12,13
- ,14,15;BYMONTH=8
-TZNAME:BST
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19420405T020000
-RRULE:FREQ=YEARLY;UNTIL=19440402T010000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=4
-TZNAME:BDST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19440917T030000
-RDATE:19440917T030000
-RDATE:19450715T030000
-RDATE:19470810T030000
-TZNAME:BST
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19451007T030000
-RRULE:FREQ=YEARLY;UNTIL=19461006T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500416T020000
-RRULE:FREQ=YEARLY;UNTIL=19520420T020000Z;BYDAY=SU;BYMONTHDAY=14,15,16,17,1
- 8,19,20;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19501022T030000
-RRULE:FREQ=YEARLY;UNTIL=19521026T020000Z;BYDAY=SU;BYMONTHDAY=21,22,23,24,2
- 5,26,27;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19531004T030000
-RRULE:FREQ=YEARLY;UNTIL=19601002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
- ;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19550417T020000
-RRULE:FREQ=YEARLY;UNTIL=19560422T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19580420T020000
-RRULE:FREQ=YEARLY;UNTIL=19590419T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=4
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19610326T020000
-RRULE:FREQ=YEARLY;UNTIL=19630331T020000Z;BYDAY=-1SU;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19611029T030000
-RRULE:FREQ=YEARLY;UNTIL=19671029T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19640322T020000
-RRULE:FREQ=YEARLY;UNTIL=19670319T020000Z;BYDAY=SU;BYMONTHDAY=19,20,21,22,2
- 3,24,25;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19681027T000000
-RDATE:19681027T000000
-TZNAME:BST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0100
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19711031T030000
-RDATE:19711031T030000
-TZNAME:S
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19720319T020000
-RRULE:FREQ=YEARLY;UNTIL=19800316T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
- 0,21,22;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19721029T030000
-RRULE:FREQ=YEARLY;UNTIL=19801026T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19810329T010000
-RRULE:FREQ=YEARLY;UNTIL=19950326T010000Z;BYDAY=-1SU;BYMONTH=3
-TZNAME:BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19811025T020000
-RRULE:FREQ=YEARLY;UNTIL=19891029T010000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
- 7,28,29;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19901028T020000
-RRULE:FREQ=YEARLY;UNTIL=19951022T010000Z;BYDAY=4SU;BYMONTH=10
-TZNAME:GMT
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19960101T000000
-RDATE:19960101T000000
-TZNAME:GMT/BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0000
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19960331T010000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
-TZNAME:GMT/BST
-TZOFFSETFROM:+0000
-TZOFFSETTO:+0100
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19961027T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZNAME:GMT/BST
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0000
-END:STANDARD
-END:VTIMEZONE
-END:VCALENDAR

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics (from rev 10136, CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/London.ics)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/London.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,291 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//calendarserver.org//Zonal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Europe/London
+X-LIC-LOCATION:Europe/London
+BEGIN:STANDARD
+DTSTART:18471201T000000
+RDATE:18471201T000000
+TZNAME:S
+TZOFFSETFROM:-000115
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19160521T020000
+RDATE:19160521T020000
+RDATE:19170408T020000
+RDATE:19180324T020000
+RDATE:19190330T020000
+RDATE:19200328T020000
+RDATE:19210403T020000
+RDATE:19220326T020000
+RDATE:19230422T020000
+RDATE:19240413T020000
+RDATE:19270410T020000
+RDATE:19300413T020000
+RDATE:19330409T020000
+RDATE:19340422T020000
+RDATE:19350414T020000
+RDATE:19380410T020000
+RDATE:19390416T020000
+RDATE:19400225T020000
+RDATE:19460414T020000
+RDATE:19470316T020000
+RDATE:19480314T020000
+RDATE:19490403T020000
+RDATE:19530419T020000
+RDATE:19540411T020000
+RDATE:19570414T020000
+RDATE:19600410T020000
+RDATE:19680218T020000
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19161001T030000
+RDATE:19161001T030000
+RDATE:19170917T030000
+RDATE:19180930T030000
+RDATE:19190929T030000
+RDATE:19201025T030000
+RDATE:19211003T030000
+RDATE:19221008T030000
+RDATE:19391119T030000
+RDATE:19471102T030000
+RDATE:19481031T030000
+RDATE:19491030T030000
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19230916T030000
+RRULE:FREQ=YEARLY;UNTIL=19240921T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=9
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19250419T020000
+RRULE:FREQ=YEARLY;UNTIL=19260418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19251004T030000
+RRULE:FREQ=YEARLY;UNTIL=19381002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19280422T020000
+RRULE:FREQ=YEARLY;UNTIL=19290421T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19310419T020000
+RRULE:FREQ=YEARLY;UNTIL=19320417T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19360419T020000
+RRULE:FREQ=YEARLY;UNTIL=19370418T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19410504T020000
+RDATE:19410504T020000
+RDATE:19450402T020000
+RDATE:19470413T020000
+TZNAME:BDST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19410810T030000
+RRULE:FREQ=YEARLY;UNTIL=19430815T010000Z;BYDAY=SU;BYMONTHDAY=9,10,11,12,13
+ ,14,15;BYMONTH=8
+TZNAME:BST
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19420405T020000
+RRULE:FREQ=YEARLY;UNTIL=19440402T010000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=4
+TZNAME:BDST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19440917T030000
+RDATE:19440917T030000
+RDATE:19450715T030000
+RDATE:19470810T030000
+TZNAME:BST
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19451007T030000
+RRULE:FREQ=YEARLY;UNTIL=19461006T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500416T020000
+RRULE:FREQ=YEARLY;UNTIL=19520420T020000Z;BYDAY=SU;BYMONTHDAY=14,15,16,17,1
+ 8,19,20;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19501022T030000
+RRULE:FREQ=YEARLY;UNTIL=19521026T020000Z;BYDAY=SU;BYMONTHDAY=21,22,23,24,2
+ 5,26,27;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19531004T030000
+RRULE:FREQ=YEARLY;UNTIL=19601002T020000Z;BYDAY=SU;BYMONTHDAY=2,3,4,5,6,7,8
+ ;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19550417T020000
+RRULE:FREQ=YEARLY;UNTIL=19560422T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19580420T020000
+RRULE:FREQ=YEARLY;UNTIL=19590419T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=4
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19610326T020000
+RRULE:FREQ=YEARLY;UNTIL=19630331T020000Z;BYDAY=-1SU;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19611029T030000
+RRULE:FREQ=YEARLY;UNTIL=19671029T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19640322T020000
+RRULE:FREQ=YEARLY;UNTIL=19670319T020000Z;BYDAY=SU;BYMONTHDAY=19,20,21,22,2
+ 3,24,25;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19681027T000000
+RDATE:19681027T000000
+TZNAME:BST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19711031T030000
+RDATE:19711031T030000
+TZNAME:S
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19720319T020000
+RRULE:FREQ=YEARLY;UNTIL=19800316T020000Z;BYDAY=SU;BYMONTHDAY=16,17,18,19,2
+ 0,21,22;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19721029T030000
+RRULE:FREQ=YEARLY;UNTIL=19801026T020000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19810329T010000
+RRULE:FREQ=YEARLY;UNTIL=19950326T010000Z;BYDAY=-1SU;BYMONTH=3
+TZNAME:BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19811025T020000
+RRULE:FREQ=YEARLY;UNTIL=19891029T010000Z;BYDAY=SU;BYMONTHDAY=23,24,25,26,2
+ 7,28,29;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19901028T020000
+RRULE:FREQ=YEARLY;UNTIL=19951022T010000Z;BYDAY=4SU;BYMONTH=10
+TZNAME:GMT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19960101T000000
+RDATE:19960101T000000
+TZNAME:GMT/BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19960331T010000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+TZNAME:GMT/BST
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19961027T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZNAME:GMT/BST
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR

Deleted: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics
===================================================================
--- CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/New_York.ics	2012-12-07 19:20:46 UTC (rev 10136)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -1,148 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-PRODID:-//calendarserver.org//Zonal//EN
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:America/New_York
-X-LIC-LOCATION:America/New_York
-BEGIN:STANDARD
-DTSTART:18831118T120358
-RDATE:18831118T120358
-TZNAME:EST
-TZOFFSETFROM:-045602
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19180331T020000
-RRULE:FREQ=YEARLY;UNTIL=19190330T070000Z;BYDAY=-1SU;BYMONTH=3
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19181027T020000
-RRULE:FREQ=YEARLY;UNTIL=19191026T060000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19200101T000000
-RDATE:19200101T000000
-RDATE:19420101T000000
-RDATE:19460101T000000
-RDATE:19670101T000000
-TZNAME:EST
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19200328T020000
-RDATE:19200328T020000
-RDATE:19740106T020000
-RDATE:19750223T020000
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19201031T020000
-RDATE:19201031T020000
-RDATE:19450930T020000
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19210424T020000
-RRULE:FREQ=YEARLY;UNTIL=19410427T070000Z;BYDAY=-1SU;BYMONTH=4
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19210925T020000
-RRULE:FREQ=YEARLY;UNTIL=19410928T060000Z;BYDAY=-1SU;BYMONTH=9
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19420209T020000
-RDATE:19420209T020000
-TZNAME:EWT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19450814T190000
-RDATE:19450814T190000
-TZNAME:EPT
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19460428T020000
-RRULE:FREQ=YEARLY;UNTIL=19660424T070000Z;BYDAY=-1SU;BYMONTH=4
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19460929T020000
-RRULE:FREQ=YEARLY;UNTIL=19540926T060000Z;BYDAY=-1SU;BYMONTH=9
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:STANDARD
-DTSTART:19551030T020000
-RRULE:FREQ=YEARLY;UNTIL=19661030T060000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19670430T020000
-RRULE:FREQ=YEARLY;UNTIL=19730429T070000Z;BYDAY=-1SU;BYMONTH=4
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;UNTIL=20061029T060000Z;BYDAY=-1SU;BYMONTH=10
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19760425T020000
-RRULE:FREQ=YEARLY;UNTIL=19860427T070000Z;BYDAY=-1SU;BYMONTH=4
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;UNTIL=20060402T070000Z;BYDAY=1SU;BYMONTH=4
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:20070311T020000
-RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
-TZNAME:EDT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-END:DAYLIGHT
-BEGIN:STANDARD
-DTSTART:20071104T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
-TZNAME:EST
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-END:STANDARD
-END:VTIMEZONE
-END:VCALENDAR

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics (from rev 10136, CalDAVTester/trunk/Resource/CalDAV/timezonestdservice/New_York.ics)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Resource/CalDAV/timezonestdservice/New_York.ics	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,148 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//calendarserver.org//Zonal//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:STANDARD
+DTSTART:18831118T120358
+RDATE:18831118T120358
+TZNAME:EST
+TZOFFSETFROM:-045602
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19180331T020000
+RRULE:FREQ=YEARLY;UNTIL=19190330T070000Z;BYDAY=-1SU;BYMONTH=3
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19181027T020000
+RRULE:FREQ=YEARLY;UNTIL=19191026T060000Z;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19200101T000000
+RDATE:19200101T000000
+RDATE:19420101T000000
+RDATE:19460101T000000
+RDATE:19670101T000000
+TZNAME:EST
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19200328T020000
+RDATE:19200328T020000
+RDATE:19740106T020000
+RDATE:19750223T020000
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19201031T020000
+RDATE:19201031T020000
+RDATE:19450930T020000
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19210424T020000
+RRULE:FREQ=YEARLY;UNTIL=19410427T070000Z;BYDAY=-1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19210925T020000
+RRULE:FREQ=YEARLY;UNTIL=19410928T060000Z;BYDAY=-1SU;BYMONTH=9
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19420209T020000
+RDATE:19420209T020000
+TZNAME:EWT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19450814T190000
+RDATE:19450814T190000
+TZNAME:EPT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19460428T020000
+RRULE:FREQ=YEARLY;UNTIL=19660424T070000Z;BYDAY=-1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19460929T020000
+RRULE:FREQ=YEARLY;UNTIL=19540926T060000Z;BYDAY=-1SU;BYMONTH=9
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:STANDARD
+DTSTART:19551030T020000
+RRULE:FREQ=YEARLY;UNTIL=19661030T060000Z;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19670430T020000
+RRULE:FREQ=YEARLY;UNTIL=19730429T070000Z;BYDAY=-1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;UNTIL=20061029T060000Z;BYDAY=-1SU;BYMONTH=10
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19760425T020000
+RRULE:FREQ=YEARLY;UNTIL=19860427T070000Z;BYDAY=-1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;UNTIL=20060402T070000Z;BYDAY=1SU;BYMONTH=4
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+TZNAME:EDT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+TZNAME:EST
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-All
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-All	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-All	2012-12-07 21:01:33 UTC (rev 10138)
@@ -21,7 +21,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
 	--exclude CalDAV/directory.xml \
 	--exclude CalDAV/proxyauthz.xml \
 	--exclude CalDAV/quota.xml \

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CalDAV
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CalDAV	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CalDAV	2012-12-07 21:01:33 UTC (rev 10138)
@@ -20,7 +20,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
 	--subdir CalDAV \
 	--exclude CalDAV/directory.xml \
 	--exclude CalDAV/proxyauthz.xml \

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CardDAV
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CardDAV	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/Validation-CardDAV	2012-12-07 21:01:33 UTC (rev 10138)
@@ -20,7 +20,7 @@
 #
 
 export PYTHONPATH=/usr/share/caldavd/lib/python:/Applications/Server.app/Contents/ServerRoot/usr/share/caldavd/lib/python/
-./testcaldav.py $@ --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
+./testcaldav.py $@ --ssl --print-details-onfail -s scripts/server/serverinfo-caldav.xml --all \
 	--subdir CardDAV \
 	--exclude CardDAV/directory.xml \
  	

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-partitioning.xml
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-partitioning.xml	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-partitioning.xml	2012-12-07 21:01:33 UTC (rev 10138)
@@ -86,7 +86,8 @@
 		<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 -->
+		<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 -->
 
@@ -286,6 +287,12 @@
 			<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>

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-template.xml
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-template.xml	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo-template.xml	2012-12-07 21:01:33 UTC (rev 10138)
@@ -86,7 +86,8 @@
 		<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 -->
+		<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 -->
 
@@ -286,6 +287,12 @@
 			<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>

Modified: CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo.xml
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo.xml	2012-12-07 20:05:11 UTC (rev 10137)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/server/serverinfo.xml	2012-12-07 21:01:33 UTC (rev 10138)
@@ -86,7 +86,8 @@
 		<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 -->
+		<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 -->
 
@@ -286,6 +287,12 @@
 			<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>

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/tests/CalDAV/timezonestdservice.xml (from rev 10136, CalDAVTester/trunk/scripts/tests/CalDAV/timezonestdservice.xml)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/tests/CalDAV/timezonestdservice.xml	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/scripts/tests/CalDAV/timezonestdservice.xml	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,975 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd">
+
+<!--
+ Copyright (c) 2006-2012 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 standard timezone service</description>
+
+	<require-feature>
+		<feature>caldav</feature>
+		<feature>timezone-std-service</feature>
+	</require-feature>
+
+	<start/>
+	
+	<test-suite name='Non-query GET/POST'>
+		<test name='1'>
+			<description>GET on well-known resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>/.well-known/timezone</ruri>
+				<verify>
+					<callback>statusCode</callback>
+					<arg>
+						<name>status</name>
+						<value>301</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+
+	<test-suite name='Non-query GET/POST'>
+		<test name='1'>
+			<description>GET on resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>PROPFIND on resource</description>
+			<request>
+				<method>PROPFIND</method>
+				<ruri>$timezonestdservice:</ruri>
+				<header>
+					<name>Depth</name>
+					<value>0</value>
+				</header>
+				<data>
+					<content-type>text/calendar; charset=utf-8</content-type>
+					<filepath>Resource/CalDAV/propfinds/1.txt</filepath>
+				</data>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>POST on resource</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>PUT on resource - fails</description>
+			<request>
+				<method>PUT</method>
+				<ruri>$timezonestdservice:</ruri>
+				<data>
+					<content-type>text/calendar; charset=utf-8</content-type>
+					<filepath>Resource/CalDAV/recurrenceput/1.txt</filepath>
+				</data>
+				<verify>
+					<callback>statusCode</callback>
+					<arg>
+						<name>status</name>
+						<value>403</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>DELETE on resource - fails</description>
+			<request>
+				<method>DELETE</method>
+				<ruri>$timezonestdservice:</ruri>
+				<verify>
+					<callback>statusCode</callback>
+					<arg>
+						<name>status</name>
+						<value>403</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+	
+	<test-suite name='Query bogus parameters'>
+		<test name='1'>
+			<description>GET on resource - invalid parameter</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?query=true</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource - invalid parameter</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?query=true</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>GET on resource - invalid action</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=true</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>POST on resource - invalid action</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=true</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>GET on resource - multiple actions</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=list&amp;action=list</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='6'>
+			<description>POST on resource - multiple methods</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=list&amp;action=list</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-action</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+	
+	<test-suite name='Query method=list'>
+		<test name='1'>
+			<description>GET on resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=list</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/timezones/./tzid~$America/New_York</value>
+						<value>/timezones/./tzid~$America/Phoenix</value>
+						<value>/timezones/./aliases/.~$GB</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=list</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/timezones/./tzid~$America/New_York</value>
+						<value>/timezones/./tzid~$America/Phoenix</value>
+						<value>/timezones/./aliases/.~$GB</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+	
+	<test-suite name='Invalid query action=get'>
+		<test name='1'>
+			<description>GET on resource - no tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource - no tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>GET on resource - multiple tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/New_York&amp;tzid=America/Los_Angeles</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>POST on resource - multiple tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/New_York&amp;tzid=America/Los_Angeles</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>GET on resource - invalid tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/Pittsburgh</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>404</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$missing-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='6'>
+			<description>POST on resource - invalid tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/Pittsburgh</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>404</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$missing-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+	
+	<test-suite name='Query action=get'>
+		<test name='1'>
+			<description>GET on resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/New_York</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/New_York.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=America/New_York</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/New_York.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>GET on resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=Europe/London</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/London.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>POST on resource</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=Europe/London</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/London.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>GET on resource</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=GB</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/GB.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='6'>
+			<description>POST on resource</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=get&amp;tzid=GB</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>calendarDataMatch</callback>
+					<arg>
+						<name>filepath</name>
+						<value>Resource/CalDAV/timezonestdservice/GB.ics</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+	
+	<test-suite name='Invalid query action=expand'>
+		<test name='1'>
+			<description>GET on resource - no tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource - no tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>GET on resource - multiple tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;tzid=America/Los_Angeles</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>POST on resource - multiple tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;tzid=America/Los_Angeles</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>GET on resource - invalid tzid</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/Pittsburgh</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>404</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$missing-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='6'>
+			<description>POST on resource - invalid tzid</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/Pittsburgh</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>404</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$missing-tzid</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='7'>
+			<description>GET on resource - too many start</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;start=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-start</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='8'>
+			<description>POST on resource - too many start</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;start=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-start</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='9'>
+			<description>GET on resource - invalid start</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=2007</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-start</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='10'>
+			<description>POST on resource - invalid start</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=2007</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-start</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='11'>
+			<description>GET on resource - too many end</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20090101&amp;end=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='12'>
+			<description>POST on resource - too many end</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20090101&amp;end=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='13'>
+			<description>GET on resource - invalid end</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=2009</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='14'>
+			<description>POST on resource - invalid end</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=2009</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='15'>
+			<description>GET on resource - start > end</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20090101&amp;end=20080101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='16'>
+			<description>POST on resource - start > end</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20090101&amp;end=20080101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='17'>
+			<description>GET on resource - start == end</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20080101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='18'>
+			<description>POST on resource - start == end</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20080101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>status</name>
+						<value>400</value>
+					</arg>
+					<arg>
+						<name>exists</name>
+						<value>/error~$invalid-end</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+
+	<test-suite name="Expand">
+		<test name='1'>
+			<description>GET on resource - simple range</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/observances/./onset~$2008-01-01T00:00:00</value>
+						<value>/observances/./onset~$2008-03-09T02:00:00</value>
+						<value>/observances/./onset~$2008-11-02T02:00:00</value>
+						<value>/observances/./utc-offset-from~$-18000</value>
+						<value>/observances/./utc-offset-to~$-18000</value>
+						<value>/observances/./utc-offset-from~$-14400</value>
+						<value>/observances/./utc-offset-to~$-14400</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='2'>
+			<description>POST on resource - simple range</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/observances/./onset~$2008-01-01T00:00:00</value>
+						<value>/observances/./onset~$2008-03-09T02:00:00</value>
+						<value>/observances/./onset~$2008-11-02T02:00:00</value>
+						<value>/observances/./utc-offset-from~$-18000</value>
+						<value>/observances/./utc-offset-to~$-18000</value>
+						<value>/observances/./utc-offset-from~$-14400</value>
+						<value>/observances/./utc-offset-to~$-14400</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='3'>
+			<description>GET on resource - complex range</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20060101&amp;end=20080101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/observances/./onset~$2006-01-01T00:00:00</value>
+						<value>/observances/./onset~$2006-04-02T02:00:00</value>
+						<value>/observances/./onset~$2006-10-29T02:00:00</value>
+						<value>/observances/./onset~$2007-03-11T02:00:00</value>
+						<value>/observances/./onset~$2007-11-04T02:00:00</value>
+						<value>/observances/./utc-offset-from~$-18000</value>
+						<value>/observances/./utc-offset-to~$-18000</value>
+						<value>/observances/./utc-offset-from~$-14400</value>
+						<value>/observances/./utc-offset-to~$-14400</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='4'>
+			<description>POST on resource - complex range</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/New_York&amp;start=20060101&amp;end=20080101</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/observances/./onset~$2006-01-01T00:00:00</value>
+						<value>/observances/./onset~$2006-04-02T02:00:00</value>
+						<value>/observances/./onset~$2006-10-29T02:00:00</value>
+						<value>/observances/./onset~$2007-03-11T02:00:00</value>
+						<value>/observances/./onset~$2007-11-04T02:00:00</value>
+						<value>/observances/./utc-offset-from~$-18000</value>
+						<value>/observances/./utc-offset-to~$-18000</value>
+						<value>/observances/./utc-offset-from~$-14400</value>
+						<value>/observances/./utc-offset-to~$-14400</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='5'>
+			<description>GET on resource - no DST</description>
+			<request>
+				<method>GET</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/Phoenix&amp;start=20060101&amp;end=20090101</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>dataString</callback>
+					<arg>
+						<name>contains</name>
+						<value>2006-01-01T00:00:00</value>
+						<value>-25200</value>
+					</arg>
+					<arg>
+						<name>notcontains</name>
+						<value>2007</value>
+						<value>2008</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='6'>
+			<description>POST on resource - start == end</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:?action=expand&amp;tzid=America/Phoenix&amp;start=20060101&amp;end=20090101</ruri>
+				<verify>
+					<callback>statusCode</callback>
+				</verify>
+				<verify>
+					<callback>dataString</callback>
+					<arg>
+						<name>contains</name>
+						<value>2006-01-01T00:00:00</value>
+						<value>-25200</value>
+					</arg>
+					<arg>
+						<name>notcontains</name>
+						<value>2007</value>
+						<value>2008</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+		<test name='7'>
+			<description>POST on resource trailing slash - simple range</description>
+			<request>
+				<method>POST</method>
+				<ruri>$timezonestdservice:/?action=expand&amp;tzid=America/New_York&amp;start=20080101&amp;end=20090101</ruri>
+				<verify>
+					<callback>jsonPointerMatch</callback>
+					<arg>
+						<name>exists</name>
+						<value>/dtstamp</value>
+						<value>/observances/./onset~$2008-01-01T00:00:00</value>
+						<value>/observances/./onset~$2008-03-09T02:00:00</value>
+						<value>/observances/./onset~$2008-11-02T02:00:00</value>
+						<value>/observances/./utc-offset-from~$-18000</value>
+						<value>/observances/./utc-offset-to~$-18000</value>
+						<value>/observances/./utc-offset-from~$-14400</value>
+						<value>/observances/./utc-offset-to~$-14400</value>
+					</arg>
+				</verify>
+			</request>
+		</test>
+	</test-suite>
+
+	<end/>
+	
+</caldavtest>

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/src/jsonPointer.py (from rev 10136, CalDAVTester/trunk/src/jsonPointer.py)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/src/jsonPointer.py	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/src/jsonPointer.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,171 @@
+##
+# Copyright (c) 2012 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.
+##
+
+import json
+
+
+class JSONPointerMatchError(Exception):
+    """
+    Exception for failed pointer matches
+    """
+    pass
+
+
+
+class JSONPointer(object):
+    """
+    Represents a JSON Pointer that can match a specific JSON object.
+    """
+
+    def __init__(self, pointer):
+
+        if not pointer or pointer[0] != "/":
+            raise ValueError("Invalid JSON pointer: %s" % (pointer,))
+        self.segments = self._splitSegments(pointer)
+
+
+    def _splitSegments(self, pointer):
+        """
+        Split a pointer up into segments.
+
+        @param pointer: the pointer
+        @type pointer: C{str}
+
+        @return: list of segments
+        @rtype C{list}
+        """
+        splits = pointer[1:].split("/")
+        if splits == [""]:
+            return None
+        if any(map(lambda x: len(x) == 0, splits)):
+            raise TypeError("Pointer segment is empty: %s" % (pointer,))
+        return map(self._unescape, splits)
+
+
+    def _unescape(self, segment):
+        """
+        Unescape ~0 and ~1 in a path segment.
+
+        @param segment: the segment to unescape
+        @type segment: C{str}
+
+        @return: the unescaped segment
+        @rtype: C{str}
+        """
+        return segment.replace("~1", "/").replace("~0", "~")
+
+
+    def matchs(self, s):
+        """
+        Match this pointer against the string representation of a JSON object.
+
+        @param s: a string representation of a JSON object
+        @type s: C{str}
+        """
+
+        return self.match(json.loads(s))
+
+
+    def match(self, j):
+        """
+        Match this pointer against the JSON object.
+
+        @param j: a JSON object
+        @type j: C{dict} or C{list}
+        """
+
+        try:
+            return self.walk(j, self.segments)
+        except Exception:
+            raise JSONPointerMatchError
+
+
+    def walk(self, j, segments):
+        """
+        Recursively match the next portion of a pointer segment.
+
+        @param j: JSON object to match
+        @type j: C{dict} or C{list}
+        @param segments: list of pointer segments
+        @type segments: C{list}
+        """
+
+        if not segments:
+            return j
+
+        if isinstance(j, dict):
+            return self.walk(j[segments[0]], segments[1:])
+        elif isinstance(j, list):
+            index = -1 if segments[0] == "-" else int(segments[0])
+            return self.walk(j[index], segments[1:])
+        else:
+            raise JSONPointerMatchError
+
+
+
+class JSONMatcher(JSONPointer):
+    """
+    Represents a JSON pointer with syntax allowing a match against multiple JSON objects. If any
+    segment of a path is a single ".", then all object or array members are matched. The result of
+    the match is the array of objects that match. Missing keys and index past the end are ignored.
+    """
+
+    def __init__(self, pointer):
+
+        if not pointer or pointer[0] != "/":
+            raise ValueError("Invalid JSON pointer: %s" % (pointer,))
+        self.segments = self._splitSegments(pointer)
+
+
+    def walk(self, j, segments):
+        """
+        Recursively match the next portion of a pointer segment, talking wildcard "."
+        segment matching into account.
+
+        @param j: JSON object to match
+        @type j: C{dict} or C{list}
+        @param segments: list of pointer segments
+        @type segments: C{list}
+        """
+
+        if not segments:
+            return [j, ]
+
+        results = []
+        if isinstance(j, dict):
+            if segments[0] == ".":
+                keys = j.keys()
+            else:
+                keys = [segments[0]]
+            for k in keys:
+                try:
+                    results.extend(self.walk(j[k], segments[1:]))
+                except KeyError:
+                    pass
+        elif isinstance(j, list):
+            if segments[0] == ".":
+                r = range(len(j))
+            else:
+                r = [-1 if segments[0] == "-" else int(segments[0])]
+            for index in r:
+                try:
+                    results.extend(self.walk(j[index], segments[1:]))
+                except IndexError:
+                    pass
+        else:
+            raise JSONPointerMatchError
+
+        return results

Deleted: CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py
===================================================================
--- CalDAVTester/trunk/src/unittest/__init__.py	2012-12-07 19:20:46 UTC (rev 10136)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -1,15 +0,0 @@
-##
-# Copyright (c) 2012 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.
-##

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py (from rev 10136, CalDAVTester/trunk/src/unittest/__init__.py)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/__init__.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,15 @@
+##
+# Copyright (c) 2012 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.
+##

Deleted: CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py
===================================================================
--- CalDAVTester/trunk/src/unittest/test_jsonPointer.py	2012-12-07 19:20:46 UTC (rev 10136)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -1,260 +0,0 @@
-##
-#    Copyright (c) 2012 Cyrus Daboo. 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.
-##
-
-import unittest
-from src.jsonPointer import JSONPointer, JSONPointerMatchError, JSONMatcher
-
-class TestJSONPointer(unittest.TestCase):
-
-    def testValidPointers(self):
-        data = (
-            (None, False),
-            ("", False),
-            (1, False),
-            ("/", True),
-            ("//", False),
-            ("/abc", True),
-            ("/abc/", False),
-        )
-
-        for pointer, result in data:
-            try:
-                JSONPointer(pointer)
-                ok = True
-            except (ValueError, TypeError):
-                ok = False
-            self.assertEqual(ok, result, "Failed test: %s" % (pointer,))
-
-
-    def testUnescape(self):
-        data = (
-            ("/", None),
-            ("/~0", ["~", ]),
-            ("/abc~1def", ["abc/def", ]),
-            ("/abc/~0~1a", ["abc", "~/a", ]),
-            ("/~0ab~1c/~0~1a", ["~ab/c", "~/a", ]),
-        )
-
-        for pointer, result in data:
-            j = JSONPointer(pointer)
-            self.assertEqual(j.segments, result, "Failed test: %s" % (pointer,))
-
-
-    def testMatchOK(self):
-        data = (
-            # Objects
-            ("/", '{"1": "foo"}', {"1": "foo"}),
-            ("/1", '{"1": "foo", "2": "bar"}', "foo"),
-            ("/2", '{"1": "foo", "2": "bar"}', "bar"),
-            ("/1", '{"1": {"1.1": "foo"}}', {"1.1": "foo"}),
-            ("/1/1.1", '{"1": {"1.1": "foo", "1.2": "bar"}}', "foo"),
-            ("/1/1.2", '{"1": {"1.1": "foo", "1.2": "bar"}}', "bar"),
-
-            # Arrays
-            ("/", '["1", "2"]', ["1", "2"]),
-            ("/0", '["1", "2"]', "1"),
-            ("/1", '["1", "2"]', "2"),
-            ("/-", '["1", "2"]', "2"),
-            ("/0", '[["1", "2"]]', ["1", "2"]),
-            ("/-", '[["1", "2"]]', ["1", "2"]),
-            ("/0/0", '[["1", "2"]]', "1"),
-            ("/0/1", '[["1", "2"]]', "2"),
-            ("/0/-", '[["1", "2"]]', "2"),
-
-            # Both
-            ("/", '{"1": ["foo", "bar"]}', {"1": ["foo", "bar"]}),
-            ("/1", '{"1": ["foo", "bar"]}', ["foo", "bar"]),
-            ("/1/0", '{"1": ["foo", "bar"]}', "foo"),
-            ("/1/1", '{"1": ["foo", "bar"]}', "bar"),
-            ("/1/-", '{"1": ["foo", "bar"]}', "bar"),
-            ("/", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
-            ("/0", '[{"1.1": "foo", "1.2": "bar"}]', {"1.1": "foo", "1.2": "bar"}),
-            ("/-", '[{"1.1": "foo", "1.2": "bar"}]', {"1.1": "foo", "1.2": "bar"}),
-            ("/0/1.1", '[{"1.1": "foo", "1.2": "bar"}]', "foo"),
-            ("/0/1.2", '[{"1.1": "foo", "1.2": "bar"}]', "bar"),
-        )
-
-        for pointer, jobj, result in data:
-            j = JSONPointer(pointer)
-            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))
-
-
-    def testMatchBad(self):
-        data = (
-            # Objects
-            ("/3", '{"1": "foo", "2": "bar"}'),
-            ("/a", '{"1": "foo", "2": "bar"}'),
-            ("/-", '{"1": "foo", "2": "bar"}'),
-            ("/1/3", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
-            ("/1/a", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
-            ("/1/-", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
-
-            # Arrays
-            ("/2", '["1", "2"]'),
-            ("/0/2", '[["1", "2"]]'),
-
-            # Both
-            ("/1/3", '{"1": ["foo", "bar"]}'),
-            ("/0/3", '[{"1.1": "foo", "1.2": "bar"}]'),
-            ("/0/a", '[{"1.1": "foo", "1.2": "bar"}]'),
-            ("/0/-", '[{"1.1": "foo", "1.2": "bar"}]'),
-
-            # Wrong Object
-            ("/1/0", '{"1": "foo"}'),
-            ("/1/0", '{"1": 1}'),
-            ("/1/0", '{"1": true}'),
-            ("/1/0", '{"1": null}'),
-        )
-
-        for pointer, jobj in data:
-            j = JSONPointer(pointer)
-            self.assertRaises(JSONPointerMatchError, j.matchs, jobj)
-
-
-
-class TestJSONMatcher(unittest.TestCase):
-
-    def testMatchOK(self):
-        data = (
-            # Objects
-            ("/", '{"1": "foo"}', [{"1": "foo"}]),
-            ("/1", '{"1": "foo", "2": "bar"}', ["foo"]),
-            ("/2", '{"1": "foo", "2": "bar"}', ["bar"]),
-            ("/1", '{"1": {"1.1": "foo"}}', [{"1.1": "foo"}]),
-            ("/1/1.1", '{"1": {"1.1": "foo", "1.2": "bar"}}', ["foo"]),
-            ("/1/1.2", '{"1": {"1.1": "foo", "1.2": "bar"}}', ["bar"]),
-
-            # Arrays
-            ("/", '["1", "2"]', [["1", "2"]]),
-            ("/0", '["1", "2"]', ["1"]),
-            ("/1", '["1", "2"]', ["2"]),
-            ("/-", '["1", "2"]', ["2"]),
-            ("/0", '[["1", "2"]]', [["1", "2"]]),
-            ("/-", '[["1", "2"]]', [["1", "2"]]),
-            ("/0/0", '[["1", "2"]]', ["1"]),
-            ("/0/1", '[["1", "2"]]', ["2"]),
-            ("/0/-", '[["1", "2"]]', ["2"]),
-
-            # Both
-            ("/", '{"1": ["foo", "bar"]}', [{"1": ["foo", "bar"]}]),
-            ("/1", '{"1": ["foo", "bar"]}', [["foo", "bar"]]),
-            ("/1/0", '{"1": ["foo", "bar"]}', ["foo"]),
-            ("/1/1", '{"1": ["foo", "bar"]}', ["bar"]),
-            ("/1/-", '{"1": ["foo", "bar"]}', ["bar"]),
-            ("/", '[{"1.1": "foo", "1.2": "bar"}]', [[{"1.1": "foo", "1.2": "bar"}]]),
-            ("/0", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
-            ("/-", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
-            ("/0/1.1", '[{"1.1": "foo", "1.2": "bar"}]', ["foo"]),
-            ("/0/1.2", '[{"1.1": "foo", "1.2": "bar"}]', ["bar"]),
-        )
-
-        for pointer, jobj, result in data:
-            j = JSONMatcher(pointer)
-            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))
-
-
-    def testMatchBad(self):
-        data = (
-            # Objects
-            ("/3", '{"1": "foo", "2": "bar"}', False),
-            ("/a", '{"1": "foo", "2": "bar"}', False),
-            ("/-", '{"1": "foo", "2": "bar"}', False),
-            ("/1/3", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
-            ("/1/a", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
-            ("/1/-", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
-
-            # Arrays
-            ("/2", '["1", "2"]', False),
-            ("/0/2", '[["1", "2"]]', False),
-
-            # Both
-            ("/1/3", '{"1": ["foo", "bar"]}', False),
-            ("/0/3", '[{"1.1": "foo", "1.2": "bar"}]', False),
-            ("/0/a", '[{"1.1": "foo", "1.2": "bar"}]', False),
-            ("/0/-", '[{"1.1": "foo", "1.2": "bar"}]', False),
-
-            # Wrong Object
-            ("/1/0", '{"1": "foo"}', True),
-            ("/1/0", '{"1": 1}', True),
-            ("/1/0", '{"1": true}', True),
-            ("/1/0", '{"1": null}', True),
-        )
-
-        for pointer, jobj, willRaise in data:
-            j = JSONMatcher(pointer)
-            if willRaise:
-                self.assertRaises(JSONPointerMatchError, j.matchs, jobj)
-            else:
-                self.assertEqual(j.matchs(jobj), [], "Failed test: %s" % (pointer,))
-
-
-    def testMatchingOK(self):
-        data = (
-            (
-                "/",
-                '{"1":"foo", "2": "bar"}',
-                [{"1":"foo", "2": "bar"}, ],
-            ),
-            (
-                "/.",
-                '{"1":"foo", "2": "bar"}',
-                ["foo", "bar", ],
-            ),
-            (
-                "/./0",
-                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
-                ["foo1", "bar1", ],
-            ),
-            (
-                "/./1",
-                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
-                ["foo2", "bar2", ],
-            ),
-            (
-                "/./-",
-                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
-                ["foo2", "bar2", ],
-            ),
-            (
-                "/./2",
-                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
-                [],
-            ),
-            (
-                "/./foo1",
-                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
-                ["bar1", "bar3", ],
-            ),
-            (
-                "/./foo2",
-                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
-                ["bar2", ],
-            ),
-            (
-                "/./foo4",
-                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
-                ["bar4", ],
-            ),
-            (
-                "/./foo3",
-                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
-                [],
-            ),
-        )
-
-        for pointer, jobj, result in data:
-            j = JSONMatcher(pointer)
-            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py (from rev 10136, CalDAVTester/trunk/src/unittest/test_jsonPointer.py)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/src/unittest/test_jsonPointer.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,260 @@
+##
+#    Copyright (c) 2012 Cyrus Daboo. 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.
+##
+
+import unittest
+from src.jsonPointer import JSONPointer, JSONPointerMatchError, JSONMatcher
+
+class TestJSONPointer(unittest.TestCase):
+
+    def testValidPointers(self):
+        data = (
+            (None, False),
+            ("", False),
+            (1, False),
+            ("/", True),
+            ("//", False),
+            ("/abc", True),
+            ("/abc/", False),
+        )
+
+        for pointer, result in data:
+            try:
+                JSONPointer(pointer)
+                ok = True
+            except (ValueError, TypeError):
+                ok = False
+            self.assertEqual(ok, result, "Failed test: %s" % (pointer,))
+
+
+    def testUnescape(self):
+        data = (
+            ("/", None),
+            ("/~0", ["~", ]),
+            ("/abc~1def", ["abc/def", ]),
+            ("/abc/~0~1a", ["abc", "~/a", ]),
+            ("/~0ab~1c/~0~1a", ["~ab/c", "~/a", ]),
+        )
+
+        for pointer, result in data:
+            j = JSONPointer(pointer)
+            self.assertEqual(j.segments, result, "Failed test: %s" % (pointer,))
+
+
+    def testMatchOK(self):
+        data = (
+            # Objects
+            ("/", '{"1": "foo"}', {"1": "foo"}),
+            ("/1", '{"1": "foo", "2": "bar"}', "foo"),
+            ("/2", '{"1": "foo", "2": "bar"}', "bar"),
+            ("/1", '{"1": {"1.1": "foo"}}', {"1.1": "foo"}),
+            ("/1/1.1", '{"1": {"1.1": "foo", "1.2": "bar"}}', "foo"),
+            ("/1/1.2", '{"1": {"1.1": "foo", "1.2": "bar"}}', "bar"),
+
+            # Arrays
+            ("/", '["1", "2"]', ["1", "2"]),
+            ("/0", '["1", "2"]', "1"),
+            ("/1", '["1", "2"]', "2"),
+            ("/-", '["1", "2"]', "2"),
+            ("/0", '[["1", "2"]]', ["1", "2"]),
+            ("/-", '[["1", "2"]]', ["1", "2"]),
+            ("/0/0", '[["1", "2"]]', "1"),
+            ("/0/1", '[["1", "2"]]', "2"),
+            ("/0/-", '[["1", "2"]]', "2"),
+
+            # Both
+            ("/", '{"1": ["foo", "bar"]}', {"1": ["foo", "bar"]}),
+            ("/1", '{"1": ["foo", "bar"]}', ["foo", "bar"]),
+            ("/1/0", '{"1": ["foo", "bar"]}', "foo"),
+            ("/1/1", '{"1": ["foo", "bar"]}', "bar"),
+            ("/1/-", '{"1": ["foo", "bar"]}', "bar"),
+            ("/", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
+            ("/0", '[{"1.1": "foo", "1.2": "bar"}]', {"1.1": "foo", "1.2": "bar"}),
+            ("/-", '[{"1.1": "foo", "1.2": "bar"}]', {"1.1": "foo", "1.2": "bar"}),
+            ("/0/1.1", '[{"1.1": "foo", "1.2": "bar"}]', "foo"),
+            ("/0/1.2", '[{"1.1": "foo", "1.2": "bar"}]', "bar"),
+        )
+
+        for pointer, jobj, result in data:
+            j = JSONPointer(pointer)
+            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))
+
+
+    def testMatchBad(self):
+        data = (
+            # Objects
+            ("/3", '{"1": "foo", "2": "bar"}'),
+            ("/a", '{"1": "foo", "2": "bar"}'),
+            ("/-", '{"1": "foo", "2": "bar"}'),
+            ("/1/3", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
+            ("/1/a", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
+            ("/1/-", '{"1": {"1.1": "foo", "1.2": "bar"}}'),
+
+            # Arrays
+            ("/2", '["1", "2"]'),
+            ("/0/2", '[["1", "2"]]'),
+
+            # Both
+            ("/1/3", '{"1": ["foo", "bar"]}'),
+            ("/0/3", '[{"1.1": "foo", "1.2": "bar"}]'),
+            ("/0/a", '[{"1.1": "foo", "1.2": "bar"}]'),
+            ("/0/-", '[{"1.1": "foo", "1.2": "bar"}]'),
+
+            # Wrong Object
+            ("/1/0", '{"1": "foo"}'),
+            ("/1/0", '{"1": 1}'),
+            ("/1/0", '{"1": true}'),
+            ("/1/0", '{"1": null}'),
+        )
+
+        for pointer, jobj in data:
+            j = JSONPointer(pointer)
+            self.assertRaises(JSONPointerMatchError, j.matchs, jobj)
+
+
+
+class TestJSONMatcher(unittest.TestCase):
+
+    def testMatchOK(self):
+        data = (
+            # Objects
+            ("/", '{"1": "foo"}', [{"1": "foo"}]),
+            ("/1", '{"1": "foo", "2": "bar"}', ["foo"]),
+            ("/2", '{"1": "foo", "2": "bar"}', ["bar"]),
+            ("/1", '{"1": {"1.1": "foo"}}', [{"1.1": "foo"}]),
+            ("/1/1.1", '{"1": {"1.1": "foo", "1.2": "bar"}}', ["foo"]),
+            ("/1/1.2", '{"1": {"1.1": "foo", "1.2": "bar"}}', ["bar"]),
+
+            # Arrays
+            ("/", '["1", "2"]', [["1", "2"]]),
+            ("/0", '["1", "2"]', ["1"]),
+            ("/1", '["1", "2"]', ["2"]),
+            ("/-", '["1", "2"]', ["2"]),
+            ("/0", '[["1", "2"]]', [["1", "2"]]),
+            ("/-", '[["1", "2"]]', [["1", "2"]]),
+            ("/0/0", '[["1", "2"]]', ["1"]),
+            ("/0/1", '[["1", "2"]]', ["2"]),
+            ("/0/-", '[["1", "2"]]', ["2"]),
+
+            # Both
+            ("/", '{"1": ["foo", "bar"]}', [{"1": ["foo", "bar"]}]),
+            ("/1", '{"1": ["foo", "bar"]}', [["foo", "bar"]]),
+            ("/1/0", '{"1": ["foo", "bar"]}', ["foo"]),
+            ("/1/1", '{"1": ["foo", "bar"]}', ["bar"]),
+            ("/1/-", '{"1": ["foo", "bar"]}', ["bar"]),
+            ("/", '[{"1.1": "foo", "1.2": "bar"}]', [[{"1.1": "foo", "1.2": "bar"}]]),
+            ("/0", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
+            ("/-", '[{"1.1": "foo", "1.2": "bar"}]', [{"1.1": "foo", "1.2": "bar"}]),
+            ("/0/1.1", '[{"1.1": "foo", "1.2": "bar"}]', ["foo"]),
+            ("/0/1.2", '[{"1.1": "foo", "1.2": "bar"}]', ["bar"]),
+        )
+
+        for pointer, jobj, result in data:
+            j = JSONMatcher(pointer)
+            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))
+
+
+    def testMatchBad(self):
+        data = (
+            # Objects
+            ("/3", '{"1": "foo", "2": "bar"}', False),
+            ("/a", '{"1": "foo", "2": "bar"}', False),
+            ("/-", '{"1": "foo", "2": "bar"}', False),
+            ("/1/3", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
+            ("/1/a", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
+            ("/1/-", '{"1": {"1.1": "foo", "1.2": "bar"}}', False),
+
+            # Arrays
+            ("/2", '["1", "2"]', False),
+            ("/0/2", '[["1", "2"]]', False),
+
+            # Both
+            ("/1/3", '{"1": ["foo", "bar"]}', False),
+            ("/0/3", '[{"1.1": "foo", "1.2": "bar"}]', False),
+            ("/0/a", '[{"1.1": "foo", "1.2": "bar"}]', False),
+            ("/0/-", '[{"1.1": "foo", "1.2": "bar"}]', False),
+
+            # Wrong Object
+            ("/1/0", '{"1": "foo"}', True),
+            ("/1/0", '{"1": 1}', True),
+            ("/1/0", '{"1": true}', True),
+            ("/1/0", '{"1": null}', True),
+        )
+
+        for pointer, jobj, willRaise in data:
+            j = JSONMatcher(pointer)
+            if willRaise:
+                self.assertRaises(JSONPointerMatchError, j.matchs, jobj)
+            else:
+                self.assertEqual(j.matchs(jobj), [], "Failed test: %s" % (pointer,))
+
+
+    def testMatchingOK(self):
+        data = (
+            (
+                "/",
+                '{"1":"foo", "2": "bar"}',
+                [{"1":"foo", "2": "bar"}, ],
+            ),
+            (
+                "/.",
+                '{"1":"foo", "2": "bar"}',
+                ["foo", "bar", ],
+            ),
+            (
+                "/./0",
+                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
+                ["foo1", "bar1", ],
+            ),
+            (
+                "/./1",
+                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
+                ["foo2", "bar2", ],
+            ),
+            (
+                "/./-",
+                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
+                ["foo2", "bar2", ],
+            ),
+            (
+                "/./2",
+                '{"1":["foo1", "foo2"], "2": ["bar1", "bar2"]}',
+                [],
+            ),
+            (
+                "/./foo1",
+                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
+                ["bar1", "bar3", ],
+            ),
+            (
+                "/./foo2",
+                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
+                ["bar2", ],
+            ),
+            (
+                "/./foo4",
+                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
+                ["bar4", ],
+            ),
+            (
+                "/./foo3",
+                '{"1":{"foo1": "bar1", "foo2": "bar2"}, "2": {"foo1": "bar3", "foo4": "bar4"}}',
+                [],
+            ),
+        )
+
+        for pointer, jobj, result in data:
+            j = JSONMatcher(pointer)
+            self.assertEqual(j.matchs(jobj), result, "Failed test: %s" % (pointer,))

Copied: CalDAVTester/branches/users/cdaboo/managed-attachments/verifiers/jsonPointerMatch.py (from rev 10136, CalDAVTester/trunk/verifiers/jsonPointerMatch.py)
===================================================================
--- CalDAVTester/branches/users/cdaboo/managed-attachments/verifiers/jsonPointerMatch.py	                        (rev 0)
+++ CalDAVTester/branches/users/cdaboo/managed-attachments/verifiers/jsonPointerMatch.py	2012-12-07 21:01:33 UTC (rev 10138)
@@ -0,0 +1,103 @@
+##
+# Copyright (c) 2010 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.
+##
+
+
+"""
+Verifier that matches JSON content using extended JSON pointer syntax.
+
+JSON pointer syntax is extended as follows:
+
+1) A ~$xxx at the end will result in a test for the string "xxx" in the matching JSON object.
+2) A "." as a path segment will match any JSON object member or array item.
+"""
+
+import json
+from src.jsonPointer import JSONMatcher, JSONPointerMatchError
+
+class Verifier(object):
+
+    def verify(self, manager, uri, response, respdata, args): #@UnusedVariable
+        # Get arguments
+        statusCodes = args.get("status", ["200", ])
+        exists = args.get("exists", [])
+        notexists = args.get("notexists", [])
+
+        # status code must match
+        if str(response.status) not in statusCodes:
+            return False, "        HTTP Status Code Wrong: %d" % (response.status,)
+
+        # look for response data
+        if not respdata:
+            return False, "        No response body"
+
+        # Must be application/json
+        ct = response.msg.getheaders("content-type")
+        if ct[0] != "application/json":
+            return False, "        Wrong Content-Type: %s" % (ct,)
+
+        # Read in json
+        try:
+            j = json.loads(respdata)
+        except Exception, e:
+            return False, "        Response data is not JSON data: %s" % (e,)
+
+        def _splitPathTests(path):
+            if '[' in path:
+                return path.split('[', 1)
+            else:
+                return path, None
+
+        result = True
+        resulttxt = ""
+        for jpath in exists:
+            if jpath.find("~$") != -1:
+                path, value = jpath.split("~$")
+            else:
+                path, value = jpath, None
+            try:
+                jp = JSONMatcher(path)
+            except Exception:
+                result = False
+                resulttxt += "        Invalid JSON pointer for %s\n" % (path,)
+            else:
+                try:
+                    jobjs = jp.match(j)
+                    if not jobjs:
+                        result = False
+                        resulttxt += "        Items not returned in JSON for %s\n" % (path,)
+                    if value and value not in map(str, jobjs):
+                        result = False
+                        resulttxt += "        Item values not returned in JSON for %s\n" % (jpath,)
+                except JSONPointerMatchError:
+                    result = False
+                    resulttxt += "        Items not returned in JSON for %s\n" % (path,)
+
+        for jpath in notexists:
+            try:
+                jp = JSONMatcher(jpath)
+            except Exception:
+                result = False
+                resulttxt += "        Invalid JSON pointer for %s\n" % (jpath,)
+            else:
+                try:
+                    jp.match(j)
+                except JSONPointerMatchError:
+                    pass
+                else:
+                    resulttxt += "        Items returned in JSON for %s\n" % (jpath,)
+                    result = False
+
+        return result, resulttxt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121207/bb6a93ae/attachment-0001.html>


More information about the calendarserver-changes mailing list