1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
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 }