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 2011/02/04 13:49:31 UTC

svn commit: r1067171 - in /sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable: ExplainTests.java ScriptableTestsProvider.java

Author: bdelacretaz
Date: Fri Feb  4 12:49:30 2011
New Revision: 1067171

URL: http://svn.apache.org/viewvc?rev=1067171&view=rev
Log:
SLING-1963 - ScriptableTestsProvider only considers test nodes under /apps or /libs

Modified:
    sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ExplainTests.java
    sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java

Modified: sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ExplainTests.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ExplainTests.java?rev=1067171&r1=1067170&r2=1067171&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ExplainTests.java (original)
+++ sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ExplainTests.java Fri Feb  4 12:49:30 2011
@@ -30,9 +30,10 @@ public class ExplainTests {
         fail(
                 "No scriptable tests found."
                 + " To create scriptable tests, create nodes with the sling:Test"
-                + " mixin, and setup Sling so that requesting them with .test.txt generates"
+                + " mixin under /apps or /libs (*), and setup Sling so that requesting them with .test.txt generates"
                 + " a text response containing just TEST_PASSED if the test is successful."
                 + " Empty lines and lines starting with # are ignored in the test output."
+                + " (*) depends on the JCR resource resolver configuration."
                 );
     }
 }

Modified: sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java?rev=1067171&r1=1067170&r2=1067171&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java (original)
+++ sling/whiteboard/bdelacretaz/junit/scriptable/src/main/java/org/apache/sling/junit/scriptable/ScriptableTestsProvider.java Fri Feb  4 12:49:30 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.junit.scriptable;
 
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -45,10 +46,19 @@ import org.slf4j.LoggerFactory;
 public class ScriptableTestsProvider implements TestsProvider {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private String pid;
-    private static List<String> testPaths = new LinkedList<String>();
     private Session session;
     private ResourceResolver resolver;
     
+    /** List of resource paths that point to tests */
+    private static List<String> testPaths = new LinkedList<String>();
+    
+    /** We only consider test resources under the search path
+     *  of the JCR resource resolver. These paths are supposed 
+     *  to be secured, as they contain other admin stuff anyway, 
+     *  so non-admin users are prevented from creating test nodes. 
+     */
+    private String[] allowedRoots;
+    
     @Reference
     private SlingRepository repository;
     
@@ -62,6 +72,16 @@ public class ScriptableTestsProvider imp
         pid = (String)ctx.getProperties().get(Constants.SERVICE_PID);
         session = repository.loginAdministrative(repository.getDefaultWorkspace());
         resolver = resolverFactory.getResourceResolver(session);
+        
+        // Copy resource resolver paths and make sure they end with a /
+        final String [] paths = resolver.getSearchPath();
+        allowedRoots = Arrays.copyOf(paths, paths.length);
+        for(int i=0; i < allowedRoots.length; i++) {
+            if(!allowedRoots[i].endsWith("/")) {
+                allowedRoots[i] += "/";
+            }
+        }
+        log.info("Activated, will look for test resources under {}", Arrays.asList(allowedRoots));
     }
     
     protected void deactivate(ComponentContext ctx) throws RepositoryException {
@@ -78,8 +98,6 @@ public class ScriptableTestsProvider imp
         if(testPaths.size() == 0) {
             return ExplainTests.class;
         } else {
-            // TODO this would cause a mess if TestAllPaths is executed concurrently
-            // and these values change
             TestAllPaths.testPaths = testPaths;
             TestAllPaths.requestProcessor = requestProcessor;
             TestAllPaths.resolver = resolver;
@@ -105,11 +123,19 @@ public class ScriptableTestsProvider imp
         
         // TODO do we want to cache results, use observation, etc.
         try {
-            final Query q = session.getWorkspace().getQueryManager().createQuery("//element(*, sling:Test)", Query.XPATH);
-            final NodeIterator it = q.execute().getNodes();
-            while(it.hasNext()) {
-                result.add(it.nextNode().getPath());
+            for(String root : allowedRoots) {
+                final String statement = "/jcr:root" + root + "/element(*, sling:Test)";
+                log.debug("Querying for test nodes: {}", statement);
+                final Query q = session.getWorkspace().getQueryManager().createQuery(statement, Query.XPATH);
+                final NodeIterator it = q.execute().getNodes();
+                while(it.hasNext()) {
+                    final String path = it.nextNode().getPath();
+                    result.add(path);
+                    log.debug("Test resource found: {}", path);
+                }
             }
+            log.info("List of test resources updated, {} resource(s) found under {}", 
+                    result.size(), Arrays.asList(allowedRoots));
         } catch(RepositoryException re) {
             log.warn("RepositoryException in getTestNames()", re);
         }