From b2e63e38405c9d0f91877808c869f5afa8cc9fc9 Mon Sep 17 00:00:00 2001 From: Laramie Crocker Date: Sat, 4 Dec 2010 00:24:16 +0000 Subject: [PATCH] CSPACE-338 Added domwalk capability to look for repeating fields in any order, SUCCESS as long as repeatables dom-match in whatever order. --- .../xmlreplay/ServiceResult.java | 4 + .../xmlreplay/XmlCompareJdom.java | 143 +++++++++++++++--- .../IntegrationTests/xmlreplay/XmlReplay.java | 37 ++++- .../test-data/xmlreplay/dev-master.xml | 5 +- .../xmlreplay/objectexit/object-exit.xml | 54 ++++++- .../xmlreplay/objectexit/res/oe2.res.xml | 14 +- .../xmlreplay/objectexit/res/oe6.res.xml | 37 ++++- .../test-data/xmlreplay/xml-replay-master.xml | 2 +- 8 files changed, 248 insertions(+), 48 deletions(-) diff --git a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/ServiceResult.java b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/ServiceResult.java index fae8764ec..6f98dfad1 100755 --- a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/ServiceResult.java +++ b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/ServiceResult.java @@ -120,6 +120,10 @@ public class ServiceResult { } break; case TEXT: + if (!value.treesMatch()) { + failureReason = " : DOM TREE MISMATCH; "; + return false; + } if (value.countFor(TreeWalkResults.TreeWalkEntry.STATUS.TEXT_DIFFERENT)>0) { failureReason = " : DOM TEXT_DIFFERENT; "; return false; diff --git a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlCompareJdom.java b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlCompareJdom.java index 18d510657..bf7d3ee8b 100755 --- a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlCompareJdom.java +++ b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlCompareJdom.java @@ -38,6 +38,7 @@ import java.util.List; import java.util.Map; import org.collectionspace.services.IntegrationTests.xmlreplay.TreeWalkResults.TreeWalkEntry; +import org.jdom.output.XMLOutputter; /** * User: laramie @@ -124,6 +125,7 @@ private static final String DEFAULT_SAX_DRIVER_CLASS = "org.apache.xerces.parser } List l = left.getChildren(); Map foundRightMap = new HashMap(); + List foundRepeatingList = new ArrayList(); boolean result = true; for (Object o : l) { if (!(o instanceof Element)){ @@ -135,33 +137,49 @@ private static final String DEFAULT_SAX_DRIVER_CLASS = "org.apache.xerces.parser continue; } String leftChildPath = Tools.glue(parentPath, "/", leftChildName); - Element rightChild = (Element)selectSingleNode(right,leftChildName); - if (rightChild == null){ - TreeWalkEntry entry = new TreeWalkEntry(); - entry.lpath = leftChildPath; - entry.status = TreeWalkEntry.STATUS.R_MISSING; - msgList.add(entry); + + if (foundRepeatingList.indexOf(leftChildPath)>=0){ continue; } - foundRightMap.put(leftChildName, "OK"); - String leftChildTextTrim = leftChild.getText().trim(); - String rightChildTextTrim = rightChild.getText().trim(); - TreeWalkEntry entry = new TreeWalkEntry(); - entry.ltextTrimmed = leftChildTextTrim; - entry.rtextTrimmed = rightChildTextTrim; - entry.lpath = leftChildPath; - entry.rpath = leftChildPath; //same - - if (leftChildTextTrim.equals(rightChildTextTrim)){ - entry.status = TreeWalkEntry.STATUS.MATCHED; - msgList.add(entry); + List leftlist = select(left, leftChildName); + if (leftlist != null && leftlist.size() > 1){ + //System.out.println("-----------------doRepeating------"+leftChildPath); + foundRepeatingList.add(leftChildPath); + boolean repeatingIdentical = + doRepeatingFieldComparison(leftlist, leftChildPath, leftChildName, left, right, msgList) ; //todo: deal with foundRightMap in this repeating field block. + if ( ! repeatingIdentical ){ + //System.out.println("\r\n\r\n\r\n*****************************\r\nOne repeating field failed: "+msgList); + return false; + } + foundRightMap.put(leftChildName, "OK"); } else { - entry.status = TreeWalkEntry.STATUS.TEXT_DIFFERENT; - msgList.add(entry); - } + Element rightChild = (Element)selectSingleNode(right,leftChildName); + if (rightChild == null){ + TreeWalkEntry entry = new TreeWalkEntry(); + entry.lpath = leftChildPath; + entry.status = TreeWalkEntry.STATUS.R_MISSING; + msgList.add(entry); + continue; + } + foundRightMap.put(leftChildName, "OK"); + String leftChildTextTrim = leftChild.getText().trim(); + String rightChildTextTrim = rightChild.getText().trim(); + TreeWalkEntry entry = new TreeWalkEntry(); + entry.ltextTrimmed = leftChildTextTrim; + entry.rtextTrimmed = rightChildTextTrim; + entry.lpath = leftChildPath; + entry.rpath = leftChildPath; //same - //============ DIVE !! ===================================================== - result = result && treeWalk( leftChild, rightChild, leftChildPath, msgList); + if (leftChildTextTrim.equals(rightChildTextTrim)){ + entry.status = TreeWalkEntry.STATUS.MATCHED; + msgList.add(entry); + } else { + entry.status = TreeWalkEntry.STATUS.TEXT_DIFFERENT; + msgList.add(entry); + } + //============ DIVE !! ===================================================== + result = result && treeWalk( leftChild, rightChild, leftChildPath, msgList); + } } for (Object r : right.getChildren()){ if (!(r instanceof Element)){ @@ -180,5 +198,82 @@ private static final String DEFAULT_SAX_DRIVER_CLASS = "org.apache.xerces.parser } return true; } - + + private static void dumpXML_OUT(Element el) throws Exception { + XMLOutputter outputter = new XMLOutputter(); + outputter.output(el, System.out); + } + private static String dumpXML(Element el) throws Exception { + XMLOutputter outputter = new XMLOutputter(); + return outputter.outputString(el); + } + + public static boolean doRepeatingFieldComparison(List leftList, String leftChildPath, String leftChildName, Element left, Element right, TreeWalkResults msgList) + throws Exception { + //todo: deal with foundRightMap in this repeating field block. + List rightList = select(right, leftChildName); + if (rightList == null || rightList.size() == 0 || rightList.size() < leftList.size()){ + TreeWalkEntry twe = new TreeWalkEntry(); + twe.lpath = leftChildPath; + twe.status = TreeWalkEntry.STATUS.R_MISSING; + String rmsg = (rightList == null) + ? " Right: 0" + : " Right: "+rightList.size(); + twe.message = "Repeating field count not matched. Field: "+leftChildPath+" Left: "+leftList.size()+rmsg; + msgList.add(twe); + return false; + } + if (rightList.size() > leftList.size()){ + TreeWalkEntry twe = new TreeWalkEntry(); + twe.lpath = leftChildPath; + twe.status = TreeWalkEntry.STATUS.R_ADDED; + twe.message = "Repeating field count not matched. Field: "+leftChildPath+" Left: "+leftList.size()+" Right: "+rightList.size(); + msgList.add(twe); + return false; + } + + for (Object le : leftList){ + boolean found = false; + Element leftEl = (Element)le; + //pl("left", leftEl); + for(Object re : rightList){ + Element rightEl = (Element)re; + //pl("right", rightEl); + TreeWalkResults msgListInner = new TreeWalkResults(); + treeWalk(leftEl, rightEl, leftChildPath, msgListInner); + if (msgListInner.isStrictMatch()){ + found = true; + TreeWalkEntry twe = new TreeWalkEntry(); + twe.lpath = leftChildPath; + twe.status = TreeWalkEntry.STATUS.MATCHED; + msgList.add(twe); + //System.out.println("===========================\r\nfound match for "+leftEl+"\r\n===========================\r\n"); + rightList.remove(re); //found it, don't need to inspect this element again. Since we are breaking from loop, removing element won't mess up iterator--we get a new one on the next loop. + break; + } + } + if ( ! found){ + TreeWalkEntry twe = new TreeWalkEntry(); + twe.lpath = leftChildPath; + twe.status = TreeWalkEntry.STATUS.R_MISSING; + twe.message = "Repeating field not matched. Source: {"+dumpXML(leftEl)+"}"; + msgList.add(twe); + return false; + } + } + return true; + } + + private static void pl(String name, Element el) throws Exception { + Object lobid = selectSingleNode(el, "@ID"); + String lid = ""; + if (lobid!=null){ + lid = lobid.toString(); + } + + System.out.println(name+": "+lid); + dumpXML_OUT(el); + System.out.println(); + + } } diff --git a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java index a0bdc5e98..8830fdd63 100755 --- a/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java +++ b/services/IntegrationTests/src/main/java/org/collectionspace/services/IntegrationTests/xmlreplay/XmlReplay.java @@ -362,23 +362,52 @@ public class XmlReplay { } return document; } + protected static String validateResponseSinglePayload(ServiceResult serviceResult, + Map serviceResultsMap, + PartsStruct expectedResponseParts, + XmlReplayEval evalStruct) + throws Exception { + String OK = ""; + byte[] b = FileUtils.readFileToByteArray(new File(expectedResponseParts.singlePartPayloadFilename)); + String expectedPartContent = new String(b); + expectedPartContent = evalStruct.eval(expectedPartContent, serviceResultsMap, evalStruct.jexl, evalStruct.jc); + String label = "NOLABEL"; + String leftID = "{from expected part, label:"+label+" filename: "+expectedResponseParts.singlePartPayloadFilename+"}"; + String rightID = "{from server, label:"+label + +" fromTestID: "+serviceResult.fromTestID + +" URL: "+serviceResult.fullURL + +"}"; + TreeWalkResults list = + XmlCompareJdom.compareParts(expectedPartContent, + leftID, + serviceResult.result, + rightID); + serviceResult.addPartSummary(label, list); + return OK; + } protected static String validateResponse(ServiceResult serviceResult, Map serviceResultsMap, - PartsStruct expectedResponseParts){ + PartsStruct expectedResponseParts, + XmlReplayEval evalStruct){ String OK = ""; if (expectedResponseParts == null) return OK; if (serviceResult == null) return OK; if (serviceResult.result.length() == 0) return OK; String responseDump = serviceResult.result; - //System.out.println("responseDump: "+responseDump); - PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(responseDump, serviceResult.boundary, serviceResult.contentLength); try { + if (expectedResponseParts.bDoingSinglePartPayload){ + return validateResponseSinglePayload(serviceResult, serviceResultsMap, expectedResponseParts, evalStruct); + } + //System.out.println("responseDump: "+responseDump); + PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(responseDump, serviceResult.boundary, serviceResult.contentLength); + for (int i=0; i\r\n"+expectedPartContent); PayloadLogger.Part partFromServer = traffic.getPart(label); String partFromServerContent = ""; @@ -612,7 +641,7 @@ public class XmlReplay { serviceResult.payloadStrictness = level; } - String vError = validateResponse(serviceResult, serviceResultsMap, expectedResponseParts); + String vError = validateResponse(serviceResult, serviceResultsMap, expectedResponseParts, evalStruct); if (Tools.notEmpty(vError)){ serviceResult.error = vError; serviceResult.failureReason = " : VALIDATION ERROR; "; diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/dev-master.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/dev-master.xml index 062569316..0273ee7df 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/dev-master.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/dev-master.xml @@ -12,8 +12,11 @@ - + + diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/object-exit.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/object-exit.xml index 8384db76a..673978308 100644 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/object-exit.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/object-exit.xml @@ -6,8 +6,6 @@ YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y - - @@ -45,6 +43,7 @@ + @@ -92,7 +91,11 @@ GET /cspace-services/objectexit/ - oe6.res.xml + + + objectexit/res/oe6.res.xml + + @@ -243,6 +246,51 @@ + + + + + POST + /cspace-services/objectexit/ + + + objectexit/oe1.xml + + + + POST + /cspace-services/objectexit/ + + + objectexit/oe3.xml + + + + POST + /cspace-services/objectexit/ + + + objectexit/oe4.xml + + + + POST + /cspace-services/objectexit/ + + + objectexit/oe5.xml + + + + GET + /cspace-services/objectexit/ + + + objectexit/res/oe6.res.xml + + + + diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe2.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe2.res.xml index 205bc1569..4413627b7 100755 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe2.res.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe2.res.xml @@ -3,18 +3,8 @@ xmlns:ns2="http://collectionspace.org/services/objectexit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://collectionspace.org/services/objectexit http://services.collectionspace.org/objectexit/objectexit_common.xsd"> -objectexitNumber-1290026472360 - - second content - - - - - second content - - - +objectexitNumber-1290026472360 urn:cspace:org.collectionspace.demo:orgauthority:name(TestOrgAuth):organization:name(Northern Climes Museum)'Northern Climes Museum' -objectexitNumber-1290026472360 + diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe6.res.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe6.res.xml index 82e7a1159..0704abb0c 100755 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe6.res.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/objectexit/res/oe6.res.xml @@ -1,5 +1,36 @@ - - 04044currentOwner|depositor|exitDate|exitMethod|exitNote|exitNumber|exitReason|packingNote|uri|csidobjectexitNumber-1290026473391/objectexit/${oe3.CSID}${oe3.CSID}objectexitNumber-1290026473626/objectexit/${oe4.CSID}${oe4.CSID}objectexitNumber-1290026473860/objectexit/${oe5.CSID}${oe5.CSID}objectexitNumber-1290026472360/objectexit/${oe1.CSID}${oe1.CSID} + + 0 + 40 + 4 + 4 + exitNumber|currentOwner|uri|csid + + + objectexitNumber-1290026473860 + /objectexit/${oe5.CSID} + ${oe5.CSID} + + + + objectexitNumber-1290026473391 + /objectexit/${oe3.CSID} + ${oe3.CSID} + + + + objectexitNumber-1290026473626 + /objectexit/${oe4.CSID} + ${oe4.CSID} + + + + objectexitNumber-1290026472360 + /objectexit/${oe1.CSID} + ${oe1.CSID} + + + diff --git a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/xml-replay-master.xml b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/xml-replay-master.xml index 896e3c0f3..d70645fbf 100755 --- a/services/IntegrationTests/src/test/resources/test-data/xmlreplay/xml-replay-master.xml +++ b/services/IntegrationTests/src/test/resources/test-data/xmlreplay/xml-replay-master.xml @@ -3,7 +3,7 @@ http://localhost:8180 - + YWRtaW5AY29sbGVjdGlvbnNwYWNlLm9yZzpBZG1pbmlzdHJhdG9y -- 2.47.3