You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2014/06/27 17:38:22 UTC

svn commit: r1606131 - in /sling/trunk/testing: junit/core/ junit/core/src/main/java/org/apache/sling/junit/ junit/core/src/main/java/org/apache/sling/junit/impl/ junit/core/src/main/java/org/apache/sling/junit/impl/servlet/ samples/integration-tests/ ...

Author: bdelacretaz
Date: Fri Jun 27 15:38:22 2014
New Revision: 1606131

URL: http://svn.apache.org/r1606131
Log:
SLING-3708 - Let server-side JUnit tests provide optional output metadata

Added:
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContext.java
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContextProvider.java
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestContextRunListenerWrapper.java
    sling/trunk/testing/samples/sample-tests/src/main/java/org/apache/sling/testing/samples/sampletests/OutputMetadataTest.java
Modified:
    sling/trunk/testing/junit/core/pom.xml
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestsManagerImpl.java
    sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JsonRenderer.java
    sling/trunk/testing/samples/integration-tests/pom.xml
    sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/ServerSideSampleTest.java
    sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/sling/SlingServerSideTest.java
    sling/trunk/testing/samples/sample-tests/pom.xml

Modified: sling/trunk/testing/junit/core/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/pom.xml?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/pom.xml (original)
+++ sling/trunk/testing/junit/core/pom.xml Fri Jun 27 15:38:22 2014
@@ -59,7 +59,7 @@
                     <instructions>
                         <Bundle-Activator>org.apache.sling.junit.Activator</Bundle-Activator>
                         <Export-Package>
-                            org.apache.sling.junit;version=1.1.0,
+                            org.apache.sling.junit;version=1.2.0,
                             org.apache.sling.junit.annotations;version=1.0.8,
                         </Export-Package>
                         <_exportcontents>

Added: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContext.java?rev=1606131&view=auto
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContext.java (added)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContext.java Fri Jun 27 15:38:22 2014
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.sling.junit;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/** Provide test parameters (the "input map") and allow 
+ *  tests to provide additional metadata (in an "output
+ *  map") about their results.
+ *  
+ *  Meant to be used to implement performance tests
+ *  that run inside Sling instances - we'll expand
+ *  the junit.core module to optionally use this.  
+ */
+public class SlingTestContext {
+    private final Map<String, Object> inputMap = new HashMap<String, Object>();
+    private final Map<String, Object> outputMap = new HashMap<String, Object>();
+    
+    public Map<String, Object> input() {
+        return inputMap;
+    }
+    
+    public Map<String, Object> output() {
+        return outputMap;
+    }
+}

Added: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContextProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContextProvider.java?rev=1606131&view=auto
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContextProvider.java (added)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/SlingTestContextProvider.java Fri Jun 27 15:38:22 2014
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.sling.junit;
+
+
+/** Provider of {@link SlingTestContext} that uses
+ *  thread locals to provide per-testing thread contexts.   
+ */
+public class SlingTestContextProvider {
+    private static final ThreadLocal<SlingTestContext> threadLocal = new ThreadLocal<SlingTestContext>();
+    
+    public static SlingTestContext getContext() {
+        final SlingTestContext result = threadLocal.get();
+        if(result == null) {
+            throw new IllegalStateException("Null context, createContext() not called?");
+        }
+        return result;
+    }
+    
+    public static SlingTestContext createContext() {
+        threadLocal.set(new SlingTestContext());
+        return getContext();
+    }
+    
+    public static void deleteContext() {
+        threadLocal.set(null);
+    }
+    
+    public static boolean hasContext() {
+        return threadLocal.get() != null;
+    }
+}

