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.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"; // InMemory
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         // Logger.getLogger("").setLevel(Level.INFO);
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         // tomcat.setSilent(true);
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         // set up TCK and run it
248         setParameters(getSessionParameters());
249         loadDefaultTckGroups();
250 
251         run(new TestProgressMonitor());
252 
253         // write report
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         // find failures
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 }