[CalendarServer-changes] [14196] CalDAVTester/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Dec 4 12:45:50 PST 2014


Revision: 14196
          http://trac.calendarserver.org//changeset/14196
Author:   cdaboo at apple.com
Date:     2014-12-04 12:45:50 -0800 (Thu, 04 Dec 2014)
Log Message:
-----------
Add a --basedir option to allow running a set of tests for some completely different HTTP service. Enhance JSON pointer handling.

Modified Paths:
--------------
    CalDAVTester/trunk/README.txt
    CalDAVTester/trunk/scripts/tests/CalDAV/caldavtest.dtd
    CalDAVTester/trunk/scripts/tests/CardDAV/caldavtest.dtd
    CalDAVTester/trunk/scripts/tests-pod/CalDAV/caldavtest.dtd
    CalDAVTester/trunk/src/caldavtest.py
    CalDAVTester/trunk/src/manager.py
    CalDAVTester/trunk/src/request.py
    CalDAVTester/trunk/src/serverinfo.py
    CalDAVTester/trunk/src/xmlDefs.py
    CalDAVTester/trunk/verifiers/aclItems.py
    CalDAVTester/trunk/verifiers/addressDataMatch.py
    CalDAVTester/trunk/verifiers/calendarDataMatch.py
    CalDAVTester/trunk/verifiers/dataMatch.py
    CalDAVTester/trunk/verifiers/jsonPointerMatch.py
    CalDAVTester/trunk/verifiers/multistatusItems.py
    CalDAVTester/trunk/verifiers/propfindItems.py
    CalDAVTester/trunk/verifiers/propfindValues.py
    CalDAVTester/trunk/verifiers/xmlDataMatch.py

Modified: CalDAVTester/trunk/README.txt
===================================================================
--- CalDAVTester/trunk/README.txt	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/README.txt	2014-12-04 20:45:50 UTC (rev 14196)
@@ -15,6 +15,7 @@
 testcaldav.py \
 	[-s filename] \
 	[-x dirpath] \
+	[--basedir dirpath] \
 	[--ssl] \
 	[--all] \
 	[--random] \
@@ -33,6 +34,9 @@
 	-x : directory path for test scripts
 	(default is 'scripts/tests').
 
+	--basedir : directory path for serverinfo.xml, test/ and data/,
+		overrides -s and -x values
+
 	-p : filename specifies the file to use to populate the server with
 	data. Server data population only occurs when this option is
 	present.

Modified: CalDAVTester/trunk/scripts/tests/CalDAV/caldavtest.dtd
===================================================================
--- CalDAVTester/trunk/scripts/tests/CalDAV/caldavtest.dtd	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/scripts/tests/CalDAV/caldavtest.dtd	2014-12-04 20:45:50 UTC (rev 14196)
@@ -30,7 +30,7 @@
 	<!ELEMENT pause EMPTY>
 
 	<!ELEMENT request (require-feature?, exclude-feature?, method, ruri*, header*, data?, verify*,
-						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabcalproperty*, grabcalparameter*)>
+						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabjson*, grabcalproperty*, grabcalparameter*)>
 		<!ATTLIST request host2 (yes|no) "no"
 						 auth (yes|no) "yes"
 						 user CDATA ""
@@ -70,6 +70,8 @@
 
 		<!ELEMENT grabelement (name, parent*, variable+)>
 
+		<!ELEMENT grabjson (pointer, variable+)>
+
 		<!ELEMENT grabcalproperty (name, variable)>
 		<!ELEMENT grabcalparameter (name, variable)>
 

Modified: CalDAVTester/trunk/scripts/tests/CardDAV/caldavtest.dtd
===================================================================
--- CalDAVTester/trunk/scripts/tests/CardDAV/caldavtest.dtd	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/scripts/tests/CardDAV/caldavtest.dtd	2014-12-04 20:45:50 UTC (rev 14196)
@@ -30,7 +30,7 @@
 	<!ELEMENT pause EMPTY>
 
 	<!ELEMENT request (require-feature?, exclude-feature?, method, ruri*, header*, data?, verify*,
-						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabcalproperty*, grabcalparameter*)>
+						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabjson*, grabcalproperty*, grabcalparameter*)>
 		<!ATTLIST request host2 (yes|no) "no"
 						 auth (yes|no) "yes"
 						 user CDATA ""
