/usr/share/caldavtester/verifiers/xmlDataMatch.py is in caldav-tester 7.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | ##
# Copyright (c) 2006-2015 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 checks the response body for an exact match to data in a file.
"""
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
if response.status not in (200, 207):
return False, " HTTP Status Code Wrong: %d" % (response.status,)
# look for response data
if not respdata:
return False, " No response body"
# look for one file
if len(files) != 1:
return False, " No file to compare response to"
# read in all data from specified file
fd = open(files[0], "r")
try:
try:
data = fd.read()
finally:
fd.close()
except:
data = None
if data is None:
return False, " Could not read data file"
data = manager.server_info.subs(data)
data = manager.server_info.extrasubs(data)
def normalizeXMLData(data):
# Read in XML
try:
tree = ElementTree(file=StringIO.StringIO(data))
except Exception:
raise ValueError("Could not parse XML data")
# Apply filters
for filter in filters:
for node in tree.getiterator(filter):
node.clear()
return tostring(tree.getroot())
try:
respdata = normalizeXMLData(respdata)
data = normalizeXMLData(data)
result = respdata == data
if result:
return True, ""
else:
error_diff = "\n".join([line for line in unified_diff(data.split("\n"), respdata.split("\n"))])
return False, " Response data does not exactly match file data %s" % (error_diff,)
except Exception, e:
return False, " Response data is not xml data: %s" % (e,)
|