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 ); - } - } - }