public String CSID = "";\r
public String subresourceCSID = "";\r
public String requestPayload = ""; //just like requestPayloadRaw, but may have multipart boundary and headers.\r
- public Map<String, String> requestPayloadsRaw = new HashMap<String, String>();\r
+ public String requestPayloadsRaw = "";\r
public String result = "";\r
public int responseCode = 0;\r
public String responseMessage = "";\r
if (overrideExpectedResult){\r
return true;\r
}\r
- if (Tools.notEmpty(failureReason)){\r
- return false;\r
- }\r
+ //if (Tools.notEmpty(failureReason)){\r
+ // return false;\r
+ //}\r
for (Integer oneExpected : expectedCodes){\r
if (responseCode == oneExpected){\r
+ failureReason = "";\r
return isDomWalkOK();\r
}\r
}\r
if ( expectedCodes.size()>0 && codeInSuccessRange(responseCode)){ //none found, but result expected.\r
for (Integer oneExpected : expectedCodes){\r
if ( ! codeInSuccessRange(oneExpected)){\r
+ failureReason = "";\r
return isDomWalkOK();\r
}\r
}\r
}\r
boolean ok = codeInSuccessRange(responseCode);\r
if (ok) {\r
+ failureReason = "";\r
return isDomWalkOK();\r
}\r
failureReason = " : STATUS CODE UNEXPECTED; ";\r
}\r
\r
//public static final String[] DUMP_OPTIONS = {"minimal", "detailed", "full"};\r
- public static enum DUMP_OPTIONS {minimal, detailed, full};\r
+ public static enum DUMP_OPTIONS {minimal, detailed, full, auto};\r
\r
public static enum PAYLOAD_STRICTNESS {ZERO, ADDOK, TREE, TEXT, TREE_TEXT, STRICT};\r
\r
}\r
\r
public String minimal(){\r
+ return minimal(false);\r
+ }\r
+\r
+ public String minimal(boolean verbosePartsSummary){\r
return "{"\r
+ ( gotExpectedResult() ? "SUCCESS" : "FAILURE" )\r
+ failureReason\r
+"; URL:"+fullURL\r
+"; auth: "+auth\r
+ ( Tools.notEmpty(error) ? "; ERROR:"+error : "" )\r
- + ( partsSummary(false))\r
+ + (verbosePartsSummary ? partsSummary(true) : partsSummary(false) )\r
+"}";\r
}\r
- public String dump(ServiceResult.DUMP_OPTIONS opt){\r
+ public String dump(ServiceResult.DUMP_OPTIONS opt, boolean hasError){\r
switch (opt){\r
case minimal:\r
- return minimal();\r
+ return minimal(false);\r
case detailed:\r
return detail(false);\r
case full:\r
return detail(true);\r
+ case auto:\r
+ return minimal(hasError);\r
default:\r
return toString();\r
}\r
}\r
\r
/** This method may be called from a test case, using a syntax like ${testID3.resValue("persons_common", "//refName")} */\r
- public String got(String partName, String xpath) throws Exception {\r
+ public String got(String xpath) throws Exception {\r
try {\r
- PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(this.result, this.boundary, this.contentLength);\r
- PayloadLogger.Part partFromServer = traffic.getPart(partName);\r
- String source = partFromServer.getContent();\r
+ //PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(this.result, this.boundary, this.contentLength);\r
+ //PayloadLogger.Part partFromServer = traffic.getPart(partName);\r
+ //String source = partFromServer.getContent();\r
+ String source = this.result;\r
+ if (Tools.isBlank(source)){\r
+ return "";\r
+ }\r
org.jdom.Element element = (org.jdom.Element) XmlCompareJdom.selectSingleNode(source, xpath, null); //todo: passing null for namespace may not work.\r
String sr = element != null ? element.getText() : "";\r
return sr;\r
}\r
\r
/** This method may be called from a test case, using a syntax like ${oe9.reqValue("personauthorities_common","//shortIdentifier")} */\r
- public String sent(String partName, String xpath) throws Exception {\r
+ public String sent(String xpath) throws Exception {\r
try {\r
- if (Tools.isEmpty(partName)){\r
- partName = "default";\r
- }\r
- String source = this.requestPayloadsRaw.get(partName);\r
+ String source = this.requestPayloadsRaw;\r
if (source == null){\r
- return "ERROR:null:requestPayloadsRaw["+partName+"]";\r
+ return "ERROR:null:requestPayloadsRaw";\r
}\r
org.jdom.Element element = (org.jdom.Element) XmlCompareJdom.selectSingleNode(source, xpath, null); //e.g. "//shortIdentifier"); //todo: passing null for namespace may not work.\r
String sr = element != null ? element.getText() : "";\r
public String rpath = "";\r
public String ltextTrimmed = "";\r
public String rtextTrimmed = "";\r
+ public String expected = "";\r
+ public String actual = "";\r
public String message = "";\r
public String errmessage = "";\r
public static enum STATUS {INFO, MATCHED, R_MISSING, R_ADDED, DOC_ERROR, TEXT_DIFFERENT};\r
+(Tools.notEmpty(rpath) ? ", R.path:"+rpath : "")\r
+(Tools.notEmpty(message) ? ", message:"+message : "")\r
+(Tools.notEmpty(errmessage) ? ", errmessage:"+errmessage : "")\r
+ +", status:"+status\r
+((status != STATUS.MATCHED) && Tools.notEmpty(ltextTrimmed) ? ",\r\n L.trimmed:"+ltextTrimmed : "")\r
+((status != STATUS.MATCHED) && Tools.notEmpty(rtextTrimmed) ? ",\r\n R.trimmed:"+rtextTrimmed : "")\r
+ +((status != STATUS.MATCHED) && Tools.notEmpty(expected) ? "\r\nEXPECTED:\r\n------------------\r\n"+expected.trim()+"\r\n------------------" : "")\r
+ +((status != STATUS.MATCHED) && Tools.notEmpty(actual) ? "\r\nACTUAL:\r\n------------------\r\n"+actual.trim()+"\r\n------------------\r\n" : "")\r
+\r
+"}";\r
\r
}\r
return doc;\r
}\r
\r
- public static TreeWalkResults compareParts(String expectedContent, String leftID, String actualPartContent, String rightID){\r
-\r
- System.out.println("expected: \r\n"+expectedContent+"\r\n\r\n");\r
- System.out.println("ACTUAL: \r\n"+actualPartContent);\r
-\r
+ public static TreeWalkResults compareParts(String expectedContent, String leftID, String actualPartContent, String rightID, String startElement){\r
TreeWalkResults list = new TreeWalkResults();\r
try {\r
\r
list.leftID = leftID;\r
list.rightID = rightID;\r
TreeWalkResults.TreeWalkEntry infoentry = new TreeWalkResults.TreeWalkEntry();\r
+ infoentry.expected = expectedContent;\r
+ infoentry.actual = actualPartContent;\r
infoentry.status = TreeWalkResults.TreeWalkEntry.STATUS.INFO;\r
infoentry.message = "\r\n LEFT file: "+leftID+"\r\n RIGHT file: "+rightID;\r
list.add(infoentry);\r
} else {\r
Document expected = getDocumentFromContent(expectedContent);\r
Document actual = getDocumentFromContent(actualPartContent);\r
- treeWalk(expected, actual, list);\r
+ treeWalk(expected, actual, list, startElement);\r
}\r
} catch (Throwable t){\r
String msg = "ERROR in XmlReplay.compareParts(): "+t;\r
return xpath.selectSingleNode(element);\r
}\r
\r
- public static boolean treeWalk(Document left, Document right, TreeWalkResults list) throws Exception {\r
- boolean res = treeWalk(left.getRootElement(), right.getRootElement(), "/", list);\r
+ /* MAYBE DEAL WITH NAMESPACES IN THIS KIND OF APPROACH.\r
+\r
+ for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {\r
+ if (el.getNamespace() != null) el.setNamespace(null);\r
+\r
+ xpath.addNamespace("x", d.getRootElement().getNamespaceUri());\r
+ */\r
+ public static boolean treeWalk(Document left, Document right, TreeWalkResults list, String startElement) throws Exception {\r
+ Element leftElement = left.getRootElement();\r
+ Element rightElement = right.getRootElement();\r
+ if (Tools.notBlank(startElement)) {\r
+ XPath xpath = new JDOMXPath(startElement);\r
+ Object test = xpath.selectSingleNode(leftElement);\r
+ if (test!=null){\r
+ leftElement = (Element)test;\r
+ }\r
+ Object rtest = xpath.selectSingleNode(rightElement);\r
+ if (rtest!=null){\r
+ rightElement = (Element)rtest;\r
+ }\r
+ }\r
+ boolean res = treeWalk(leftElement, rightElement, "/", list);\r
return res;\r
}\r
\r
import org.apache.commons.cli.*;\r
\r
import org.apache.commons.io.FileUtils;\r
-import org.apache.commons.jexl2.JexlContext;\r
import org.apache.commons.jexl2.JexlEngine;\r
-import org.apache.commons.jexl2.MapContext;\r
import org.collectionspace.services.common.api.Tools;\r
import org.dom4j.*;\r
import org.dom4j.io.SAXReader;\r
}\r
\r
private static class PartsStruct {\r
- public List<String> partsList = new ArrayList<String>();\r
- public List<String> filesList = new ArrayList<String>();\r
- public List<String> fromTests = new ArrayList<String>();\r
public List<Map<String,String>> varsList = new ArrayList<Map<String,String>>();\r
- boolean bDoingSinglePartPayload = false;\r
- String singlePartPayloadFilename = "";\r
+ String responseFilename = "";\r
String overrideTestID = "";\r
+ String startElement = "";\r
+ String label = "";\r
+\r
public static PartsStruct readParts(Node testNode, final String testID, String xmlReplayBaseDir){\r
PartsStruct resultPartsStruct = new PartsStruct();\r
- resultPartsStruct.singlePartPayloadFilename = testNode.valueOf("filename");\r
- String singlePartPayloadFilename = testNode.valueOf("filename");\r
- if (Tools.notEmpty(singlePartPayloadFilename)){\r
- resultPartsStruct.bDoingSinglePartPayload = true;\r
- resultPartsStruct.singlePartPayloadFilename = xmlReplayBaseDir + '/' + singlePartPayloadFilename;\r
+ resultPartsStruct.responseFilename = testNode.valueOf("filename");\r
+ resultPartsStruct.startElement = testNode.valueOf("startElement");\r
+ resultPartsStruct.label = testNode.valueOf("label");\r
+ String responseFilename = testNode.valueOf("filename");\r
+ if (Tools.notEmpty(responseFilename)){\r
+ resultPartsStruct.responseFilename = xmlReplayBaseDir + '/' + responseFilename;\r
List<Node> varNodes = testNode.selectNodes("vars/var");\r
readVars(testNode, varNodes, resultPartsStruct);\r
- } else {\r
- resultPartsStruct.bDoingSinglePartPayload = false;\r
- List<Node> parts = testNode.selectNodes("parts/part");\r
- if (parts == null || parts.size()==0){\r
- //path is just /testGroup/test/part/\r
- Node part = testNode.selectSingleNode("part");\r
- readPart(testNode, part, xmlReplayBaseDir, testID, resultPartsStruct); //side-effect: adds objects to result.\r
- } else {\r
- // path is /testGroup/test/parts/part/\r
- for (Node part : parts){\r
- readPart(testNode, part, xmlReplayBaseDir, testID, resultPartsStruct); //side-effect: adds objects to result.\r
- }\r
- }\r
}\r
return resultPartsStruct;\r
}\r
- private static void readPart(Node testNode, Node part, String xmlReplayBaseDir, String testID, PartsStruct resultPartsStruct){\r
- String commonPartName = part.valueOf("label");\r
- String filename = part.valueOf("filename");\r
- String fullTestFilename = xmlReplayBaseDir + '/' + filename;\r
- if ( Tools.isEmpty(testID) ){ //if testID is empty, we'll use the *first* filename as ID.\r
- resultPartsStruct.overrideTestID = filename; //It is legal to have a missing ID attribute, and rely on a unique filename.\r
- }\r
- String fromTest = part.valueOf("fromTest");\r
- if (fromTest == null){\r
- fromTest = "";\r
- }\r
-\r
- //These next foun members (partsList,filesList,varsList, and fromTests),\r
- // should be added in lock-step, since they are assumed to exist by index (0,1,2,3, etc.)\r
- resultPartsStruct.partsList.add(commonPartName);\r
- resultPartsStruct.filesList.add(fullTestFilename);\r
- resultPartsStruct.fromTests.add(fromTest);\r
-\r
- List<Node> varNodes = part.selectNodes("var");\r
- readVars(testNode, varNodes, resultPartsStruct);\r
- /* Map<String,String> vars = new HashMap<String,String>();\r
- resultPartsStruct.varsList.add(vars);\r
\r
- List<Node> varNodes = part.selectNodes("var");\r
- //System.out.println("### vars: "+vars.size()+" ########");\r
- for (Node var: varNodes){\r
- String ID = var.valueOf("@ID");\r
- String value = var.getText();\r
- //System.out.println("ID: "+ID+" value: "+value);\r
- vars.put(ID, value); //vars is already part of resultPartsStruct.varsList\r
- }\r
- //System.out.println("### end-vars ########");\r
- */\r
- }\r
private static void readVars(Node testNode, List<Node> varNodes, PartsStruct resultPartsStruct){\r
Map<String,String> vars = new HashMap<String,String>();\r
resultPartsStruct.varsList.add(vars);\r
}\r
return document;\r
}\r
+\r
protected static String validateResponseSinglePayload(ServiceResult serviceResult,\r
Map<String, ServiceResult> serviceResultsMap,\r
PartsStruct expectedResponseParts,\r
XmlReplayEval evalStruct)\r
throws Exception {\r
String OK = "";\r
- byte[] b = FileUtils.readFileToByteArray(new File(expectedResponseParts.singlePartPayloadFilename));\r
+ byte[] b = FileUtils.readFileToByteArray(new File(expectedResponseParts.responseFilename));\r
String expectedPartContent = new String(b);\r
Map<String,String> vars = expectedResponseParts.varsList.get(0); //just one part, so just one varsList. Must be there, even if empty.\r
expectedPartContent = evalStruct.eval(expectedPartContent, serviceResultsMap, vars, evalStruct.jexl, evalStruct.jc);\r
String label = "NOLABEL";\r
- String leftID = "{from expected part, label:"+label+" filename: "+expectedResponseParts.singlePartPayloadFilename+"}";\r
+ String leftID = "{from expected part, label:"+label+" filename: "+expectedResponseParts.responseFilename+"}";\r
String rightID = "{from server, label:"+label\r
+" fromTestID: "+serviceResult.fromTestID\r
+" URL: "+serviceResult.fullURL\r
+"}";\r
+ String startElement = expectedResponseParts.startElement;\r
+ String partLabel = expectedResponseParts.label;\r
+ if (Tools.isBlank(startElement)){\r
+ if (Tools.notBlank(partLabel))\r
+ startElement = "/document/*[local-name()='"+partLabel+"']";\r
+ }\r
TreeWalkResults list =\r
XmlCompareJdom.compareParts(expectedPartContent,\r
leftID,\r
serviceResult.result,\r
- rightID);\r
+ rightID,\r
+ startElement);\r
serviceResult.addPartSummary(label, list);\r
return OK;\r
}\r
if (expectedResponseParts == null) return OK;\r
if (serviceResult == null) return OK;\r
if (serviceResult.result.length() == 0) return OK;\r
- String responseDump = serviceResult.result;\r
try {\r
- if (expectedResponseParts.bDoingSinglePartPayload){\r
- return validateResponseSinglePayload(serviceResult, serviceResultsMap, expectedResponseParts, evalStruct);\r
- }\r
- //System.out.println("responseDump: "+responseDump);\r
- PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(responseDump, serviceResult.boundary, serviceResult.contentLength);\r
-\r
- for (int i=0; i<expectedResponseParts.partsList.size(); i++){\r
- String fileName = expectedResponseParts.filesList.get(i);\r
- String label = expectedResponseParts.partsList.get(i);\r
- Map<String,String> vars = expectedResponseParts.varsList.get(i);\r
- String fromTest = expectedResponseParts.fromTests.get(i);\r
- String expectedPartContent;\r
- if ( ! Tools.isEmpty(fromTest)){\r
- ServiceResult resultFromTest = serviceResultsMap.get(fromTest);\r
- expectedPartContent = resultFromTest.requestPayloadsRaw.get(label); //TODO: debug this!!!!!!!\r
- } else {\r
- byte[] b = FileUtils.readFileToByteArray(new File(fileName));\r
- expectedPartContent = new String(b);\r
- expectedPartContent = evalStruct.eval(expectedPartContent, serviceResultsMap, vars, evalStruct.jexl, evalStruct.jc);\r
- }\r
- //System.out.println("expected: "+label+ " content ==>\r\n"+expectedPartContent);\r
- PayloadLogger.Part partFromServer = traffic.getPart(label);\r
- String partFromServerContent = "";\r
- if (partFromServer != null){\r
- partFromServerContent = partFromServer.getContent();\r
- } else {\r
- partFromServerContent = "";\r
- }\r
- //if (partFromServer!=null) {\r
- //System.out.println("====part content from server. label-->"+label+"<-- \r\npart-->"+partFromServerContent+"<--");\r
-\r
- String leftID = "{from expected part, label:"+label+" filename: "+fileName+"}";\r
- String rightID = "{from server, label:"+label\r
- //+" testGroupID: "+serviceResult.testGroupID\r
- +" fromTestID: "+serviceResult.fromTestID\r
- +" URL: "+serviceResult.fullURL\r
- +"}";\r
- TreeWalkResults list =\r
- XmlCompareJdom.compareParts(expectedPartContent,\r
- leftID,\r
- partFromServerContent,\r
- rightID);\r
- //if (list.getMismatchCount()>0){\r
- serviceResult.addPartSummary(label, list);\r
- //}\r
- //}\r
- }\r
+ return validateResponseSinglePayload(serviceResult, serviceResultsMap, expectedResponseParts, evalStruct);\r
} catch (Exception e){\r
String err = "ERROR in XmlReplay.validateResponse() : "+e;\r
- //System.out.println(err);\r
return err ;\r
}\r
- return OK;\r
}\r
\r
-\r
//================= runXmlReplayFile ======================================================\r
\r
public static List<ServiceResult> runXmlReplayFile(String xmlReplayBaseDir,\r
} else {\r
authsMapINFO = "Using AuthsMap from control file: "+authsMap;\r
}\r
- System.out.println("XmlReplay running:"\r
+ System.out.println("========================================================================"\r
+ +"\r\nXmlReplay running:"\r
+"\r\n controlFile: "+ (new File(controlFile).getCanonicalPath())\r
+"\r\n protoHostPort: "+protoHostPort\r
+"\r\n testGroup: "+testGroupID\r
+"\r\n AuthsMap: "+authsMapINFO\r
+"\r\n param_autoDeletePOSTS: "+param_autoDeletePOSTS\r
+"\r\n Dump info: "+dump\r
+ +"\r\n========================================================================"\r
+"\r\n");\r
\r
String autoDeletePOSTS = "";\r
for (Node testNode : tests) {\r
long startTime = System.currentTimeMillis();\r
try {\r
- /*try {\r
- //"sleeping 2");\r
- Thread.currentThread().sleep(2);\r
- } catch (InterruptedException ie){\r
- System.out.println("ERROR sleeping: "+ie);\r
- }\r
- */\r
testElementIndex++;\r
String testID = testNode.valueOf("@ID");\r
String testIDLabel = Tools.notEmpty(testID) ? (testGroupID+'.'+testID) : (testGroupID+'.'+testElementIndex);\r
String method = testNode.valueOf("method");\r
String uri = testNode.valueOf("uri");\r
String fullURL = Tools.glue(protoHostPort, "/", uri);\r
- String initURI = uri;\r
\r
String authIDForTest = testNode.valueOf("@auth");\r
String currentAuthForTest = authsMap.map.get(authIDForTest);\r
} else if (isPUT) {\r
uri = fromTestID(uri, testNode, serviceResultsMap);\r
}\r
- if (parts.bDoingSinglePartPayload){\r
- Map<String,String> vars = null;\r
- if (parts.varsList.size()>0){\r
- vars = parts.varsList.get(0);\r
- }\r
- serviceResult = XmlReplayTransport.doPOST_PUTFromXML(parts.singlePartPayloadFilename, vars, protoHostPort, uri, method, XmlReplayTransport.APPLICATION_XML, evalStruct, authForTest, testIDLabel);\r
- } else {\r
- boolean POX = true;\r
- if (POX){\r
- serviceResult = XmlReplayTransport.doPOST_PUTFromXML_POX (parts.filesList, parts.partsList, parts.varsList, protoHostPort, uri, method, evalStruct, authForTest, testIDLabel);\r
- } else {\r
- serviceResult = XmlReplayTransport.doPOST_PUTFromXML_Multipart(parts.filesList, parts.partsList, parts.varsList, protoHostPort, uri, method, evalStruct, authForTest, testIDLabel);\r
- }\r
+ Map<String,String> vars = null;\r
+ if (parts.varsList.size()>0){\r
+ vars = parts.varsList.get(0);\r
}\r
+ serviceResult = XmlReplayTransport.doPOST_PUTFromXML(parts.responseFilename, vars, protoHostPort, uri, method, XmlReplayTransport.APPLICATION_XML, evalStruct, authForTest, testIDLabel);\r
+\r
results.add(serviceResult);\r
//if (isPOST){\r
serviceResultsMap.put(testID, serviceResult); //PUTs do not return a Location, so don't add PUTs to serviceResultsMap.\r
serviceResult.expectedCodes = expectedCodes;\r
}\r
results.add(serviceResult);\r
- if (serviceResult.gotExpectedResult()){ //gotExpectedResult depends on serviceResult.expectedCodes.\r
+ if (serviceResult.codeInSuccessRange(serviceResult.responseCode)){ //gotExpectedResult depends on serviceResult.expectedCodes.\r
serviceResultsMap.remove(fromTestID);\r
}\r
} else {\r
//=====================================================\r
// ALL VALIDATION FOR ALL REQUESTS IS DONE HERE:\r
//=====================================================\r
+ boolean hasError = false;\r
String vError = validateResponse(serviceResult, serviceResultsMap, expectedResponseParts, evalStruct);\r
if (Tools.notEmpty(vError)){\r
serviceResult.error = vError;\r
serviceResult.failureReason = " : VALIDATION ERROR; ";\r
+ hasError = true;\r
+ }\r
+ if (hasError == false){\r
+ hasError = ! serviceResult.gotExpectedResult();\r
}\r
\r
- String serviceResultRow = serviceResult.dump(dump.dumpServiceResult)+"; time:"+(startTime-System.currentTimeMillis());\r
+ boolean doingAuto = (dump.dumpServiceResult == ServiceResult.DUMP_OPTIONS.auto);\r
+ String serviceResultRow = serviceResult.dump(dump.dumpServiceResult, hasError)+"; time:"+(System.currentTimeMillis()-startTime);\r
String leader = (dump.dumpServiceResult == ServiceResult.DUMP_OPTIONS.detailed) ? "XmlReplay:"+testIDLabel+": ": "";\r
+\r
if ( (dump.dumpServiceResult == ServiceResult.DUMP_OPTIONS.detailed)\r
- || (dump.dumpServiceResult == ServiceResult.DUMP_OPTIONS.full)){\r
+ || (dump.dumpServiceResult == ServiceResult.DUMP_OPTIONS.full) ){\r
System.out.println("\r\n#---------------------#");\r
}\r
System.out.println(leader+serviceResultRow+"\r\n");\r
- if (dump.payloads && Tools.notBlank(serviceResult.requestPayload)) {\r
- System.out.println("\r\n========== request payload ===============");\r
- System.out.println(serviceResult.requestPayload);\r
- System.out.println("==========================================\r\n");\r
+ if (dump.payloads || (doingAuto&&hasError) ) {\r
+ if (Tools.notBlank(serviceResult.requestPayload)){\r
+ System.out.println("\r\n========== request payload ===============");\r
+ System.out.println(serviceResult.requestPayload);\r
+ System.out.println("==========================================\r\n");\r
+ }\r
}\r
- if (dump.payloads && Tools.notBlank(serviceResult.result)) {\r
- System.out.println("\r\n========== response payload ==============");\r
- System.out.println(serviceResult.result);\r
- System.out.println("==========================================\r\n");\r
+ if (dump.payloads || (doingAuto&&hasError)) {\r
+ if (Tools.notBlank(serviceResult.result)){\r
+ System.out.println("\r\n========== response payload ==============");\r
+ System.out.println(serviceResult.result);\r
+ System.out.println("==========================================\r\n");\r
+ }\r
}\r
} catch (Throwable t) {\r
String msg = "ERROR: XmlReplay experienced an error in a test node: "+testNode+" Throwable: "+t;\r
return results;\r
}\r
\r
-\r
//======================== MAIN ===================================================================\r
\r
private static Options createOptions() {\r
//System.err.println("ERROR getting content from response: "+t);\r
pr.error = t.toString();\r
}\r
-\r
-\r
return pr;\r
}\r
\r
public static ServiceResult doDELETE(String urlString, String authForTest, String testID, String fromTestID) throws Exception {\r
ServiceResult pr = new ServiceResult();\r
+ pr.failureReason = "";\r
pr.method = "DELETE";\r
pr.fullURL = urlString;\r
pr.fromTestID = fromTestID;\r
public static final String APPLICATION_XML = "application/xml";\r
\r
/** Use this overload for multipart messages. */\r
+ /**\r
public static ServiceResult doPOST_PUTFromXML_Multipart(List<String> filesList,\r
List<String> partsList,\r
List<Map<String,String>> varsList,\r
String urlString = protoHostPort+uri;\r
return doPOST_PUT(urlString, content, contentRaw, BOUNDARY, method, MULTIPART_MIXED, authForTest, fromTestID); //method is POST or PUT.\r
}\r
-\r
- public static ServiceResult doPOST_PUTFromXML_POX(List<String> filesList,\r
- List<String> partsList,\r
- List<Map<String,String>> varsList,\r
- String protoHostPort,\r
- String uri,\r
- String method,\r
- XmlReplayEval evalStruct,\r
- String authForTest,\r
- String fromTestID)\r
- throws Exception {\r
- if ( filesList==null||filesList.size()==0\r
- ||partsList==null||partsList.size()==0\r
- ||(partsList.size() != filesList.size())){\r
- throw new Exception("filesList and partsList must not be empty and must have the same number of items each.");\r
- }\r
- //NO: Patrick sez all test files should be complete XML now: StringBuffer content = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");\r
- StringBuffer content = new StringBuffer();\r
- //content.append(CRLF).append("<document name=\"objectexit\">").append(CRLF);\r
- Map<String, String> contentRaw = new HashMap<String, String>();\r
- for (int i=0; i<partsList.size(); i++){\r
- String fileName = filesList.get(i);\r
- String commonPartName = partsList.get(i);\r
- byte[] b = FileUtils.readFileToByteArray(new File(fileName));\r
- String xmlString = new String(b);\r
-\r
- xmlString = evalStruct.eval(xmlString, evalStruct.serviceResultsMap, varsList.get(i), evalStruct.jexl, evalStruct.jc);\r
- contentRaw.put(commonPartName, xmlString);\r
- \r
- content.append(xmlString).append(CRLF);\r
- }\r
- //content.append("</document>");\r
- String urlString = protoHostPort+uri;\r
- String POX_BOUNDARY = "";//empty for POX.\r
- return doPOST_PUT(urlString, content.toString(), contentRaw, POX_BOUNDARY, method,APPLICATION_XML, authForTest, fromTestID); //method is POST or PUT.\r
- }\r
-\r
+ */\r
\r
/** Use this overload for NON-multipart messages, that is, regular POSTs. */\r
public static ServiceResult doPOST_PUTFromXML(String fileName,\r
String xmlString = new String(b);\r
xmlString = evalStruct.eval(xmlString, evalStruct.serviceResultsMap, vars, evalStruct.jexl, evalStruct.jc);\r
String urlString = protoHostPort+uri;\r
- Map<String, String> contentRaw = new HashMap<String, String>();\r
- contentRaw.put("default", xmlString);\r
+ String contentRaw = xmlString;\r
return doPOST_PUT(urlString, xmlString, contentRaw, BOUNDARY, method, contentType, authForTest, fromTestID); //method is POST or PUT.\r
}\r
\r
//if (true) return result;\r
//END-HACK\r
\r
- public static ServiceResult doPOST_PUT(String urlString, String content, Map<String,String> contentRaw,\r
- String boundary, String method, String contentType,\r
- String authForTest, String fromTestID) throws Exception {\r
+ public static ServiceResult doPOST_PUT(String urlString,\r
+ String content,\r
+ String contentRaw,\r
+ String boundary,\r
+ String method,\r
+ String contentType,\r
+ String authForTest,\r
+ String fromTestID) throws Exception {\r
ServiceResult result = new ServiceResult();\r
result.method = method;\r
String deleteURL = "";\r
return result;\r
}\r
\r
-\r
public static ServiceResult doPOST_PUT_PostMethod(String urlString, String content, Map<String,String> contentRaw,\r
String boundary, String method, String contentType,\r
String authForTest, String fromTestID) throws Exception {\r
} finally {\r
rd.close();\r
}\r
-\r
-\r
}\r
\r
}\r
XmlCompareJdom.compareParts(expectedPartContent,\r
"expected",\r
partFromServer,\r
- "from-server");\r
+ "from-server",\r
+ exPARTNAME);\r
assertTreeWalkResults(results,0,0,0,true,true);\r
// addedRight,missingRight,textMismatches,strictMatch,treesMatch\r
}\r
XmlCompareJdom.compareParts(expectedPartContent,\r
"expected",\r
srvHEAD+srvEN2+srvDEPOSITOR+srvFOOT,\r
- "from-server");\r
+ "from-server",\r
+ exPARTNAME);\r
assertTreeWalkResults(results,0,0,1,false,true);\r
// addedRight,missingRight,textMismatches,strictMatch,treesMatch\r
}\r
XmlCompareJdom.compareParts(expectedPartContent,\r
"expected",\r
srvHEAD+srvEN+exNEWTREE+srvDEPOSITOR+exNEW+srvFOOT,\r
- "from-server");\r
+ "from-server",\r
+ exPARTNAME);\r
assertTreeWalkResults(results,2,0,0,false,false);\r
// addedRight,missingRight,textMismatches,strictMatch,treesMatch\r
\r
XmlCompareJdom.compareParts(exHEAD + exEN_WCH + exNEWTREE + exDEP + exNEW + exFOOT,\r
"expected",\r
partFromServer,\r
- "from-server");\r
+ "from-server",\r
+ exPARTNAME);\r
assertTreeWalkResults(results,0,3,0,false,false);\r
// addedRight,missingRight,textMismatches,strictMatch,treesMatch\r
}\r
XmlCompareJdom.compareParts(exHEAD + exDEP + exEN + exFOOT,\r
"expected",\r
partFromServer,\r
- "from-server");\r
+ "from-server",\r
+ exPARTNAME);\r
assertTreeWalkResults(results,0,0,0,true,true);\r
// addedRight,missingRight,textMismatches,strictMatch,treesMatch\r
}\r
\r
// ============ expected part, will be used as LEFT tree ==========================================================\r
+ private static String exPARTNAME = "objectexit_common";\r
+\r
private static String exHEAD ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"\r
+"<document name=\"objectexit\">"\r
+"<ns2:objectexit_common \r\n"\r
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<document name="acquisitions">\r
<ns3:acquisitions_common\r
xmlns:ns2="http://collectionspace.org/services/jaxb"\r
xmlns:ns3="http://collectionspace.org/services/acquisition">\r
<acquisitionSource>Donor Acquisition Source-1292275630222</acquisitionSource>\r
</acquisitionSources>\r
</ns3:acquisitions_common>\r
+</document>\r
\r
\r
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<document name="acquisitions">\r
<ns3:acquisitions_common\r
xmlns:ns2="http://collectionspace.org/services/jaxb"\r
xmlns:ns3="http://collectionspace.org/services/acquisition">\r
<acquisitionSource>Donor Acquisition Source-1292275631503</acquisitionSource>\r
</acquisitionSources>\r
</ns3:acquisitions_common>\r
+</document>\r
\r
\r
<auth ID="testAdministator">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
</auths>\r
\r
- <testGroup ID="makeone" autoDeletePOSTS="false">\r
+ <testGroup ID="makeone" autoDeletePOSTS="true">\r
<test ID="ac1" auth="test">\r
<method>POST</method>\r
<uri>/cspace-services/acquisitions/</uri>\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/ac1.xml</filename>\r
- </part>\r
+ <filename>acquisitions/ac1.xml</filename>\r
</test>\r
<test ID="ac1get">\r
<method>GET</method>\r
<uri>/cspace-services/acquisitions/${ac1.CSID}</uri>\r
<response>\r
<expected level="TEXT" />\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/res/ac1.res.xml</filename>\r
- </part>\r
+ <label>acquisitions_common</label>\r
+ <filename>acquisitions/res/ac1.res.xml</filename>\r
</response>\r
</test>\r
</testGroup> \r
<test ID="ac1" auth="test">\r
<method>POST</method>\r
<uri>/cspace-services/acquisitions/</uri>\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/ac1.xml</filename>\r
- </part>\r
+ <filename>acquisitions/ac1.xml</filename>\r
</test>\r
\r
<test ID="ac1get">\r
<uri>/cspace-services/acquisitions/${ac1.CSID}</uri>\r
<response>\r
<expected level="TEXT" />\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/res/ac1.res.xml</filename>\r
- </part>\r
+ <label>acquisitions_common</label>\r
+ <filename>acquisitions/res/ac1.res.xml</filename>\r
</response>\r
</test>\r
\r
<test ID="ac2" auth="test">\r
<method>POST</method>\r
<uri>/cspace-services/acquisitions/</uri>\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/ac2.xml</filename>\r
- </part>\r
+ <filename>acquisitions/ac2.xml</filename>\r
</test>\r
\r
<test ID="ac2get">\r
<uri>/cspace-services/acquisitions/${ac2.CSID}</uri>\r
<response>\r
<expected level="TEXT" />\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/res/ac2.res.xml</filename>\r
- </part>\r
+ <label>acquisitions_common</label>\r
+ <filename>acquisitions/res/ac2.res.xml</filename>\r
</response>\r
</test>\r
\r
- <!--\r
<test ID="ac3list">\r
<method>GET</method>\r
<uri>/cspace-services/acquisitions/?sortBy=&pgNum=0&pgSz=10</uri>\r
- <response>acquisitions/res/ac3list.res.xml</response>\r
<response>\r
<expected level="TEXT" />\r
- <part>\r
- <label>acquisitions_common</label>\r
- <filename>acquisitions/res/ac3list.res.xml</filename>\r
- </part>\r
+ <label>acquisitions_common</label>\r
+ <filename>acquisitions/res/ac3list.res.xml</filename>\r
</response>\r
</test>\r
- -->\r
\r
</testGroup>\r
\r
- \r
- \r
- <testGroup ID="cleanup" autoDeletePOSTS="true">\r
- <test ID="ac1" auth="test">\r
- <method>DELETE</method>\r
- <uri>/cspace-services/acquisitions/8080b6b8-393a-4e8a-b823</uri>\r
- </test>\r
- <test ID="ac1" auth="test">\r
- <method>DELETE</method>\r
- <uri>/cspace-services/acquisitions/231e8787-4d77-4eaf-8d10</uri>\r
- </test>\r
- <test ID="ac1" auth="test">\r
- <method>DELETE</method>\r
- <uri>/cspace-services/acquisitions/cbb82bbc-9513-4f83-ab4f</uri>\r
- </test>\r
- <test ID="ac1" auth="test">\r
- <method>DELETE</method>\r
- <uri>/cspace-services/acquisitions/516c2435-4560-408c-8628</uri>\r
- </test>\r
- </testGroup>\r
- \r
\r
</xmlReplay>\r
\r
<?xml version="1.0" encoding="UTF-8"?>\r
+<document name="acquisitions">\r
<ns2:acquisitions_common xmlns:ns2="http://collectionspace.org/services/acquisition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://collectionspace.org/services/acquisition http://services.collectionspace.org/acquisition/acquisitions_common.xsd">\r
<acquisitionReferenceNumber>acquisitionReferenceNumber-1</acquisitionReferenceNumber>\r
<acquisitionFundingList/>\r
</owners>\r
<fieldCollectionEventNames/>\r
</ns2:acquisitions_common>\r
+</document>\r
<?xml version="1.0" encoding="UTF-8"?>\r
+<document name="acquisitions">\r
<ns2:acquisitions_common xmlns:ns2="http://collectionspace.org/services/acquisition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://collectionspace.org/services/acquisition http://services.collectionspace.org/acquisition/acquisitions_common.xsd">\r
<acquisitionReferenceNumber>acquisitionReferenceNumber-1292275631503</acquisitionReferenceNumber>\r
<acquisitionFundingList/>\r
</owners>\r
<fieldCollectionEventNames/>\r
</ns2:acquisitions_common>\r
+</document>\r
\r
<?xml version="1.0" encoding="UTF-8"?>\r
+<document name="acquisitions">\r
<ns2:acquisitions_common xmlns:ns2="http://collectionspace.org/services/acquisition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://collectionspace.org/services/acquisition http://services.collectionspace.org/acquisition/acquisitions_common.xsd">\r
<acquisitionReferenceNumber>acquisitionReferenceNumber-1292275630222</acquisitionReferenceNumber>\r
<acquisitionFundingList/>\r
</owners>\r
<fieldCollectionEventNames/>\r
</ns2:acquisitions_common>\r
+</document>\r
\r
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<document name="acquisitions">\r
<ns3:acquisitions-common-list\r
xmlns:ns2="http://collectionspace.org/services/jaxb"\r
xmlns:ns3="http://collectionspace.org/services/acquisition">\r
<csid>549dd907-01cd-4f20-aeb7</csid>\r
</acquisition-list-item>\r
</ns3:acquisitions-common-list>\r
+</document>\r
\r
\r
<!--<protoHostPort>http://173.45.245.189:8180</protoHostPort>-->\r
<protoHostPort>http://localhost:8180</protoHostPort>\r
\r
- <!-- legal values for dumpServiceResult=[minimal,detailed,full] -->\r
- <dump payloads="true" dumpServiceResult="detailed" />\r
+ <!-- legal values for dumpServiceResult=[minimal,detailed,full,auto] -->\r
+ <dump payloads="false" dumpServiceResult="auto" />\r
\r
<auths default="admin@collectionspace.org">\r
<auth ID="admin@collectionspace.org">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
\r
<run controlFile="person/person.xml" testGroup="postPerson" />\r
<run controlFile="relation/relation.xml" testGroup="makeRelationsNested" />\r
- <run controlFile="relation/relation.xml" testGroup="r2only" />\r
- <run controlFile="person/person.xml" testGroup="postPerson" />\r
-->\r
+ \r
+ <!-- TODO: this almost works now:\r
+ <run controlFile="./security.xml" testGroup="security" />\r
+ --> \r
\r
-\r
- \r
+ <!-- These all work with POX:\r
+ <run controlFile="./security.xml" testGroup="deleteBug" />\r
+ <run controlFile="objectexit/object-exit.xml" testGroup="makeone" />\r
+ <run controlFile="relation/relation.xml" testGroup="r2only" />\r
+ <run controlFile="person/person.xml" testGroup="postPerson" />\r
+ <run controlFile="objectexit/object-exit-display.xml" testGroup="refNameDisplayNameOnly" />\r
+ <run controlFile="acquisitions/acquisitions.xml" testGroup="makeone" />\r
+ <run controlFile="acquisitions/acquisitions.xml" testGroup="testList" />\r
+ --> \r
<!-- TODO: make this an override: autoDeletePOSTS="true"-->\r
+ \r
+ \r
+ \r
+\r
</xmlReplayMaster>\r
\r
<xmlReplayMaster>\r
<protoHostPort>http://localhost:8180</protoHostPort>\r
\r
- <!-- legal values for dumpServiceResult=[minimal,detailed,full] -->\r
- <dump payloads="false" dumpServiceResult="minimal" />\r
+ <!-- legal values for dumpServiceResult=[minimal,detailed,full,auto] -->\r
+ <dump payloads="false" dumpServiceResult="auto" />\r
\r
<auths default="admin@collectionspace.org">\r
<auth ID="admin@collectionspace.org">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
-<ns2:dimensions_common\r
-xmlns:ns2="http://collectionspace.org/services/dimension"\r
-xmlns:ns3="http://collectionspace.org/services/jaxb">\r
- <dimension>dimensionType-1288727556164</dimension>\r
- <value>entryNumber-1288727556164</value>\r
- <valueDate>entryDate-1288727556164</valueDate>\r
-</ns2:dimensions_common>\r
+<document name="dimensions">\r
+ <ns2:dimensions_common\r
+ xmlns:ns2="http://collectionspace.org/services/dimension"\r
+ xmlns:ns3="http://collectionspace.org/services/jaxb">\r
+ <dimension>dimensionType-1288727556164</dimension>\r
+ <value>entryNumber-1288727556164</value>\r
+ <valueDate>entryDate-1288727556164</valueDate>\r
+ </ns2:dimensions_common>\r
+</document>\r
\r
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
-<ns2:dimensions_common\r
-xmlns:ns2="http://collectionspace.org/services/dimension"\r
-xmlns:ns3="http://collectionspace.org/services/jaxb">\r
- <dimension>dimensionType-1288727552274</dimension>\r
- <value>updated-entryNumber-1288727552274</value>\r
- <valueDate>updated-entryDate-1288727552274</valueDate>\r
-</ns2:dimensions_common>\r
-\r
+<document name="dimensions">\r
+ <ns2:dimensions_common\r
+ xmlns:ns2="http://collectionspace.org/services/dimension"\r
+ xmlns:ns3="http://collectionspace.org/services/jaxb">\r
+ <dimension>dimensionType-1288727552274</dimension>\r
+ <value>updated-entryNumber-1288727552274</value>\r
+ <valueDate>updated-entryDate-1288727552274</valueDate>\r
+ </ns2:dimensions_common>\r
+</document>\r
<test ID="oePersonGET">\r
<method>GET</method>\r
<uri>/cspace-services/personauthorities/${oePersonauthority.CSID}/items/${oePerson.CSID}</uri>\r
- <!--\r
- TODO: this response can't be validated because HttpTraffic object doesn't know\r
- how to parse new POX format.\r
- <response>\r
- <expected level="ADDOK" />\r
- <part>\r
- <label>persons_common</label>\r
- <filename>objectexit/res/oePersonDisplayGET.res.xml</filename>\r
- <var ID="displayName">${oePerson.sent("persons_common","//displayName")}</var>\r
- <var ID="refName">urn:cspace:collectionspace.org:Personauthorities(${oePersonauthority.sent("personauthorities_common","//shortIdentifier")}):items(foobar)'${oePerson.sent("persons_common","//displayName")}'</var>\r
- </part>\r
+ <response>\r
+ <expected level="ADDOK" /><!--server adds the csid -->\r
+ <label>persons_common</label>\r
+ <filename>objectexit/res/oePersonDisplayGET.res.xml</filename>\r
+ <vars>\r
+ <!-- TODO: .got is not namespace aware yet, so you must make the xpath work around it for now.-->\r
+ <var ID="csidGot">${oePersonGET.got("//csid")}</var> \r
+ <var ID="inAuthority">${oePersonauthority.CSID}</var>\r
+ <var ID="displayName">${oePerson.sent("//displayName")}</var>\r
+ <var ID="refName">urn:cspace:collectionspace.org:Personauthorities(${oePersonauthority.sent("//shortIdentifier")}):items(foobar)'${oePerson.sent("//displayName")}'</var>\r
+ </vars>\r
</response>\r
- -->\r
</test>\r
</testGroup>\r
\r
<method>GET</method>\r
<uri>/cspace-services/objectexit/${oe1.CSID}</uri>\r
<response>\r
-\r
<expected level="ADDOK" />\r
- <!-- TODO: this is a bit funky right now (2011-03-31) because collectionspace_core adds things like createdAt, which are all part of the POX payload now -->\r
-\r
<filename>objectexit/res/oe2.res.xml</filename>\r
+ <label>objectexit_common</label>\r
+ </response>\r
+ </test>\r
+ </testGroup>\r
+ \r
+ <testGroup ID="testStartName" autoDeletePOSTS="false">\r
+ <test ID="oe1" auth="test">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/objectexit/</uri>\r
+ <filename>objectexit/oe1.xml</filename>\r
+ </test>\r
+ <test ID="oe2">\r
+ <method>GET</method>\r
+ <uri>/cspace-services/objectexit/${oe1.CSID}</uri>\r
+ <response>\r
+ <expected level="ADDOK" />\r
+ <filename>objectexit/res/oe2.res.xml</filename>\r
+ <!-- startElement wins over partName. partName adorns the partName with /document/*[local-name()='$partName'] where $partName is the element value. -->\r
+ <startElement>/document/*[local-name()='objectexit_common']</startElement>\r
</response>\r
</test>\r
</testGroup>\r
<uri>/cspace-services/objectexit/${oe1.CSID}</uri>\r
<response>\r
<expected level="TEXT" />\r
- <part>\r
- <label>objectexit_common</label>\r
- <filename>objectexit/res/oe2.res.xml</filename>\r
- </part>\r
+ <label>objectexit_common</label>\r
+ <filename>objectexit/res/oe2.res.xml</filename>\r
</response>\r
</test>\r
</testGroup>\r
<method>GET</method>\r
<uri>/cspace-services/objectexit/${oe1.CSID}</uri>\r
<response>\r
- <part>\r
- <label>objectexit_common</label>\r
- <filename>objectexit/res/oe2.res.xml</filename>\r
- </part>\r
+ <label>objectexit_common</label>\r
+ <filename>objectexit/res/oe2.res.xml</filename>\r
</response>\r
</test>\r
<test ID="oe3">\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<document name="persons">
+ <ns2:persons_common xmlns:ns2="http://collectionspace.org/services/person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <nationalities />
+ <shortDisplayName />
+ <schoolsOrStyles />
+ <groups />
+ <occupations />
+ <displayNameComputed>false</displayNameComputed>
+ <inAuthority>${inAuthority}</inAuthority>
+ <displayName>Finbar the DisplayName</displayName>
+ </ns2:persons_common>
+ <ns2:collectionspace_core xmlns:ns2="http://collectionspace.org/collectionspace_core/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <tenantId>1</tenantId>
+ <updatedAt>2011-04-23T23:02:16Z</updatedAt>
+ <createdAt>2011-04-23T23:02:16Z</createdAt>
+ </ns2:collectionspace_core>
+ <ns2:account_permission xmlns:ns2="http://collectionspace.org/services/authorization">
+ <account>
+ <accountId>6b296c92-bb90-42d8-a804-3ec87c5e21d6</accountId>
+ <userId>admin@collectionspace.org</userId>
+ </account>
+ <permission>
+ <permRelationshipId>70</permRelationshipId>
+ <permissionId>1aa2c5b8-ce60-412b-bb45-cadba34fab7d</permissionId>
+ <resourceName>/personauthorities/*/items/*/workflow/</resourceName>
+ <actionGroup>CRUDL</actionGroup>
+ </permission>
+ <permission>
+ <permRelationshipId>71</permRelationshipId>
+ <permissionId>a7f67d3d-ecee-41a5-9b8d-5a7f89345caa</permissionId>
+ <resourceName>persons</resourceName>
+ <actionGroup>CRUDL</actionGroup>
+ </permission>
+ </ns2:account_permission>
+</document>
+
<auth ID="bigbird2010">YmlnYmlyZDIwMTA6YmlnYmlyZDIwMTA=</auth>\r
<auth ID="elmo2010">ZWxtbzIwMTA6ZWxtbzIwMTA=</auth>\r
</auths>\r
+ \r
+ \r
+ <testGroup ID="deleteBug" autoDeletePOSTS="false">\r
+ <test ID="permElmo">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/authorization/permissions</uri>\r
+ <filename>security/2-elmo-permission.xml</filename>\r
+ </test>\r
+ <test ID="elmoPermroles">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/authorization/permissions/${permElmo.CSID}/permroles</uri>\r
+ <filename>security/10-permissionroles-elmo.xml</filename>\r
+ </test>\r
+ <test ID="accountElmo">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/accounts</uri>\r
+ <filename>security/6-account-elmo.xml</filename>\r
+ </test>\r
+\r
+ <test ID="dimension1" auth="admin@collectionspace.org">\r
+ <method>POST</method>\r
+ <uri>/cspace-services/dimensions/</uri>\r
+ <filename>dimension/1.xml</filename>\r
+ </test>\r
+ <test ID="dimensionElmoDELETE" auth="elmo2010">\r
+ <expectedCodes>403</expectedCodes>\r
+ <method>DELETE</method>\r
+ <fromTestID>dimension1</fromTestID>\r
+ </test>\r
+ <test ID="dimensionAdminDELETE" auth="admin@collectionspace.org">\r
+ <method>DELETE</method>\r
+ <fromTestID>dimension1</fromTestID>\r
+ </test>\r
+ <test ID="deleteElmoPermroles">\r
+ <method>DELETE</method>\r
+ <uri>/cspace-services/authorization/permissions/${permElmo.CSID}/permroles</uri>\r
+ </test>\r
+ <test ID="deleteAccountElmo">\r
+ <method>DELETE</method>\r
+ <fromTestID>accountElmo</fromTestID>\r
+ </test>\r
+ </testGroup>\r
+ \r
+ \r
<testGroup ID="security" autoDeletePOSTS="false">\r
\r
<!--First test that bigbird2010 does NOT have write access: -->\r
<expectedCodes>401,500,501</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
\r
<!--Next, set up permissions and roles, and test bigbird2010 and elmo2010. -->\r
<test ID="dimension1" auth="bigbird2010">\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimension2">\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimension1.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
<test>\r
<method>GET</method>\r
<expectedCodes>403</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimensionElmoPUT">\r
<expectedCodes>403</expectedCodes>\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimension1.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
<test ID="dimensionElmoGET">\r
<method>GET</method>\r
-->\r
\r
\r
- <test auth="admin@collectionspace.org">\r
+ <test ID="dimensionBigBirdDELETEpermroles" auth="admin@collectionspace.org">\r
<method>DELETE</method>\r
<uri>/cspace-services/authorization/permissions/${permBigbird.CSID}/permroles</uri>\r
<!-- don't do <fromTestID>, no CSID of permrole on end of url, but deleteURL will put one there for you, so don't use it.\r
<expectedCodes>403,404</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimensionBigbirdPUTAfterPermrolesDeleted">\r
<expectedCodes>404</expectedCodes>\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimension1.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
\r
\r
<expectedCodes>401,403,500,501</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
\r
<!--Next, set up permissions and roles, and test bigbird2010.-->\r
<test ID="dimensionBigbird_POST" auth="bigbird2010">\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<!-- TODO: FAILING, BUT SHOULD SUCCEED. REMOVING TEST FOR NOW. -->\r
<test ID="dimensionBigbird_PUT">\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimensionBigbird_POST.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
\r
\r
<expectedCodes>403,404</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_PUT_AfterPermrolesDeleted">\r
<expectedCodes>403,404,405</expectedCodes><!-- Expected failure because dimensionBigbird_POST_AfterPermrolesDeleted failed.-->\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimensionBigbird_POST_AfterPermrolesDeleted.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_GET_AfterPermrolesDeleted">\r
<expectedCodes>403,404</expectedCodes>\r
<test ID="dimensionBigbird_POST_CRU" auth="bigbird2010">\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_PUT_CRU">\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimensionBigbird_POST_CRU.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_GET_CRU">\r
<method>GET</method>\r
<expectedCodes>403,404</expectedCodes>\r
<method>POST</method>\r
<uri>/cspace-services/dimensions/</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/1.xml</filename>\r
- </part>\r
+ <filename>dimension/1.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_PUT_R">\r
<expectedCodes>403,404,405</expectedCodes>\r
<method>PUT</method>\r
<uri>/cspace-services/dimensions/${dimensionBigbird_POST_R.CSID}</uri>\r
- <part>\r
- <label>dimensions_common</label>\r
- <filename>dimension/2-put.xml</filename>\r
- </part>\r
+ <filename>dimension/2-put.xml</filename>\r
</test>\r
<test ID="dimensionBigbird_GET_R">\r
<method>GET</method>\r
</test>\r
\r
<!-- CLEANUP -->\r
+ \r
+ <test ID="deletePermrolesBigbird" auth="admin@collectionspace.org">\r
+ <msg>Deleting permroles from bigbird2010</msg>\r
+ <method>DELETE</method>\r
+ <uri>/cspace-services/authorization/permissions/${permBigbird.CSID}/permroles</uri>\r
+ </test>\r
<test auth="admin@collectionspace.org">\r
<method>DELETE</method>\r
<uri>/cspace-services/accounts/${accountBigbird.CSID}/accountroles</uri>\r
<method>DELETE</method>\r
<fromTestID>accountBigbird</fromTestID>\r
</test>\r
+ \r
</testGroup>\r
\r
<!-- proposed simplification for re-runs:\r
<tenant_id>1</tenant_id>\r
</tenants>\r
</ns2:accounts_common>\r
+\r
<xmlReplayMaster>\r
<protoHostPort>http://localhost:8180</protoHostPort>\r
\r
- <!-- legal values for dumpServiceResult=[minimal,detailed,full] -->\r
- <dump payloads="false" dumpServiceResult="minimal" />\r
+ <!-- legal values for dumpServiceResult=[minimal,detailed,full,auto] -->\r
+ <dump payloads="false" dumpServiceResult="auto" />\r
\r
<auths default="admin@collectionspace.org">\r
<auth ID="admin@collectionspace.org">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
</auths>\r
\r
- <!-- run controlFile="./xml-replay-self-test.xml" testGroup="selftestGroup" / -->\r
-\r
+ <!-- commenting out... I think this runs from test code anyway... \r
+ <run controlFile="./xml-replay-self-test.xml" testGroup="selftestGroup" />\r
+ -->\r
</xmlReplayMaster>\r
\r
<xmlReplayMaster>\r
<protoHostPort>http://localhost:8180</protoHostPort>\r
\r
- <!-- legal values for dumpServiceResult=[minimal,detailed,full] -->\r
- <dump payloads="false" dumpServiceResult="minimal" />\r
+ <!-- legal values for dumpServiceResult=[minimal,detailed,full,auto] -->\r
+ <dump payloads="false" dumpServiceResult="auto" />\r
\r
<auths default="admin@collectionspace.org">\r
<auth ID="admin@collectionspace.org">YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y</auth>\r
<!-- run controlFile="objectexit/object-exit.xml" testGroup="CRUDL" / -->\r
<!-- run controlFile="objectexit/object-exit.xml" testGroup="domwalk" / -->\r
<!--<run controlFile="media/media.xml" testGroup="authrefs" />-->\r
- <!--<run controlFile="acquisitions/acquisitions.xml" testGroup="testList" />-->\r
\r
<!--<run controlFile="./organization.xml" testGroup="organization" />-->\r
\r
<!--\r
<run controlFile="relation/relation.xml" testGroup="makeRelations" />\r
<run controlFile="person/person.xml" testGroup="updatePerson" />\r
- -->\r
+ -->\r
+ \r
+ <run controlFile="./security.xml" testGroup="deleteBug" />\r
+ <run controlFile="objectexit/object-exit.xml" testGroup="makeone" />\r
+ <run controlFile="objectexit/object-exit-display.xml" testGroup="refNameDisplayNameOnly" />\r
+ <run controlFile="acquisitions/acquisitions.xml" testGroup="makeone" />\r
+ <run controlFile="acquisitions/acquisitions.xml" testGroup="testList" />\r
+ <run controlFile="relation/relation.xml" testGroup="makeRelations" />\r
<run controlFile="relation/relation.xml" testGroup="r2only" />\r
<run controlFile="person/person.xml" testGroup="postPerson" />\r
- \r
+ <run controlFile="person/person.xml" testGroup="updatePerson" />\r
+ \r
+ \r
\r
</xmlReplayMaster>\r
\r
return !notEmpty(str);\r
}\r
\r
+ /** nulls, empty strings, and empty after trim() are considered blank. */\r
+ public static boolean isBlank(String str){\r
+ return !notBlank(str);\r
+ }\r
+\r
/** Handles null strings as empty. */\r
public static boolean notEmpty(String str){\r
if (str==null) return false;\r