Updated Branches:
  refs/heads/master 39a67f583 -> 0cb28a6de

[SUREFIRE-933] Tests not matching categories would fail build

Fixed in a way that does not break forkMode=onceperthread (enhanced the IT for 
that), refined the logic of JUnitCoreProvider.canRunClass (to also detect the 
BasicTest class from the IT)
Tests are now filtered right before handing them over to JUnit. In case of a 
NoTestsRemainException while filtering the test request, nothing will be handed 
over to JUnit.


Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/0cb28a6d
Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/0cb28a6d
Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/0cb28a6d

Branch: refs/heads/master
Commit: 0cb28a6de72ee273b0eea02555513513bc213724
Parents: 39a67f5
Author: agudian <andreas.gud...@gmail.com>
Authored: Sat Dec 8 21:02:02 2012 +0100
Committer: Kristian Rosenvold <krosenv...@apache.org>
Committed: Sun Dec 9 13:24:33 2012 +0100

----------------------------------------------------------------------
 .../jiras/Surefire839TestWithoutCategoriesIT.java  |    9 ++-
 .../surefire/junitcore/JUnitCoreProvider.java      |   91 ++-------------
 .../maven/surefire/junitcore/JUnitCoreWrapper.java |   50 +++++++-
 3 files changed, 63 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/0cb28a6d/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire839TestWithoutCategoriesIT.java
----------------------------------------------------------------------
diff --git 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire839TestWithoutCategoriesIT.java
 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire839TestWithoutCategoriesIT.java
index 6c03349..ebb6672 100755
--- 
a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire839TestWithoutCategoriesIT.java
+++ 
b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire839TestWithoutCategoriesIT.java
@@ -28,6 +28,13 @@ public class Surefire839TestWithoutCategoriesIT
     @Test
     public void classWithoutCategory()
     {
-        unpack( "junit48-categories" ).setJUnitVersion( "4.11" 
).executeTest().verifyErrorFree( 2 );
+        unpack( "junit48-categories" ).setJUnitVersion( "4.11" 
).executeTest().verifyErrorFree( 3 );
+    }
+
+    @Test
+    public void classWithoutCategoryForked()
+    {
+        unpack( "junit48-categories" ).setJUnitVersion( "4.11" 
).forkOncePerThread().threadCount(
+            2 ).executeTest().verifyErrorFree( 3 );
     }
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/0cb28a6d/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
----------------------------------------------------------------------
diff --git 
a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
 
b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
index 81ea524..d857aff 100644
--- 
a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
+++ 
b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
@@ -19,8 +19,6 @@ package org.apache.maven.surefire.junitcore;
  * under the License.
  */
 
-import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -45,7 +43,6 @@ import org.apache.maven.surefire.util.ScannerFilter;
 import org.apache.maven.surefire.util.TestsToRun;
 import org.apache.maven.surefire.util.internal.StringUtils;
 
