[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