Added: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestContextRunListenerWrapper.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestContextRunListenerWrapper.java?rev=1606131&view=auto
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestContextRunListenerWrapper.java (added)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestContextRunListenerWrapper.java Fri Jun 27 15:38:22 2014
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.junit.impl;
+
+import org.apache.sling.junit.SlingTestContextProvider;
+import org.junit.runner.Description;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+
+public class TestContextRunListenerWrapper extends RunListener {
+    private final RunListener wrapped;
+    private long testStartTime;
+    
+    TestContextRunListenerWrapper(RunListener toWrap) {
+        wrapped = toWrap;
+    }
+
+    @Override
+    public void testAssumptionFailure(Failure failure) {
+        wrapped.testAssumptionFailure(failure);
+    }
+
+    @Override
+    public void testFailure(Failure failure) throws Exception {
+        wrapped.testFailure(failure);
+    }
+
+    @Override
+    public void testFinished(Description description) throws Exception {
+        if(SlingTestContextProvider.hasContext()) {
+            SlingTestContextProvider.getContext().output().put("test_execution_time_msec", System.currentTimeMillis() - testStartTime);
+        }
+        wrapped.testFinished(description);
+    }
+
+    @Override
+    public void testIgnored(Description description) throws Exception {
+        wrapped.testIgnored(description);
+    }
+
+    @Override
+    public void testRunFinished(Result result) throws Exception {
+        wrapped.testRunFinished(result);
+    }
+
+    @Override
+    public void testRunStarted(Description description) throws Exception {
+        wrapped.testRunStarted(description);
+    }
+
+    @Override
+    public void testStarted(Description description) throws Exception {
+        testStartTime = System.currentTimeMillis();
+        wrapped.testStarted(description);
+    }
+}

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestsManagerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestsManagerImpl.java?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestsManagerImpl.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/TestsManagerImpl.java Fri Jun 27 15:38:22 2014
@@ -27,6 +27,8 @@ import java.util.concurrent.ConcurrentHa
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.junit.Renderer;
+import org.apache.sling.junit.SlingTestContext;
+import org.apache.sling.junit.SlingTestContextProvider;
 import org.apache.sling.junit.TestSelector;
 import org.apache.sling.junit.TestsManager;
 import org.apache.sling.junit.TestsProvider;
@@ -174,16 +176,35 @@ public class TestsManagerImpl implements
     public void executeTests(Collection<String> testNames, Renderer renderer, TestSelector selector) throws Exception {
         renderer.title(2, "Running tests");
         final JUnitCore junit = new JUnitCore();
-        junit.addListener(renderer.getRunListener());
-        for(String className : testNames) {
-            renderer.title(3, className);
-            final String testMethodName = selector == null ? null : selector.getSelectedTestMethodName();
-            if(testMethodName != null && testMethodName.length() > 0) {
-                log.debug("Running test method {} from test class {}", testMethodName, className);
-                junit.run(Request.method(getTestClass(className), testMethodName));
-            } else {
-                log.debug("Running test class {}", className);
-                junit.run(getTestClass(className));
+        
+        // Create a test context if we don't have one yet
+        final boolean createContext =  !SlingTestContextProvider.hasContext();
+        if(createContext) {
+            SlingTestContextProvider.createContext();
+        }
+        
+        try {
+            junit.addListener(new TestContextRunListenerWrapper(renderer.getRunListener()));
+            for(String className : testNames) {
+                renderer.title(3, className);
+                
+                // If we have a test context, clear its output metadata
+                if(SlingTestContextProvider.hasContext()) {
+                    SlingTestContextProvider.getContext().output().clear();
+                }
+                
+                final String testMethodName = selector == null ? null : selector.getSelectedTestMethodName();
+                if(testMethodName != null && testMethodName.length() > 0) {
+                    log.debug("Running test method {} from test class {}", testMethodName, className);
+                    junit.run(Request.method(getTestClass(className), testMethodName));
+                } else {
+                    log.debug("Running test class {}", className);
+                    junit.run(getTestClass(className));
+                }
+            }
+        } finally {
+            if(createContext) {
+                SlingTestContextProvider.deleteContext();
             }
         }
     }

Modified: sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JsonRenderer.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JsonRenderer.java?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JsonRenderer.java (original)
+++ sling/trunk/testing/junit/core/src/main/java/org/apache/sling/junit/impl/servlet/JsonRenderer.java Fri Jun 27 15:38:22 2014
@@ -19,6 +19,7 @@ package org.apache.sling.junit.impl.serv
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.Collection;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -27,6 +28,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.io.JSONWriter;
 import org.apache.sling.junit.Renderer;
+import org.apache.sling.junit.SlingTestContextProvider;
 import org.apache.sling.junit.TestSelector;
 import org.junit.runner.Description;
 import org.junit.runner.Result;
@@ -43,9 +45,9 @@ public class JsonRenderer extends RunLis
     public static final String EXTENSION = "json";
     public static final String INFO_TYPE_KEY = "INFO_TYPE";
     public static final String INFO_SUBTYPE_KEY = "INFO_SUBTYPE";
+    public static final String TEST_METADATA = "test_metadata";
     private final Logger log = LoggerFactory.getLogger(getClass());
     private JSONWriter writer;
-    private int counter;
     
     /** @inheritDoc */
     public boolean appliesTo(TestSelector selector) {
@@ -144,6 +146,9 @@ public class JsonRenderer extends RunLis
     @Override
     public void testFinished(Description description) throws Exception {
         super.testFinished(description);
+        if(SlingTestContextProvider.hasContext()) {
+            outputContextMap(SlingTestContextProvider.getContext().output());
+        }
         endItem();
     }
 
@@ -159,7 +164,6 @@ public class JsonRenderer extends RunLis
     }
     
     void startItem(String name) throws JSONException {
-        ++counter;
         writer.object();
         writer.key(INFO_TYPE_KEY).value(name);
     }
@@ -167,4 +171,17 @@ public class JsonRenderer extends RunLis
     void endItem() throws JSONException {
         writer.endObject();
     }
-}
+    
+    void outputContextMap(Map<String, Object> data) throws JSONException {
+        writer.key(TEST_METADATA);
+        writer.object();
+        try {
+            for(Map.Entry<String, Object> e : data.entrySet()) {
+                writer.key(e.getKey());
+                writer.value(e.getValue());
+            }
+        } finally {
+            writer.endObject();
+        }
+    }
+}
\ No newline at end of file

