1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.chemistry.opencmis.fit.tck;
20
21 import static org.apache.chemistry.opencmis.commons.impl.CollectionsHelper.isNullOrEmpty;
22 import static org.junit.Assert.assertNotNull;
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assume.assumeTrue;
25
26 import java.io.File;
27 import java.util.HashMap;
28 import java.util.List;
29 import java.util.Map;
30
31 import org.apache.catalina.LifecycleEvent;
32 import org.apache.catalina.LifecycleException;
33 import org.apache.catalina.LifecycleListener;
34 import org.apache.catalina.LifecycleState;
35 import org.apache.catalina.startup.Tomcat;
36 import org.apache.chemistry.opencmis.commons.SessionParameter;
37 import org.apache.chemistry.opencmis.commons.enums.BindingType;
38 import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
39 import org.apache.chemistry.opencmis.tck.CmisTest;
40 import org.apache.chemistry.opencmis.tck.CmisTestGroup;
41 import org.apache.chemistry.opencmis.tck.CmisTestProgressMonitor;
42 import org.apache.chemistry.opencmis.tck.CmisTestReport;
43 import org.apache.chemistry.opencmis.tck.CmisTestResult;
44 import org.apache.chemistry.opencmis.tck.CmisTestResultStatus;
45 import org.apache.chemistry.opencmis.tck.impl.TestParameters;
46 import org.apache.chemistry.opencmis.tck.report.TextReport;
47 import org.apache.chemistry.opencmis.tck.runner.AbstractRunner;
48 import org.junit.AfterClass;
49 import org.junit.Before;
50 import org.junit.BeforeClass;
51 import org.junit.Test;
52
53 public abstract class AbstractTckIT extends AbstractRunner {
54 public static final String TEST = "org.apache.chemistry.opencmis.tck.test";
55 public static final String TEST_CMIS_1_0 = "org.apache.chemistry.opencmis.tck.testCmis10";
56 public static final String TEST_CMIS_1_1 = "org.apache.chemistry.opencmis.tck.testCmis11";
57 public static final String TEST_ATOMPUB = "org.apache.chemistry.opencmis.tck.testAtomPub";
58 public static final String TEST_WEBSERVICES = "org.apache.chemistry.opencmis.tck.testWebServices";
59 public static final String TEST_BROWSER = "org.apache.chemistry.opencmis.tck.testBrowser";
60 public static final String TEST_NOT_VERSIONABLE = "org.apache.chemistry.opencmis.tck.testNotVersionable";
61 public static final String TEST_VERSIONABLE = "org.apache.chemistry.opencmis.tck.testVersionable";
62
63 public static final String DEFAULT_VERSIONABLE_DOCUMENT_TYPE = "org.apache.chemistry.opencmis.tck.default.versionableDocumentType";
64 public static final String DEFAULT_VERSIONABLE_DOCUMENT_TYPE_VALUE = "VersionableType";
65
66 public static final String HOST = "localhost";
67 private static final int BASEPORT = 19080;
68 private static int portCounter = -1;
69
70 public static final String REPOSITORY_ID = "test";
71 public static final String USER = "test";
72 public static final String PASSWORD = "test";
73
74 public abstract Map<String, String> getSessionParameters();
75
76 public abstract BindingType getBindingType();
77
78 public abstract CmisVersion getCmisVersion();
79
80 public abstract boolean usesVersionableDocumentType();
81
82 public static int getPort() {
83 return BASEPORT + portCounter;
84 }
85
86 public Map<String, String> getBaseSessionParameters() {
87 Map<String, String> parameters = new HashMap<String, String>();
88
89 parameters.put(SessionParameter.REPOSITORY_ID,
90 System.getProperty(SessionParameter.REPOSITORY_ID, REPOSITORY_ID));
91 parameters.put(SessionParameter.USER, System.getProperty(SessionParameter.USER, USER));
92 parameters.put(SessionParameter.PASSWORD, System.getProperty(SessionParameter.PASSWORD, PASSWORD));
93
94 if (usesVersionableDocumentType()) {
95 parameters.put(TestParameters.DEFAULT_DOCUMENT_TYPE,
96 System.getProperty(DEFAULT_VERSIONABLE_DOCUMENT_TYPE, DEFAULT_VERSIONABLE_DOCUMENT_TYPE_VALUE));
97 } else {
98 parameters.put(TestParameters.DEFAULT_DOCUMENT_TYPE, System
99 .getProperty(TestParameters.DEFAULT_DOCUMENT_TYPE, TestParameters.DEFAULT_DOCUMENT_TYPE_VALUE));
100 }
101
102 parameters.put(TestParameters.DEFAULT_FOLDER_TYPE,
103 System.getProperty(TestParameters.DEFAULT_FOLDER_TYPE, "cmis:folder"));
104
105 return parameters;
106 }
107
108 private static Tomcat tomcat;
109 private static File tomcateBaseDir;
110
111 @BeforeClass
112 public static void startTomcat() throws LifecycleException, InterruptedException {
113 File targetDir = new File(System.getProperty("project.build.directory", "./target"));
114
115 File warFile = null;
116 for (File child : targetDir.listFiles()) {
117 if (child.getName().endsWith(".war")) {
118 warFile = child;
119 }
120 }
121
122 if (warFile == null) {
123 throw new RuntimeException("OpenCMIS WAR file not found!");
124 }
125
126 portCounter++;
127
128 tomcateBaseDir = new File(targetDir, "tomcat.base." + getPort());
129 if (!tomcateBaseDir.exists()) {
130 tomcateBaseDir.mkdir();
131 }
132
133
134 System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
135
136 tomcat = new Tomcat();
137 tomcat.setBaseDir(tomcateBaseDir.getAbsolutePath());
138 tomcat.setPort(getPort());
139
140 tomcat.getHost().setCreateDirs(true);
141 tomcat.getHost().setDeployOnStartup(true);
142 tomcat.getHost().setAutoDeploy(false);
143
144 tomcat.getServer().addLifecycleListener(new LifecycleListener() {
145 @Override
146 public void lifecycleEvent(LifecycleEvent event) {
147 if (event.getLifecycle().getState() == LifecycleState.DESTROYED) {
148 if (!deleteDirectory(tomcateBaseDir)) {
149 markDirectoryForDelete(tomcateBaseDir);
150 }
151 }
152 }
153 });
154
155 File appDir = new File(tomcateBaseDir, tomcat.getHost().getAppBase());
156 if (!appDir.exists()) {
157 appDir.mkdir();
158 }
159
160 tomcat.addWebapp(null, "/opencmis", warFile.getAbsolutePath());
161 tomcat.init();
162 tomcat.start();
163
164 int count = 60;
165 while (count > 0) {
166 count--;
167 if (tomcat.getServer().getState() == LifecycleState.STARTED) {
168 break;
169 }
170 Thread.sleep(500);
171 }
172
173 Thread.sleep(5000);
174 }
175
176 @AfterClass
177 public static void stopTomcat() throws LifecycleException, InterruptedException {
178 tomcat.stop();
179 tomcat.destroy();
180 }
181
182 private static boolean deleteDirectory(File dir) {
183 if (!dir.exists()) {
184 return false;
185 }
186
187 for (File file : dir.listFiles()) {
188 if (file.isDirectory()) {
189 deleteDirectory(file);
190 } else {
191 file.delete();
192 }
193 }
194
195 return dir.delete();
196 }
197
198 private static void markDirectoryForDelete(File dir) {
199 if (!dir.exists()) {
200 return;
201 }
202
203 dir.deleteOnExit();
204
205 for (File file : dir.listFiles()) {
206 if (file.isDirectory()) {
207 markDirectoryForDelete(file);
208 } else {
209 file.deleteOnExit();
210 }
211 }
212 }
213
214 @Before
215 public void checkTest() {
216 assumeTrue("Skipping all TCK tests.", getSystemPropertyBoolean(TEST));
217
218 if (getCmisVersion() == CmisVersion.CMIS_1_0) {
219 assumeTrue("Skipping CMIS 1.0 TCK tests.", getSystemPropertyBoolean(TEST_CMIS_1_0));
220 } else if (getCmisVersion() == CmisVersion.CMIS_1_1) {
221 assumeTrue("Skipping CMIS 1.1 TCK tests.", getSystemPropertyBoolean(TEST_CMIS_1_1));
222 }
223
224 if (getBindingType() == BindingType.ATOMPUB) {
225 assumeTrue("Skipping AtomPub binding TCK tests.", getSystemPropertyBoolean(TEST_ATOMPUB));
226 } else if (getBindingType() == BindingType.WEBSERVICES) {
227 assumeTrue("Skipping Web Services binding TCK tests.", getSystemPropertyBoolean(TEST_WEBSERVICES));
228 } else if (getBindingType() == BindingType.BROWSER) {
229 assumeTrue("Skipping Browser binding TCK tests.", getSystemPropertyBoolean(TEST_BROWSER));
230 }
231
232 if (usesVersionableDocumentType()) {
233 assumeTrue("Skipping TCK tests with versionable document types.",
234 getSystemPropertyBoolean(TEST_VERSIONABLE));
235 } else {
236 assumeTrue("Skipping TCK tests with non-versionable document types.",
237 getSystemPropertyBoolean(TEST_NOT_VERSIONABLE));
238 }
239 }
240
241 protected boolean getSystemPropertyBoolean(String propName) {
242 return "true".equalsIgnoreCase(System.getProperty(propName, "true"));
243 }
244
245 @Test
246 public void runTck() throws Exception {
247
248 setParameters(getSessionParameters());
249 loadDefaultTckGroups();
250
251 run(new TestProgressMonitor());
252
253
254 File target = new File("target");
255 target.mkdir();
256
257 CmisTestReport report = new TextReport();
258 report.createReport(getParameters(), getGroups(),
259 new File(target, "tck-result-" + getBindingType().value() + "-" + getCmisVersion().value() + "-"
260 + (usesVersionableDocumentType() ? "versionable" : "nonversionable") + ".txt"));
261
262
263 for (CmisTestGroup group : getGroups()) {
264 for (CmisTest test : group.getTests()) {
265 for (CmisTestResult result : test.getResults()) {
266 assertNotNull("The test '" + test.getName() + "' returned an invalid result.", result);
267 assertTrue("The test '" + test.getName() + "' returned a failure: " + result.getMessage(),
268 result.getStatus() != CmisTestResultStatus.FAILURE);
269 assertTrue(
270 "The test '" + test.getName() + "' returned at an unexcepted exception: "
271 + result.getMessage(),
272 result.getStatus() != CmisTestResultStatus.UNEXPECTED_EXCEPTION);
273 }
274 }
275 }
276 }
277
278 public static CmisTestResultStatus getWorst(List<CmisTestResult> results) {
279 if (isNullOrEmpty(results)) {
280 return CmisTestResultStatus.OK;
281 }
282
283 int max = 0;
284
285 for (CmisTestResult result : results) {
286 if (max < result.getStatus().getLevel()) {
287 max = result.getStatus().getLevel();
288 }
289 }
290
291 return CmisTestResultStatus.fromLevel(max);
292 }
293
294 private static class TestProgressMonitor implements CmisTestProgressMonitor {
295 @Override
296 public void startGroup(CmisTestGroup group) {
297 System.out.println();
298 System.out.println(group.getName() + " (" + group.getTests().size() + " tests)");
299 }
300
301 @Override
302 public void endGroup(CmisTestGroup group) {
303 System.out.println();
304 }
305
306 @Override
307 public void startTest(CmisTest test) {
308 System.out.print(" " + test.getName());
309 }
310
311 @Override
312 public void endTest(CmisTest test) {
313 System.out.print(" (" + test.getTime() + "ms): ");
314 System.out.println(getWorst(test.getResults()));
315 }
316
317 @Override
318 public void message(String msg) {
319 System.out.println(msg);
320 }
321 }
322 }