You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2012/01/24 20:03:34 UTC

svn commit: r1235413 - in /maven/surefire/trunk: maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/ surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/

Author: jdcasey
Date: Tue Jan 24 19:03:34 2012
New Revision: 1235413

URL: http://svn.apache.org/viewvc?rev=1235413&view=rev
Log:
[SUREFIRE-809] check child descriptions to figure out whether the class-level descriptions should be run, and cache the answers to speed up for next time (seems like it'll process the children twice in this approach). Also, load the categories as classes the way it used to be done before...just now, delegate the actual classloading to the matchers.

Modified:
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/GroupMatcher.java
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/InverseGroupMatcher.java
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/JoinGroupMatcher.java
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/SingleGroupMatcher.java
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/GroupMatcher.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/GroupMatcher.java?rev=1235413&r1=1235412&r2=1235413&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/GroupMatcher.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/GroupMatcher.java Tue Jan 24 19:03:34 2012
@@ -4,6 +4,8 @@ package org.apache.maven.surefire.group.
 public interface GroupMatcher
 {
 
+    void loadGroupClasses( ClassLoader cloader );
+
     boolean enabled( Class<?>... cats );
 
     boolean enabled( String... cats );

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/InverseGroupMatcher.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/InverseGroupMatcher.java?rev=1235413&r1=1235412&r2=1235413&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/InverseGroupMatcher.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/InverseGroupMatcher.java Tue Jan 24 19:03:34 2012
@@ -57,4 +57,9 @@ public class InverseGroupMatcher
         return true;
     }
 
+    public void loadGroupClasses( ClassLoader cloader )
+    {
+        matcher.loadGroupClasses( cloader );
+    }
+
 }

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/JoinGroupMatcher.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/JoinGroupMatcher.java?rev=1235413&r1=1235412&r2=1235413&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/JoinGroupMatcher.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/JoinGroupMatcher.java Tue Jan 24 19:03:34 2012
@@ -19,4 +19,12 @@ public abstract class JoinGroupMatcher
         return matchers;
     }
 
+    public void loadGroupClasses( ClassLoader cloader )
+    {
+        for ( GroupMatcher matcher : matchers )
+        {
+            matcher.loadGroupClasses( cloader );
+        }
+    }
+
 }

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/SingleGroupMatcher.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/SingleGroupMatcher.java?rev=1235413&r1=1235412&r2=1235413&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/SingleGroupMatcher.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/surefire/group/match/SingleGroupMatcher.java Tue Jan 24 19:03:34 2012
@@ -7,6 +7,8 @@ public class SingleGroupMatcher
 
     private String enabled;
 
+    private Class<?> enabledClass;
+
     @Override
     public int hashCode()
     {
@@ -54,6 +56,11 @@ public class SingleGroupMatcher
             for ( Class<?> cls : cats )
             {
                 String name = cls.getName();
+                if ( enabledClass != null && enabledClass.getName().equals( name ) )
+                {
+                    return true;
+                }
+                
                 if ( name.endsWith( enabled ) )
                 {
                     return true;
@@ -88,4 +95,16 @@ public class SingleGroupMatcher
         return false;
     }
 
+    public void loadGroupClasses( ClassLoader cloader )
+    {
+        try
+        {
+            enabledClass = cloader.loadClass( enabled );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            throw new RuntimeException( "Unable to load category: " + enabled, e );
+        }
+    }
+
 }

Modified: maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java?rev=1235413&r1=1235412&r2=1235413&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java (original)
+++ maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java Tue Jan 24 19:03:34 2012
@@ -21,8 +21,13 @@ package org.apache.maven.surefire.common
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
+
 import org.apache.maven.surefire.booter.ProviderParameterNames;
 import org.apache.maven.surefire.group.match.AndGroupMatcher;
 import org.apache.maven.surefire.group.match.GroupMatcher;
@@ -31,7 +36,6 @@ import org.apache.maven.surefire.group.m
 import org.apache.maven.surefire.group.parse.GroupMatcherParser;
 import org.apache.maven.surefire.group.parse.ParseException;
 import org.codehaus.plexus.util.SelectorUtils;
-
 import org.junit.experimental.categories.Category;
 import org.junit.runner.Description;
 import org.junit.runner.manipulation.Filter;
@@ -54,6 +58,10 @@ public class FilterFactory
         String excludedGroups = providerProperties.getProperty( ProviderParameterNames.TESTNG_EXCLUDEDGROUPS_PROP );
         GroupMatcher included = commaSeparatedListToFilters( groups );
         GroupMatcher excluded = commaSeparatedListToFilters( excludedGroups );
+
+        included.loadGroupClasses( testClassLoader );
+        excluded.loadGroupClasses( testClassLoader );
+
         return new GroupMatcherCategoryFilter( included, excluded );
     }
 