-import org.junit.runner.Description;
 import org.junit.runner.manipulation.Filter;
 
 /**
@@ -99,26 +96,10 @@ public class JUnitCoreProvider
     public Iterator getSuites()
     {
         final Filter filter = jUnit48Reflector.isJUnit48Available() ? 
createJUnit48Filter() : null;
-        testsToRun = getSuitesAsList( filter );
+        testsToRun = scanClassPath();
         return testsToRun.iterator();
     }
 
-    private boolean containsSomethingRunnable( TestsToRun testsToRun, Filter 
filter )
-    {
-        if ( filter == null )
-        {
-            return true;
-        }
-        for ( Class o : testsToRun.getLocatedClasses() )
-        {
-            if ( canRunClass( filter, o ) )
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
     public RunResult invoke( Object forkTestSet )
         throws TestSetFailedException, ReporterException
     {
@@ -143,76 +124,26 @@ public class JUnitCoreProvider
             }
             else
             {
-                testsToRun = getSuitesAsList( filter );
+                testsToRun = scanClassPath();
             }
         }
 
-        if ( containsSomethingRunnable( testsToRun, filter ) )
-        {
-
-            final Map<String, TestSet> testSetMap = new 
ConcurrentHashMap<String, TestSet>();
+        final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, 
TestSet>();
 
-            RunListener listener = ConcurrentReporterManager.createInstance( 
testSetMap, reporterFactory,
-                                                                             
jUnitCoreParameters.isParallelClasses(),
-                                                                             
jUnitCoreParameters.isParallelBoth(),
-                                                                             
consoleLogger );
+        RunListener listener = ConcurrentReporterManager.createInstance( 
testSetMap, reporterFactory,
+                                                                         
jUnitCoreParameters.isParallelClasses(),
+                                                                         
jUnitCoreParameters.isParallelBoth(),
+                                                                         
consoleLogger );
 
-            ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) 
listener );
+        ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) listener );
 
-            org.junit.runner.notification.RunListener jUnit4RunListener =
-                new JUnitCoreRunListener( listener, testSetMap );
-            customRunListeners.add( 0, jUnit4RunListener );
+        org.junit.runner.notification.RunListener jUnit4RunListener = new 
JUnitCoreRunListener( listener, testSetMap );
+        customRunListeners.add( 0, jUnit4RunListener );
 
-            JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, 
customRunListeners, filter );
-        }
+        JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, 
customRunListeners, filter );
         return reporterFactory.close();
     }
 
-    @SuppressWarnings( "unchecked" )
-    private TestsToRun getSuitesAsList( Filter filter )
-    {
-        List<Class<?>> res = new ArrayList<Class<?>>( 500 );
-        TestsToRun max = scanClassPath();
-        if ( filter == null )
-        {
-            return max;
-        }
-
-        Iterator<Class<?>> it = max.iterator();
-        while ( it.hasNext() )
-        {
-            Class<?> clazz = it.next();
-            if ( canRunClass( filter, clazz ) )
-            {
-                res.add( clazz );
-            }
-        }
-        return new TestsToRun( res );
-    }
-
-    private boolean canRunClass( Filter filter, Class<?> clazz )
-    {
-        boolean isCategoryAnnotatedClass = 
jUnit48Reflector.isCategoryAnnotationPresent( clazz );
-        Description d = Description.createSuiteDescription( clazz );
-        if ( filter.shouldRun( d ) )
-        {
-            return true;
-        }
-        else
-        {
-            for ( Method method : clazz.getMethods() )
-            {
-                final Description testDescription =
-                    Description.createTestDescription( clazz, 
method.getName(), method.getAnnotations() );
-                if ( filter.shouldRun( testDescription ) )
-                {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
     private Filter createJUnit48Filter()
     {
         final FilterFactory filterFactory = new FilterFactory( testClassLoader 
);

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/0cb28a6d/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
----------------------------------------------------------------------
diff --git 
a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
 
b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
index aeda523..99bf6dc 100644
--- 
a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
+++ 
b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
@@ -19,6 +19,7 @@ package org.apache.maven.surefire.junitcore;
  * under the License.
  */
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.apache.maven.surefire.common.junit4.JUnit4RunListener;
@@ -29,7 +30,9 @@ import org.junit.runner.Computer;
 import org.junit.runner.JUnitCore;
 import org.junit.runner.Request;
 import org.junit.runner.Result;
+import org.junit.runner.Runner;
 import org.junit.runner.manipulation.Filter;
+import org.junit.runner.manipulation.NoTestsRemainException;
 import org.junit.runner.notification.RunListener;
 
 /**
@@ -40,6 +43,32 @@ import org.junit.runner.notification.RunListener;
 
 class JUnitCoreWrapper
 {
+    private static class FilteringRequest
+        extends Request
+    {
+        private Runner filteredRunner;
+
+        public FilteringRequest( Request req, Filter filter )
+        {
+            try
+            {
+                Runner runner = req.getRunner();
+                filter.apply( runner );
+                filteredRunner = runner;
+            }
+            catch ( NoTestsRemainException e )
+            {
+                filteredRunner = null;
+            }
+        }
+
+        @Override
+        public Runner getRunner()
+        {
+            return filteredRunner;
+        }
+    }
+
     public static void execute( TestsToRun testsToRun, JUnitCoreParameters 
jUnitCoreParameters,
                                 List<RunListener> listeners, Filter filter )
         throws TestSetFailedException
@@ -53,14 +82,23 @@ class JUnitCoreWrapper
 
         try
         {
-            Request req = Request.classes( computer, 
testsToRun.getLocatedClasses() );
-            if ( filter != null )
+            // in order to support LazyTestsToRun, the iterator must be used
+            Iterator classIter = testsToRun.iterator();
+            while ( classIter.hasNext() )
             {
-                req = req.filterWith( filter );
-            }
+                Request req = Request.classes( computer, new Class[]{ (Class) 
classIter.next() } );
+                if ( filter != null )
+                {
+                    req = new FilteringRequest( req, filter );
+                    if ( req.getRunner() == null )
+                    {
+                        continue;
+                    }
+                }
 
-            final Result run = junitCore.run( req );
-            JUnit4RunListener.rethrowAnyTestMechanismFailures( run );
+                final Result run = junitCore.run( req );
+                JUnit4RunListener.rethrowAnyTestMechanismFailures( run );
+            }
         }
         finally
         {

Reply via email to