Modified: sling/trunk/testing/samples/integration-tests/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/testing/samples/integration-tests/pom.xml?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/samples/integration-tests/pom.xml (original)
+++ sling/trunk/testing/samples/integration-tests/pom.xml Fri Jun 27 15:38:22 2014
@@ -250,7 +250,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.junit.core</artifactId>
-            <version>1.0.8</version>
+            <version>1.0.9-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/ServerSideSampleTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/ServerSideSampleTest.java?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/ServerSideSampleTest.java (original)
+++ sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/ServerSideSampleTest.java Fri Jun 27 15:38:22 2014
@@ -32,7 +32,7 @@ public class ServerSideSampleTest extend
 implements SlingRemoteTestParameters, SlingTestsCountChecker, RequestCustomizer {
     
     public static final String TEST_SELECTOR = "org.apache.sling.testing.samples.sampletests";
-    public static final int TESTS_AT_THIS_PATH = 8;
+    public static final int TESTS_AT_THIS_PATH = 9;
     private int customizeCalled;
     
     public void checkNumberOfTests(int numberOfTestsExecuted) {

Modified: sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/sling/SlingServerSideTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/sling/SlingServerSideTest.java?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/sling/SlingServerSideTest.java (original)
+++ sling/trunk/testing/samples/integration-tests/src/test/java/org/apache/sling/testing/samples/integrationtests/serverside/sling/SlingServerSideTest.java Fri Jun 27 15:38:22 2014
@@ -29,7 +29,7 @@ public class SlingServerSideTest extends
 implements SlingRemoteTestParameters, SlingTestsCountChecker {
     
     public static final String TEST_SELECTOR = "org.apache.sling.testing.samples.sampletests";
-    public static final int TESTS_AT_THIS_PATH = 8;
+    public static final int TESTS_AT_THIS_PATH = 9;
     
     public void checkNumberOfTests(int numberOfTestsExecuted) {
         assertEquals(TESTS_AT_THIS_PATH, numberOfTestsExecuted);

Modified: sling/trunk/testing/samples/sample-tests/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/testing/samples/sample-tests/pom.xml?rev=1606131&r1=1606130&r2=1606131&view=diff
==============================================================================
--- sling/trunk/testing/samples/sample-tests/pom.xml (original)
+++ sling/trunk/testing/samples/sample-tests/pom.xml Fri Jun 27 15:38:22 2014
@@ -91,10 +91,10 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <!-- TODO create separate API package, this is just to get the special Sling test runner -->
+            <!-- TODO create separate API package, this is just to get the special Sling test runner and SlingTestContext -->
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.junit.core</artifactId>
-            <version>1.0.8</version>
+            <version>1.0.9-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         

Added: sling/trunk/testing/samples/sample-tests/src/main/java/org/apache/sling/testing/samples/sampletests/OutputMetadataTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/samples/sample-tests/src/main/java/org/apache/sling/testing/samples/sampletests/OutputMetadataTest.java?rev=1606131&view=auto
==============================================================================
--- sling/trunk/testing/samples/sample-tests/src/main/java/org/apache/sling/testing/samples/sampletests/OutputMetadataTest.java (added)
+++ sling/trunk/testing/samples/sample-tests/src/main/java/org/apache/sling/testing/samples/sampletests/OutputMetadataTest.java Fri Jun 27 15:38:22 2014
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.testing.samples.sampletests;
+
+import static org.junit.Assert.assertNotNull;
+import org.apache.sling.junit.SlingTestContext;
+import org.apache.sling.junit.SlingTestContextProvider;
+import org.junit.Test;
+
+/** Test that adds metadata to the SlingTestContext */
+public class OutputMetadataTest {
+    
+    @Test
+    public void addMetadata() {
+        final SlingTestContext c = SlingTestContextProvider.getContext();
+        assertNotNull("Expecting a SlingTestContext", c);
+        
+        c.output().put("the_quick", "brown fox!");
+        c.output().put("the_answer", 42);
+    }
+}