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