View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.tck.impl;
20  
21  import java.lang.reflect.Array;
22  import java.text.SimpleDateFormat;
23  import java.util.ArrayList;
24  import java.util.Calendar;
25  import java.util.Collection;
26  import java.util.List;
27  import java.util.Map;
28  import java.util.Set;
29  
30  import org.apache.chemistry.opencmis.tck.CmisTest;
31  import org.apache.chemistry.opencmis.tck.CmisTestResult;
32  import org.apache.chemistry.opencmis.tck.CmisTestResultStatus;
33  import org.junit.Test;
34  
35  /**
36   * Base class for tests.
37   */
38  public abstract class AbstractCmisTest implements CmisTest {
39  
40      private Map<String, String> parameters;
41      private AbstractCmisTestGroup group;
42      private String name;
43      private String description;
44      private boolean isEnabled = true;
45      private List<CmisTestResult> results;
46      private long time;
47  
48      @Override
49      public void init(Map<String, String> parameters) {
50          this.parameters = parameters;
51          results = new ArrayList<CmisTestResult>();
52      }
53  
54      protected Map<String, String> getParameters() {
55          return parameters;
56      }
57  
58      @Override
59      public String getName() {
60          return name;
61      }
62  
63      public void setName(String name) {
64          this.name = name;
65      }
66  
67      @Override
68      public String getDescription() {
69          return description;
70      }
71  
72      public void setDescription(String description) {
73          this.description = description;
74      }
75  
76      public void setGroup(AbstractCmisTestGroup group) {
77          this.group = group;
78      }
79  
80      public AbstractCmisTestGroup getGroup() {
81          return group;
82      }
83  
84      @Override
85      public abstract void run() throws Exception;
86  
87      @Test
88      public void junit() throws Exception {
89          JUnitHelper.run(this);
90      }
91  
92      @Override
93      public List<CmisTestResult> getResults() {
94          return results;
95      }
96  
97      @Override
98      public boolean isEnabled() {
99          return isEnabled;
100     }
101 
102     @Override
103     public void setEnabled(boolean enabled) {
104         this.isEnabled = enabled;
105     }
106 
107     @Override
108     public long getTime() {
109         return time;
110     }
111 
112     public void setTime(long time) {
113         this.time = time;
114     }
115 
116     public CmisTestResultImpl createResult(CmisTestResultStatus status, String message, Throwable exception,
117             boolean isFatal) {
118         return new CmisTestResultImpl(group.getName(), name, message, status, exception, isFatal);
119     }
120 
121     public CmisTestResultImpl createResult(CmisTestResultStatus status, String message, boolean isFatal) {
122         return new CmisTestResultImpl(group.getName(), name, message, status, null, isFatal);
123     }
124 
125     public CmisTestResultImpl createResult(CmisTestResultStatus status, String message) {
126         return new CmisTestResultImpl(group.getName(), name, message, status, null, false);
127     }
128 
129     public CmisTestResultImpl createInfoResult(String message) {
130         return new CmisTestResultImpl(group.getName(), name, message, CmisTestResultStatus.INFO, null, false);
131     }
132 
133     public void addResult(CmisTestResult result) {
134         if (result != null) {
135             if (result instanceof CmisTestResultImpl) {
136                 ((CmisTestResultImpl) result).setStackTrace(getStackTrace());
137             }
138 
139             results.add(result);
140             if (result.isFatal()) {
141                 throw new FatalTestException(result.getMessage());
142             }
143         }
144     }
145 
146     protected StackTraceElement[] getStackTrace() {
147         StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
148         StackTraceElement[] shortStackTrace = new StackTraceElement[0];
149         if (stackTrace.length > 3) {
150             shortStackTrace = new StackTraceElement[stackTrace.length - 3];
151             System.arraycopy(stackTrace, 3, shortStackTrace, 0, stackTrace.length - 3);
152         }
153 
154         return shortStackTrace;
155     }
156 
157     protected CmisTestResult addResultChild(CmisTestResult result, CmisTestResult child) {
158         if (result == null) {
159             return null;
160         }
161 
162         result.getChildren().add(child);
163 
164         return result;
165     }
166 
167     // --- helpers ----
168 
169     protected String formatValue(Object o) {
170         if (o == null) {
171             return "null";
172         }
173 
174         if (o instanceof String) {
175             return "'" + o + "'";
176         } else if (o instanceof Calendar) {
177             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
178             return sdf.format(((Calendar) o).getTime());
179         }
180 
181         return o.toString();
182     }
183 
184     // --- asserts ----
185 
186     protected boolean isEqual(Object expected, Object actual) {
187         if (expected == null && actual == null) {
188             return true;
189         }
190 
191         if (expected != null && expected.equals(actual)) {
192             return true;
193         }
194 
195         return false;
196     }
197 
198     protected CmisTestResult assertIsTrue(Boolean test, CmisTestResult success, CmisTestResult failure) {
199         if (test != null && test) {
200             return success;
201         }
202 
203         if (test == null) {
204             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Null!"));
205         } else {
206             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "False!"));
207         }
208     }
209 
210     protected CmisTestResult assertIsFalse(Boolean test, CmisTestResult success, CmisTestResult failure) {
211         if (test != null && !test) {
212             return success;
213         }
214 
215         if (test == null) {
216             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Null!"));
217         } else {
218             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "True!"));
219         }
220     }
221 
222     protected CmisTestResult assertNull(Object object, CmisTestResult success, CmisTestResult failure) {
223         if (object == null) {
224             return success;
225         }
226 
227         return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Object is not null!"));
228     }
229 
230     protected CmisTestResult assertNotNull(Object object, CmisTestResult success, CmisTestResult failure) {
231         if (object != null) {
232             return success;
233         }
234 
235         return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Object is null!"));
236     }
237 
238     protected CmisTestResult assertStringNullOrEmpty(String str, CmisTestResult success, CmisTestResult failure) {
239         if (str == null || str.length() == 0) {
240             return success;
241         }
242 
243         return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "String has this value: " + str));
244     }
245 
246     protected CmisTestResult assertStringNotEmpty(String str, CmisTestResult success, CmisTestResult failure) {
247         if (str != null && str.length() > 0) {
248             return success;
249         }
250 
251         if (str == null) {
252             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "String is null!"));
253         } else {
254             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "String is empty!"));
255         }
256     }
257 
258     protected CmisTestResult assertListNotEmpty(List<?> list, CmisTestResult success, CmisTestResult failure) {
259         if (list != null && !list.isEmpty()) {
260             return success;
261         }
262 
263         if (list == null) {
264             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "List is null!"));
265         } else {
266             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "List is empty!"));
267         }
268     }
269 
270     protected CmisTestResult assertListNullOrEmpty(List<?> list, CmisTestResult success, CmisTestResult failure) {
271         if (list == null || list.isEmpty()) {
272             return success;
273         }
274 
275         return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "List is not empty!"));
276 
277     }
278 
279     protected CmisTestResult assertEquals(Object expected, Object actual, CmisTestResult success, CmisTestResult failure) {
280         if (isEqual(expected, actual)) {
281             return success;
282         }
283 
284         return addResultChild(
285                 failure,
286                 createResult(CmisTestResultStatus.INFO, "expected: " + formatValue(expected) + " / actual: "
287                         + formatValue(actual)));
288     }
289 
290     protected CmisTestResult assertContains(Collection<?> collection, Object value, CmisTestResult success,
291             CmisTestResult failure) {
292         if (collection == null) {
293             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Collection is null!"));
294         }
295 
296         if (collection.contains(value)) {
297             return success;
298         }
299 
300         return addResultChild(failure,
301                 createResult(CmisTestResultStatus.INFO, "Collection does not contain " + formatValue(value)));
302     }
303 
304     protected CmisTestResult assertEqualLists(List<?> expected, List<?> actual, CmisTestResult success,
305             CmisTestResult failure) {
306         if (expected == null && actual == null) {
307             return success;
308         }
309 
310         if (expected == null) {
311             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Expected list is null!"));
312         }
313 
314         if (actual == null) {
315             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Actual list is null!"));
316         }
317 
318         if (expected.size() != actual.size()) {
319             return addResultChild(
320                     failure,
321                     createResult(CmisTestResultStatus.INFO, "List sizes don't match! expected: " + expected.size()
322                             + " / actual: " + actual.size()));
323         }
324 
325         for (int i = 0; i < expected.size(); i++) {
326             if (!isEqual(expected.get(i), actual.get(i))) {
327                 return addResultChild(
328                         failure,
329                         createResult(CmisTestResultStatus.INFO, "expected list item[" + i + "]: "
330                                 + formatValue(expected.get(i)) + " / actual list item[" + i + "]: "
331                                 + formatValue(actual.get(i))));
332             }
333         }
334 
335         return success;
336     }
337 
338     protected CmisTestResult assertEqualArray(Object expected, Object actual, CmisTestResult success,
339             CmisTestResult failure) {
340         if (expected == null && actual == null) {
341             return success;
342         }
343 
344         if (expected == null) {
345             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Expected array is null!"));
346         }
347 
348         if (!expected.getClass().isArray()) {
349             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Expected array is not an array!"));
350         }
351 
352         if (actual == null) {
353             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Actual array is null!"));
354         }
355 
356         if (!actual.getClass().isArray()) {
357             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Actual array is not an array!"));
358         }
359 
360         if (Array.getLength(expected) != Array.getLength(actual)) {
361             return addResultChild(
362                     failure,
363                     createResult(
364                             CmisTestResultStatus.INFO,
365                             "Array sizes don't match! expected: " + Array.getLength(expected) + " / actual: "
366                                     + Array.getLength(actual)));
367         }
368 
369         for (int i = 0; i < Array.getLength(expected); i++) {
370             if (!isEqual(Array.get(expected, i), Array.get(actual, i))) {
371                 return addResultChild(
372                         failure,
373                         createResult(CmisTestResultStatus.INFO,
374                                 "expected array item[" + i + "]: " + formatValue(Array.get(expected, i))
375                                         + " / actual array item[" + i + "]: " + formatValue(Array.get(actual, i))));
376             }
377         }
378 
379         return success;
380     }
381 
382     protected CmisTestResult assertEqualSet(Set<?> expected, Set<?> actual, CmisTestResult success,
383             CmisTestResult failure) {
384         if (expected == null && actual == null) {
385             return success;
386         }
387 
388         if (expected == null) {
389             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Expected set is null!"));
390         }
391 
392         if (actual == null) {
393             return addResultChild(failure, createResult(CmisTestResultStatus.INFO, "Actual set is null!"));
394         }
395 
396         if (expected.size() != actual.size()) {
397             return addResultChild(
398                     failure,
399                     createResult(CmisTestResultStatus.INFO, "Set sizes don't match! expected: " + expected.size()
400                             + " / actual: " + actual.size()));
401         }
402 
403         for (Object o : expected) {
404             if (!actual.contains(o)) {
405                 return addResultChild(failure,
406                         createResult(CmisTestResultStatus.INFO, "Item not in actual set: " + formatValue(o)));
407             }
408         }
409 
410         return success;
411     }
412 }