]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
26b877cec8ff4d56610f55cda102ab6708f8d634
[tmp/jakarta-migration.git] /
1 /**\r
2  * This document is a part of the source code and related artifacts\r
3  * for CollectionSpace, an open source collections management system\r
4  * for museums and related institutions:\r
5  *\r
6  * http://www.collectionspace.org\r
7  * http://wiki.collectionspace.org\r
8  *\r
9  * Copyright (c) 2009 Regents of the University of California\r
10  *\r
11  * Licensed under the Educational Community License (ECL), Version 2.0.\r
12  * You may not use this file except in compliance with this License.\r
13  *\r
14  * You may obtain a copy of the ECL 2.0 License at\r
15  * https://source.collectionspace.org/collection-space/LICENSE.txt\r
16  *\r
17  *  Unless required by applicable law or agreed to in writing, software\r
18  *  distributed under the License is distributed on an "AS IS" BASIS,\r
19  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
20  *  See the License for the specific language governing permissions and\r
21  *  limitations under the License.\r
22  */\r
23 \r
24 package org.collectionspace.services.IntegrationTests.xmlreplay;\r
25 \r
26 import org.apache.commons.httpclient.Header;\r
27 import org.collectionspace.services.common.api.Tools;\r
28 \r
29 import java.util.ArrayList;\r
30 import java.util.HashMap;\r
31 import java.util.List;\r
32 import java.util.Map;\r
33 \r
34 /**\r
35  * User: laramie\r
36  * $LastChangedRevision:  $\r
37  * $LastChangedDate:  $\r
38  */\r
39 public class ServiceResult {\r
40     public String testID = "";\r
41     public String testGroupID = "";\r
42     public String fullURL = "";\r
43     public String deleteURL = "";\r
44     public String location = "";\r
45     public String CSID = "";\r
46     public String subresourceCSID = "";\r
47     public String requestPayload = "";  //just like requestPayloadRaw, but may have multipart boundary and headers.\r
48     public String requestPayloadsRaw = "";\r
49     public String result = "";\r
50     public int responseCode = 0;\r
51     public String responseMessage = "";\r
52     public String method = "";\r
53     public String error = "";\r
54     public String fromTestID = "";\r
55     public String auth = "";\r
56     public String boundary = "";\r
57     public String payloadStrictness = "";\r
58     public long contentLength = 0;\r
59     public String failureReason = "";\r
60     public Header[] responseHeaders = new Header[0];\r
61     public List<Integer> expectedCodes = new ArrayList<Integer>();\r
62     public Map<String,String>  vars = new HashMap<String,String>();\r
63     public void addVars(Map<String,String> newVars){\r
64         vars.putAll(newVars);\r
65     }\r
66     private Map<String, TreeWalkResults> partSummaries = new HashMap<String, TreeWalkResults>();\r
67     public void addPartSummary(String label, TreeWalkResults list){\r
68         partSummaries.put(label, list);\r
69     }\r
70     public String partsSummary(boolean detailed){\r
71         StringBuffer buf = new StringBuffer();\r
72         if (!isDomWalkOK()){\r
73             if (detailed) buf.append("\r\nDOM CHECK FAILED:\r\n");\r
74             else buf.append("; DOM CHECK FAILED:");\r
75         }\r
76         for (Map.Entry<String,TreeWalkResults> entry : partSummaries.entrySet()) {\r
77             String key = entry.getKey();\r
78             TreeWalkResults value = entry.getValue();\r
79             buf.append(" label:"+key+": ");\r
80             if (detailed){\r
81                 buf.append("\r\n");\r
82                 buf.append(value.fullSummary());\r
83             } else {\r
84                 buf.append(value.miniSummary());\r
85             }\r
86 \r
87         }\r
88         return buf.toString();\r
89     }\r
90     public boolean codeInSuccessRange(int code){\r
91         if (0<=code && code<200){\r
92             return false;\r
93         } else if (400<=code) {\r
94             return false;\r
95         }\r
96         return true;\r
97     }\r
98 \r
99     public boolean isDomWalkOK(){\r
100         if (Tools.isEmpty(payloadStrictness)){\r
101             return true;\r
102         }\r
103         PAYLOAD_STRICTNESS strictness = PAYLOAD_STRICTNESS.valueOf(payloadStrictness);\r
104         for (Map.Entry<String,TreeWalkResults> entry : partSummaries.entrySet()) {\r
105             String key = entry.getKey();\r
106             TreeWalkResults value = entry.getValue();\r
107             if (value.hasDocErrors()){\r
108                 failureReason = " : DOM DOC_ERROR; ";\r
109                 return false;\r
110             }\r
111             switch (strictness){\r
112             case STRICT:\r
113                 if (!value.isStrictMatch()) {\r
114                     failureReason = " : DOM NOT STRICT; ";\r
115                     return false;\r
116                 }\r
117                 break;\r
118             case ADDOK:\r
119                 if (value.countFor(TreeWalkResults.TreeWalkEntry.STATUS.TEXT_DIFFERENT)>0) {\r
120                     failureReason = " : DOM TEXT_DIFFERENT; ";\r
121                     return false;\r
122                 }\r
123                 if (value.countFor(TreeWalkResults.TreeWalkEntry.STATUS.R_MISSING)>0){\r
124                     failureReason = " : DOM R_MISSING; ";\r
125                     return false;\r
126                 }\r
127                 break;\r
128             case TEXT:\r
129                 if (value.countFor(TreeWalkResults.TreeWalkEntry.STATUS.TEXT_DIFFERENT)>0) {\r
130                     failureReason = " : DOM TEXT_DIFFERENT; ";\r
131                     return false;\r
132                 }\r
133                 break;\r
134             case TREE:\r
135                 if (!value.treesMatch()) {\r
136                     failureReason = " : DOM TREE MISMATCH; ";\r
137                     return false;\r
138                 }\r
139                 break;\r
140             case TREE_TEXT:\r
141                 if (value.countFor(TreeWalkResults.TreeWalkEntry.STATUS.TEXT_DIFFERENT)>0) {\r
142                     failureReason = " : DOM TEXT_DIFFERENT; ";\r
143                     return false;\r
144                 }\r
145                 if (!value.treesMatch()) {\r
146                     failureReason = " : DOM TREE MISMATCH; ";\r
147                     return false;\r
148                 }\r
149                 break;\r
150             case ZERO:\r
151                 break;\r
152             }\r
153         }\r
154         return true;\r
155     }\r
156 \r
157     private boolean overrideExpectedResult = false;\r
158 \r
159     /** Call this method to create a ServiceResult mock object, for when you are doing autoDelete, and you come\r
160      *  across a GET : GETs don't have a DELETE url, so they don't need to be autoDeleted, so an empty ServiceResult object\r
161      *  signifies this.\r
162      */\r
163     public void overrideGotExpectedResult(){\r
164         overrideExpectedResult = true;\r
165     }\r
166 \r
167     public boolean gotExpectedResult(){\r
168         if (overrideExpectedResult){\r
169             return true;\r
170         }\r
171         //if (Tools.notEmpty(failureReason)){\r
172         //    return false;\r
173         //}\r
174         for (Integer oneExpected : expectedCodes){\r
175             if (responseCode == oneExpected){\r
176                 failureReason = "";\r
177                 return isDomWalkOK();\r
178             }\r
179         }\r
180         if ( expectedCodes.size()>0 && codeInSuccessRange(responseCode)){ //none found, but result expected.\r
181             for (Integer oneExpected : expectedCodes){\r
182                 if ( ! codeInSuccessRange(oneExpected)){\r
183                     failureReason = "";\r
184                     return isDomWalkOK();\r
185                 }\r
186             }\r
187         }\r
188         boolean ok = codeInSuccessRange(responseCode);\r
189         if (ok) {\r
190             failureReason = "";\r
191             return isDomWalkOK();\r
192         }\r
193         failureReason = " : STATUS CODE UNEXPECTED; ";\r
194         return false;\r
195     }\r
196 \r
197     //public static final String[] DUMP_OPTIONS = {"minimal", "detailed", "full"};\r
198     public static enum DUMP_OPTIONS {minimal, detailed, full, auto};\r
199 \r
200     public static enum PAYLOAD_STRICTNESS {ZERO, ADDOK, TREE, TEXT, TREE_TEXT, STRICT};\r
201 \r
202     public String toString(){\r
203         return detail(true);\r
204 \r
205     }\r
206 \r
207     private static final String LINE = "\r\n==================================";\r
208     private static final String CRLF = "\r\n";\r
209 \r
210     public String detail(boolean includePayloads){\r
211         String res =  "{"\r
212                 + ( gotExpectedResult() ? "SUCCESS" : "FAILURE"  )\r
213                 + failureReason\r
214                 +"; "+method\r
215                 +"; "+responseCode\r
216                 + ( (expectedCodes.size()>0) ? "; expectedCodes:"+expectedCodes : "" )\r
217                 + ( Tools.notEmpty(testID) ? "; testID:"+testID : "" )\r
218                 + ( Tools.notEmpty(testGroupID) ? "; testGroupID:"+testGroupID : "" )\r
219                 + ( Tools.notEmpty(fromTestID) ? "; fromTestID:"+fromTestID : "" )\r
220                 + ( Tools.notEmpty(responseMessage) ? "; msg:"+responseMessage : "" )\r
221                 +"; URL:"+fullURL\r
222                 +"; auth: "+auth\r
223                 + ( Tools.notEmpty(deleteURL) ? "; deleteURL:"+deleteURL : "" )\r
224                 + ( Tools.notEmpty(location) ? "; location.CSID:"+location : "" )\r
225                 + ( Tools.notEmpty(error) ? "; ERROR:"+error : "" )\r
226                 + "; gotExpected:"+gotExpectedResult()\r
227                 //+";result:"+result+";"\r
228                 + ( partsSummary(true))\r
229                 +"}"\r
230                 + ( includePayloads && Tools.notBlank(requestPayload) ? LINE+"requestPayload:"+LINE+CRLF+requestPayload+LINE : "" )\r
231                 + ( includePayloads && Tools.notBlank(result) ? LINE+"result:"+LINE+CRLF+result : "" );\r
232         return res;\r
233     }\r
234 \r
235     public String minimal(){\r
236         return minimal(false);\r
237     }\r
238 \r
239     public String minimal(boolean verbosePartsSummary){\r
240         return "{"\r
241                 + ( gotExpectedResult() ? "SUCCESS" : "FAILURE"  )\r
242                 + failureReason\r
243                 + ( Tools.notEmpty(testID) ? "; "+testID : "" )\r
244                 +"; "+method\r
245                 +"; "+responseCode\r
246                 + (expectedCodes.size()>0 ? "; expected:"+expectedCodes : "")\r
247                 + ( Tools.notEmpty(responseMessage) ? "; msg:"+responseMessage : "" )\r
248                 +"; URL:"+fullURL\r
249                 //for auth, see detail()   +"; auth: "+auth\r
250                 + ( Tools.notEmpty(error) ? "; ERROR:"+error : "" )\r
251                 + (verbosePartsSummary ? partsSummary(true) : partsSummary(false) )\r
252                 +"}";\r
253     }\r
254     public String dump(ServiceResult.DUMP_OPTIONS opt, boolean hasError){\r
255         switch (opt){\r
256             case minimal:\r
257                 return minimal(false);\r
258             case detailed:\r
259                 return detail(false);\r
260             case full:\r
261                 return detail(true);\r
262             case auto:\r
263                 return minimal(hasError);\r
264             default:\r
265                 return toString();\r
266         }\r
267     }\r
268 \r
269     /** This method may be called from a test case, using a syntax like ${testID3.resValue("persons_common", "//refName")}   */\r
270     public String got(String xpath) throws Exception {\r
271         try {\r
272             //PayloadLogger.HttpTraffic traffic = PayloadLogger.readPayloads(this.result, this.boundary, this.contentLength);\r
273             //PayloadLogger.Part partFromServer = traffic.getPart(partName);\r
274             //String source = partFromServer.getContent();\r
275             String source = this.result;\r
276             if (Tools.isBlank(source)){\r
277                 return "";\r
278             }\r
279             org.jdom.Element element = (org.jdom.Element) XmlCompareJdom.selectSingleNode(source, xpath, null);  //todo: passing null for namespace may not work.\r
280             String sr = element != null ? element.getText() : "";\r
281             return sr;\r
282         } catch (Exception e){\r
283             return "ERROR reading response value: "+e;\r
284         }\r
285     }\r
286 \r
287     /** This method may be called from a test case, using a syntax like ${oe9.reqValue("personauthorities_common","//shortIdentifier")}    */\r
288     public String sent(String xpath) throws Exception {\r
289         try {\r
290             String source = this.requestPayloadsRaw;\r
291             if (source == null){\r
292                 return "ERROR:null:requestPayloadsRaw";\r
293             }\r
294             org.jdom.Element element = (org.jdom.Element) XmlCompareJdom.selectSingleNode(source, xpath, null);   //e.g. "//shortIdentifier");  //todo: passing null for namespace may not work.\r
295             String sr = element != null ? element.getText() : "";\r
296             return sr;\r
297         } catch (Exception e){\r
298             return "ERROR reading request value: "+e;\r
299         }\r
300     }\r
301 \r
302     public String get(String what){\r
303         if ("CSID".equals(what)){\r
304             return CSID;\r
305         } else if ("location".equals(what)){\r
306             return location;\r
307         } else if ("testID".equals(what)){\r
308             return testID;\r
309         } else if ("testGroupID".equals(what)){\r
310             return testGroupID;\r
311         } else if ("fullURL".equals(what)){\r
312             return fullURL;\r
313         } else if ("deleteURL".equals(what)){\r
314             return deleteURL;\r
315         } else if ("responseCode".equals(what)){\r
316             return ""+responseCode;\r
317         } else if ("method".equals(what)){\r
318             return method;\r
319         }\r
320         if (vars.containsKey(what)){\r
321             return vars.get(what);\r
322         }\r
323         return "";\r
324     }\r
325 \r
326 }\r