@@ -77,7 +85,6 @@ public class FilterFactory
                 }
                 catch ( ParseException e )
                 {
-                    // TODO Auto-generated catch block
                     throw new IllegalArgumentException( "Invalid group expression: '" + group + "'. Reason: "
                         + e.getMessage(), e );
                 }
@@ -138,6 +145,8 @@ public class FilterFactory
 
         private AndGroupMatcher matcher;
 
+        private Map<Description, Boolean> shouldRunAnswers = new HashMap<Description, Boolean>();
+
         public GroupMatcherCategoryFilter( GroupMatcher included, GroupMatcher excluded )
         {
             GroupMatcher invertedExclude = excluded == null ? null : new InverseGroupMatcher( excluded );
@@ -159,31 +168,77 @@ public class FilterFactory
         @Override
         public boolean shouldRun( Description description )
         {
+            return shouldRun( description,
+                              ( description.getMethodName() == null ? null
+                                              : Description.createSuiteDescription( description.getTestClass() ) ) );
+        }
+
+        private boolean shouldRun( Description description, Description parent )
+        {
+            Boolean result = shouldRunAnswers.get( description );
+            if ( result != null )
+            {
+                return result;
+            }
+
             if ( matcher == null )
             {
                 return true;
             }
 
+            // System.out.println( "\n\nMatcher: " + matcher );
+            // System.out.println( "Checking: " + description.getClassName()
+            // + ( parent == null ? "" : "#" + description.getMethodName() ) );
+
+            Set<Class<?>> cats = new HashSet<Class<?>>();
             Category cat = description.getAnnotation( Category.class );
-            if ( cat == null )
+            if ( cat != null )
             {
-                cat = description.getTestClass().getAnnotation( Category.class );
+                // System.out.println( "Adding categories: " + Arrays.toString( cat.value() ) );
+                cats.addAll( Arrays.asList( cat.value() ) );
             }
 
-            System.out.println( "\n\nMatcher: " + matcher );
-
-            if ( cat == null )
+            if ( parent != null )
             {
-                System.out.println( "\tChecking: " + description.getClassName() + "#" + description.getMethodName()
-                    + " with no category annotations... Enabled? " + ( matcher.enabled( (String) null ) ) );
-                return matcher.enabled( (String) null );
+                cat = parent.getAnnotation( Category.class );
+                if ( cat != null )
+                {
+                    // System.out.println( "Adding class-level categories: " + Arrays.toString( cat.value() ) );
+                    cats.addAll( Arrays.asList( cat.value() ) );
+                }
             }
 
-            System.out.println( "\tChecking: " + description.getClassName() + "#" + description.getMethodName()
-                + " with category annotations:\n\t" + Arrays.toString( cat.value() ) + "\nEnabled? "
-                + ( matcher.enabled( cat.value() ) ) );
+            // System.out.println( "Checking " + cats.size() + " categories..." );
+            //
+            // System.out.println( "Enabled? " + ( matcher.enabled( cats.toArray( new Class<?>[] {} ) ) ) + "\n\n" );
+            result = matcher.enabled( cats.toArray( new Class<?>[] {} ) );
 
-            return matcher.enabled( cat.value() );
+            if ( parent == null )
+            {
+                if ( cats.size() == 0 )
+                {
+                    // System.out.println( "Allow method-level filtering by PASSing class-level shouldRun() test..." );
+                    result = true;
+                }
+                else if ( !result )
+                {
+                    ArrayList<Description> children = description.getChildren();
+                    if ( children != null )
+                    {
+                        for ( Description child : children )
+                        {
+                            if ( shouldRun( child, description ) )
+                            {
+                                result = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            shouldRunAnswers.put( description, result );
+            return result == null ? false : result;
         }
 
         @Override
@@ -268,16 +323,4 @@ public class FilterFactory
         }
     }
 
-    private Class<?> classloadCategory( String category )
-    {
-        try
-        {
-            return testClassLoader.loadClass( category );
-        }
-        catch ( ClassNotFoundException e )
-        {
-            throw new RuntimeException( "Unable to load category: " + category, e );
-        }
-    }
-
 }