in verifiers/multistatusItems.py [0:0]
def verify(self, manager, uri, response, respdata, args):
# If no hrefs requested, then assume none should come back
okhrefs = args.get("okhrefs", [])
nohrefs = args.get("nohrefs", [])
badhrefs = args.get("badhrefs", [])
statushrefs = {}
for arg in args.keys():
try:
code = int(arg)
statushrefs.setdefault(code, []).append(args[arg])
except ValueError:
pass
count = args.get("count", [])
totalcount = args.get("totalcount", [])
responsecount = args.get("responsecount", [])
prefix = args.get("prefix", [])
ignoremissing = args.get("ignoremissing", None)
if len(prefix):
prefix = prefix[0] if prefix[0] != "-" else ""
else:
prefix = uri
okhrefs = processHrefSubstitutions(okhrefs, prefix)
nohrefs = processHrefSubstitutions(nohrefs, prefix)
badhrefs = processHrefSubstitutions(badhrefs, prefix)
count = [int(eval(i)) for i in count]
totalcount = [int(eval(i)) for i in totalcount]
responsecount = [int(eval(i)) for i in responsecount]
if "okhrefs" in args or "nohrefs" in args or "badhrefs" in args:
doOKBad = True
elif statushrefs:
doOKBad = False
else:
doOKBad = None
# Process the multistatus response, extracting all hrefs
# and comparing with the set defined for this test. Report any
# mismatches.
# Must have MULTISTATUS response code
if response.status != 207:
return False, " HTTP Status for Request: %d\n" % (response.status,)
try:
tree = ElementTree(file=StringIO(respdata))
except Exception:
return False, " HTTP response is not valid XML: %s\n" % (respdata,)
ok_status_hrefs = []
bad_status_hrefs = []
status_code_hrefs = {}
for response in tree.findall("{DAV:}response"):
# Get href for this response
href = response.findall("{DAV:}href")
if href is None or len(href) != 1:
return False, " Incorrect/missing DAV:Href element in response"
href = urllib.unquote(href[0].text).rstrip("/")
# Verify status
status = response.findall("{DAV:}status")
if len(status) == 1:
statustxt = status[0].text
status = False
if statustxt.startswith("HTTP/1.1 ") and (len(statustxt) >= 10):
status = (statustxt[9] == "2")
try:
code = int(statustxt[9:12])
except ValueError:
code = 0
else:
propstatus = response.findall("{DAV:}propstat")
if len(propstatus) > 0:
statustxt = "OK"
status = True
else:
status = False
code = 0
if status:
ok_status_hrefs.append(href)
else:
bad_status_hrefs.append(href)
status_code_hrefs.setdefault(code, set()).add(href)
ok_result_set = set(ok_status_hrefs)
ok_test_set = set(okhrefs)
no_test_set = set(nohrefs)
bad_result_set = set(bad_status_hrefs)
bad_test_set = set(badhrefs)
result = True
resulttxt = ""
# Check for count
if len(count) == 1:
if len(ok_result_set) != count[0] + 1:
result = False
resulttxt += " %d items returned, but %d items expected" % (len(ok_result_set) - 1, count[0],)
return result, resulttxt
# Check for total count
if len(totalcount) > 0:
# Add the 2nd value to the 1st if it exists
if len(totalcount) == 2:
totalcount[0] += totalcount[1]
if len(ok_result_set) != totalcount[0]:
result = False
resulttxt += " %d items returned, but %d items expected" % (len(ok_result_set), totalcount[0],)
return result, resulttxt
# Check for response count
if len(responsecount) == 1:
responses = len(ok_result_set) + len(bad_result_set)
if responses != responsecount[0]:
result = False
resulttxt += " %d responses returned, but %d responses expected" % (responses, responsecount[0],)
return result, resulttxt
if doOKBad:
# Now do set difference
ok_missing = ok_test_set.difference(ok_result_set)
ok_extras = ok_result_set.difference(ok_test_set) if ignoremissing is None else set()
no_extras = ok_result_set.intersection(no_test_set)
bad_missing = bad_test_set.difference(bad_result_set)
bad_extras = bad_result_set.difference(bad_test_set) if ignoremissing is None else set()
if len(ok_missing) + len(ok_extras) + len(no_extras) + len(bad_missing) + len(bad_extras) != 0:
if len(ok_missing) != 0:
l = list(ok_missing)
resulttxt += " %d Items not returned in report (OK):" % (len(ok_missing),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
if len(ok_extras) != 0:
l = list(ok_extras)
resulttxt += " %d Unexpected items returned in report (OK):" % (len(ok_extras),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
if len(no_extras) != 0:
l = list(no_extras)
resulttxt += " %d Unwanted items returned in report (OK):" % (len(no_extras),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
if len(bad_missing) != 0:
l = list(bad_missing)
resulttxt += " %d Items not returned in report (BAD):" % (len(bad_missing),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
if len(bad_extras) != 0:
l = list(bad_extras)
resulttxt += " %d Unexpected items returned in report (BAD):" % (len(bad_extras),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
result = False
if not doOKBad:
l = list(set(statushrefs.keys()) - set(status_code_hrefs.keys()))
if l:
resulttxt += " %d Status Codes not returned in report:" % (len(l),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
result = False
l = list(set(status_code_hrefs.keys()) - set(statushrefs.keys()))
if l:
resulttxt += " %d Unexpected Status Codes returned in report:" % (len(l),)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
result = False
for code in set(statushrefs.keys()) & set(status_code_hrefs.keys()):
l = list(set(*statushrefs[code]) - status_code_hrefs[code])
if l:
resulttxt += " %d Items not returned in report for %d:" % (len(l), code,)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
result = False
l = list(status_code_hrefs[code] - set(*statushrefs[code]))
if l:
resulttxt += " %d Unexpected items returned in report for %d:" % (len(l), code,)
for i in l:
resulttxt += " " + str(i)
resulttxt += "\n"
result = False
return result, resulttxt