@@ -70,6 +70,8 @@
 
 		<!ELEMENT grabelement (name, parent*, variable+)>
 
+		<!ELEMENT grabjson (pointer, variable+)>
+
 		<!ELEMENT grabcalproperty (name, variable)>
 		<!ELEMENT grabcalparameter (name, variable)>
 

Modified: CalDAVTester/trunk/scripts/tests-pod/CalDAV/caldavtest.dtd
===================================================================
--- CalDAVTester/trunk/scripts/tests-pod/CalDAV/caldavtest.dtd	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/scripts/tests-pod/CalDAV/caldavtest.dtd	2014-12-04 20:45:50 UTC (rev 14196)
@@ -30,7 +30,7 @@
 	<!ELEMENT pause EMPTY>
 
 	<!ELEMENT request (require-feature?, exclude-feature?, method, ruri*, header*, data?, verify*,
-						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabcalproperty*, grabcalparameter*)>
+						graburi?, grabcount?, grabheader*, grabproperty*, grabelement*, grabjson*, grabcalproperty*, grabcalparameter*)>
 		<!ATTLIST request host2 (yes|no) "no"
 						 auth (yes|no) "yes"
 						 user CDATA ""
@@ -70,6 +70,8 @@
 
 		<!ELEMENT grabelement (name, parent*, variable+)>
 
+		<!ELEMENT grabjson (pointer, variable+)>
+
 		<!ELEMENT grabcalproperty (name, variable)>
 		<!ELEMENT grabcalparameter (name, variable)>
 

Modified: CalDAVTester/trunk/src/caldavtest.py
===================================================================
--- CalDAVTester/trunk/src/caldavtest.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/src/caldavtest.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -21,6 +21,7 @@
 from cStringIO import StringIO
 from pycalendar.icalendar.calendar import Calendar
 from src.httpshandler import SmartHTTPConnection
+from src.jsonPointer import JSONMatcher
 from src.manager import manager
 from src.request import data, pause
 from src.request import request
@@ -30,6 +31,7 @@
 from xml.etree.cElementTree import ElementTree, tostring
 import commands
 import httplib
+import json
 import os
 import rfc822
 import socket
@@ -744,6 +746,20 @@
                     for variable, elementvalue in zip(variables, elementvalues):
                         self.manager.server_info.addextrasubs({variable: elementvalue.encode("utf-8") if elementvalue else ""})
 
+        if req.grabjson:
+            for pointer, variables in req.grabjson:
+                # grab the JSON value here
+                pointervalues = self.extractPointer(pointer, respdata)
+                if pointervalues == None:
+                    result = False
+                    resulttxt += "\Pointer %s was not extracted from response\n" % (pointer,)
+                elif len(variables) != len(pointervalues):
+                    result = False
+                    resulttxt += "\n%d found but expecting %d for pointer %s from response\n" % (len(pointervalues), len(variables), pointer,)
+                else:
+                    for variable, pointervalue in zip(variables, pointervalues):
+                        self.manager.server_info.addextrasubs({variable: pointervalue.encode("utf-8") if pointervalue else ""})
+
         if req.grabcalprop:
             for propname, variable in req.grabcalprop:
                 # grab the property here
@@ -950,6 +966,18 @@
             return None
 
 
+    def extractPointer(self, pointer, respdata):
+
+        jp = JSONMatcher(pointer)
+
+        try:
+            j = json.loads(respdata)
+        except:
+            return None
+
+        return jp.match(j)
+
+
     def extractCalProperty(self, propertyname, respdata):
 
         prop = self._calProperty(propertyname, respdata)

Modified: CalDAVTester/trunk/src/manager.py
===================================================================
--- CalDAVTester/trunk/src/manager.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/src/manager.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -48,6 +48,7 @@
 
     def __init__(self, text=True):
         self.server_info = serverinfo()
+        self.data_dir = None
         self.pretest = None
         self.posttest = None
         self.tests = []
@@ -210,6 +211,7 @@
     def readCommandLine(self):
         sname = "scripts/server/serverinfo.xml"
         dname = "scripts/tests"
+        basedir = None
         fnames = []
         ssl = False
         all = False
@@ -226,6 +228,7 @@
             [
                 "ssl",
                 "all",
+                "basedir=",
                 "subdir=",
                 "exclude=",
                 "pretest=",
@@ -253,6 +256,11 @@
                 ssl = True
             elif option == "--all":
                 all = True
+            elif option == "--basedir":
+                basedir = value
+                sname = os.path.join(basedir, "serverinfo.xml")
+                dname = os.path.join(basedir, "tests")
+                self.data_dir = os.path.join(basedir, "data")
             elif option == "--subdir":
                 subdir = value + "/"
             elif option == "--exclude":

Modified: CalDAVTester/trunk/src/request.py
===================================================================
--- CalDAVTester/trunk/src/request.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/src/request.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -167,6 +167,7 @@
         self.grabheader = []
         self.grabproperty = []
         self.grabelement = []
+        self.grabjson = []
         self.grabcalprop = []
         self.grabcalparam = []
 
@@ -289,7 +290,7 @@
 
     def getFilePath(self):
         if self.data != None:
-            return self.data.filepath
+            return os.path.join(self.manager.data_dir, self.data.filepath) if self.manager.data_dir else self.data.filepath
         else:
             return ""
 
@@ -301,7 +302,7 @@
                 data = self.data.value
             else:
                 # read in the file data
-                fd = open(self.data.nextpath if hasattr(self.data, "nextpath") else self.data.filepath, "r")
+                fd = open(self.data.nextpath if hasattr(self.data, "nextpath") else self.getFilePath(), "r")
                 try:
                     data = fd.read()
                 finally:
@@ -319,9 +320,9 @@
 
     def getNextData(self):
         if not hasattr(self, "dataList"):
-            self.dataList = sorted([path for path in os.listdir(self.data.filepath) if not path.startswith(".")])
+            self.dataList = sorted([path for path in os.listdir(self.getFilePath()) if not path.startswith(".")])
         if len(self.dataList):
-            self.data.nextpath = os.path.join(self.data.filepath, self.dataList.pop(0))
+            self.data.nextpath = os.path.join(self.getFilePath(), self.dataList.pop(0))
             return True
         else:
             if hasattr(self.data, "nextpath"):
@@ -332,7 +333,7 @@
 
 
     def hasNextData(self):
-        dataList = sorted([path for path in os.listdir(self.data.filepath) if not path.startswith(".")])
+        dataList = sorted([path for path in os.listdir(self.getFilePath()) if not path.startswith(".")])
         return len(dataList) != 0
 
 
@@ -398,6 +399,8 @@
                 self.parseGrab(child, self.grabproperty)
             elif child.tag == src.xmlDefs.ELEMENT_GRABELEMENT:
                 self.parseMultiGrab(child, self.grabelement)
+            elif child.tag == src.xmlDefs.ELEMENT_GRABJSON:
+                self.parseMultiGrab(child, self.grabjson)
             elif child.tag == src.xmlDefs.ELEMENT_GRABCALPROP:
                 self.parseGrab(child, self.grabcalprop)
             elif child.tag == src.xmlDefs.ELEMENT_GRABCALPARAM:
@@ -457,7 +460,7 @@
         parent = None
         variable = None
         for child in node.getchildren():
-            if child.tag in (src.xmlDefs.ELEMENT_NAME, src.xmlDefs.ELEMENT_PROPERTY):
+            if child.tag in (src.xmlDefs.ELEMENT_NAME, src.xmlDefs.ELEMENT_PROPERTY, src.xmlDefs.ELEMENT_POINTER):
                 name = self.manager.server_info.subs(child.text.encode("utf-8"))
             elif child.tag == src.xmlDefs.ELEMENT_PARENT:
                 parent = self.manager.server_info.subs(child.text.encode("utf-8"))

Modified: CalDAVTester/trunk/src/serverinfo.py
===================================================================
--- CalDAVTester/trunk/src/serverinfo.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/src/serverinfo.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -206,12 +206,14 @@
             self.subsdict[k] = v
 
         # Now cache some useful substitutions
-        if "$userid1:" not in self.subsdict:
-            raise ValueError("Must have $userid1: substitution")
-        self.user = self.subsdict["$userid1:"]
-        if "$pswd1:" not in self.subsdict:
-            raise ValueError("Must have $pswd1: substitution")
-        self.pswd = self.subsdict["$pswd1:"]
+        user = "$userid1:" if "$userid1:" in self.subsdict else "$userid01:"
+        pswd = "$pswd1:" if "$pswd1:" in self.subsdict else "$pswd01:"
+        if user not in self.subsdict:
+            raise ValueError("Must have userid substitution")
+        self.user = self.subsdict[user]
+        if pswd not in self.subsdict:
+            raise ValueError("Must have pswd substitution")
+        self.pswd = self.subsdict[pswd]
 
 
     def parseRepeatXML(self, node):

Modified: CalDAVTester/trunk/src/xmlDefs.py
===================================================================
--- CalDAVTester/trunk/src/xmlDefs.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/src/xmlDefs.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -35,6 +35,7 @@
 ELEMENT_GRABCOUNT = "grabcount"
 ELEMENT_GRABELEMENT = "grabelement"
 ELEMENT_GRABHEADER = "grabheader"
+ELEMENT_GRABJSON = "grabjson"
 ELEMENT_GRABPROPERTY = "grabproperty"
 ELEMENT_GRABURI = "graburi"
 ELEMENT_HEADER = "header"
@@ -52,6 +53,7 @@
 ELEMENT_PARENT = "parent"
 ELEMENT_PAUSE = "pause"
 ELEMENT_PERIOD = "period"
+ELEMENT_POINTER = "pointer"
 ELEMENT_PROPERTY = "property"
 ELEMENT_REPEAT = "repeat"
 ELEMENT_REQUEST = "request"

Modified: CalDAVTester/trunk/verifiers/aclItems.py
===================================================================
--- CalDAVTester/trunk/verifiers/aclItems.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/aclItems.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-import urllib
 
 """
 Verifier that checks a propfind response to make sure that the specified ACL privileges
@@ -22,6 +21,7 @@
 
 from xml.etree.cElementTree import ElementTree
 from StringIO import StringIO
+import urllib
 
 class Verifier(object):
 

Modified: CalDAVTester/trunk/verifiers/addressDataMatch.py
===================================================================
--- CalDAVTester/trunk/verifiers/addressDataMatch.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/addressDataMatch.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -16,6 +16,7 @@
 
 from difflib import unified_diff
 from pycalendar.vcard.card import Card
+import os
 
 """
 Verifier that checks the response body for a semantic match to data in a file.
@@ -26,6 +27,8 @@
     def verify(self, manager, uri, response, respdata, args, is_json=False): #@UnusedVariable
         # Get arguments
         files = args.get("filepath", [])
+        if manager.data_dir:
+            files = map(lambda x: os.path.join(manager.data_dir, x), files)
         carddata = args.get("data", [])
         filters = args.get("filter", [])
 

Modified: CalDAVTester/trunk/verifiers/calendarDataMatch.py
===================================================================
--- CalDAVTester/trunk/verifiers/calendarDataMatch.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/calendarDataMatch.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -17,6 +17,7 @@
 from difflib import unified_diff
 from pycalendar.icalendar.calendar import Calendar
 from pycalendar.parameter import Parameter
+import os
 
 """
 Verifier that checks the response body for a semantic match to data in a file.
@@ -27,6 +28,8 @@
     def verify(self, manager, uri, response, respdata, args, is_json=False): #@UnusedVariable
         # Get arguments
         files = args.get("filepath", [])
+        if manager.data_dir:
+            files = map(lambda x: os.path.join(manager.data_dir, x), files)
         caldata = args.get("data", [])
         filters = args.get("filter", [])
         statusCode = args.get("status", ["200", "201", "207"])

Modified: CalDAVTester/trunk/verifiers/dataMatch.py
===================================================================
--- CalDAVTester/trunk/verifiers/dataMatch.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/dataMatch.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -13,20 +13,23 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-from difflib import unified_diff
 
 """
 Verifier that checks the response body for an exact match to data in a file.
 """
 
+from StringIO import StringIO
+from difflib import unified_diff
 from xml.etree.cElementTree import ElementTree, tostring
-from StringIO import StringIO
+import os
 
 class Verifier(object):
 
     def verify(self, manager, uri, response, respdata, args): #@UnusedVariable
         # Get arguments
         files = args.get("filepath", [])
+        if manager.data_dir:
+            files = map(lambda x: os.path.join(manager.data_dir, x), files)
 
         # status code must be 200, 207
         if response.status not in (200, 207):

Modified: CalDAVTester/trunk/verifiers/jsonPointerMatch.py
===================================================================
--- CalDAVTester/trunk/verifiers/jsonPointerMatch.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/jsonPointerMatch.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -86,18 +86,23 @@
                     resulttxt += "        Items not returned in JSON for %s\n" % (path,)
 
         for jpath in notexists:
+            if jpath.find("~$") != -1:
+                path, value = jpath.split("~$")
+            else:
+                path, value = jpath, None
             try:
-                jp = JSONMatcher(jpath)
+                jp = JSONMatcher(path)
             except Exception:
                 result = False
                 resulttxt += "        Invalid JSON pointer for %s\n" % (jpath,)
             else:
                 try:
-                    jp.match(j)
+                    jobjs = jp.match(j)
                 except JSONPointerMatchError:
                     pass
                 else:
-                    resulttxt += "        Items returned in JSON for %s\n" % (jpath,)
-                    result = False
+                    if len(jobjs):
+                        resulttxt += "        Items returned in JSON for %s\n" % (jpath,)
+                        result = False
 
         return result, resulttxt

Modified: CalDAVTester/trunk/verifiers/multistatusItems.py
===================================================================
--- CalDAVTester/trunk/verifiers/multistatusItems.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/multistatusItems.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-import urllib
 
 """
 Verifier that checks a multistatus response to make sure that the specified hrefs
@@ -22,6 +21,7 @@
 
 from xml.etree.cElementTree import ElementTree
 from StringIO import StringIO
+import urllib
 
 class Verifier(object):
 

Modified: CalDAVTester/trunk/verifiers/propfindItems.py
===================================================================
--- CalDAVTester/trunk/verifiers/propfindItems.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/propfindItems.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-import urllib
 
 """
 Verifier that checks a propfind response to make sure that the specified properties
@@ -22,6 +21,7 @@
 
 from xml.etree.cElementTree import ElementTree, tostring
 from StringIO import StringIO
+import urllib
 
 class Verifier(object):
     """

Modified: CalDAVTester/trunk/verifiers/propfindValues.py
===================================================================
--- CalDAVTester/trunk/verifiers/propfindValues.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/propfindValues.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -13,7 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 ##
-import urllib
 
 """
 Verifier that checks a propfind response for regex matches to property values.
@@ -22,6 +21,7 @@
 from xml.etree.cElementTree import ElementTree, tostring
 from StringIO import StringIO
 import re
+import urllib
 
 class Verifier(object):
 

Modified: CalDAVTester/trunk/verifiers/xmlDataMatch.py
===================================================================
--- CalDAVTester/trunk/verifiers/xmlDataMatch.py	2014-12-04 18:11:04 UTC (rev 14195)
+++ CalDAVTester/trunk/verifiers/xmlDataMatch.py	2014-12-04 20:45:50 UTC (rev 14196)
@@ -21,12 +21,15 @@
 from difflib import unified_diff
 from xml.etree.cElementTree import ElementTree, tostring
 import StringIO
+import os
 
 class Verifier(object):
 
     def verify(self, manager, uri, response, respdata, args): #@UnusedVariable
         # Get arguments
         files = args.get("filepath", [])
+        if manager.data_dir:
+            files = map(lambda x: os.path.join(manager.data_dir, x), files)
         filters = args.get("filter", [])
 
         # status code must be 200, 207
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20141204/30a62259/attachment-0001.html>


More information about the calendarserver-changes mailing list