You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2011/11/09 18:04:59 UTC

svn commit: r1199853 - in /maven/surefire/trunk: maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ surefire-api/src/main/java/org/apache/maven/surefire/util/ surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/ su...

Author: krosenvold
Date: Wed Nov  9 17:04:57 2011
New Revision: 1199853

URL: http://svn.apache.org/viewvc?rev=1199853&view=rev
Log:
[SUREFIRE-329] Support JUnit @Category

Main patch by Todd Lipcon. Slight modifications supplied by nkeywal.

Both original patch and modifications heavily modified by me.

Test cases in JUnit48TestCategoriesIT

Added:
    maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java
      - copied, changed from r1188905, maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/pom.xml
      - copied, changed from r1188905, maven/surefire/trunk/surefire-providers/pom.xml
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java   (with props)
    maven/surefire/trunk/surefire-providers/common-junit48/
    maven/surefire/trunk/surefire-providers/common-junit48/pom.xml
      - copied, changed from r1188905, maven/surefire/trunk/surefire-providers/pom.xml
    maven/surefire/trunk/surefire-providers/common-junit48/src/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java   (with props)
    maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java   (with props)
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/
    maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java   (with props)
    maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml   (with props)
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java   (with props)
Modified:
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/TestsToRun.java
    maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit47-redirect-output/pom.xml
    maven/surefire/trunk/surefire-providers/pom.xml
    maven/surefire/trunk/surefire-providers/surefire-junit47/pom.xml
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java Wed Nov  9 17:04:57 2011
@@ -256,14 +256,7 @@ public abstract class AbstractSurefireMo
         {
             getProperties().setProperty( "parallel", this.getParallel() );
         }
-        if ( this.getExcludedGroups() != null )
-        {
-            getProperties().setProperty( "excludegroups", this.getExcludedGroups() );
-        }
-        if ( this.getGroups() != null )
-        {
-            getProperties().setProperty( "groups", this.getGroups() );
-        }
+        convertGroupParameters();
 
         if ( this.getThreadCount() > 0 )
         {
@@ -281,6 +274,22 @@ public abstract class AbstractSurefireMo
 
     }
 
+    private void convertGroupParameters()
+    {
+        if ( getProperties() == null ) // May be predefined from plugin paramaters
+        {
+            setProperties( new Properties() );
+        }
+        if ( this.getExcludedGroups() != null )
+        {
+            getProperties().setProperty( "excludedgroups", this.getExcludedGroups() );
+        }
+        if ( this.getGroups() != null )
+        {
+            getProperties().setProperty( "groups", this.getGroups() );
+        }
+    }
+
     protected boolean isAnyConcurrencySelected()
     {
         return this.getParallel() != null && this.getParallel().trim().length() > 0;
@@ -379,11 +388,8 @@ public abstract class AbstractSurefireMo
             providerProperties = new Properties();
         }
 
-        ProviderConfiguration providerConfiguration1 =
-            new ProviderConfiguration( directoryScannerParameters, failIfNoTests, reporterConfiguration, testNg,
-                                       testSuiteDefinition, providerProperties, null );
-
-        return providerConfiguration1;
+        return new ProviderConfiguration( directoryScannerParameters, failIfNoTests, reporterConfiguration, testNg,
+                                   testSuiteDefinition, providerProperties, null );
     }
 
     StartupConfiguration createStartupConfiguration( ForkConfiguration forkConfiguration, ProviderInfo provider,
@@ -1123,7 +1129,7 @@ public abstract class AbstractSurefireMo
             getLog().warn( "useSystemClassloader setting has no effect when not forking" );
         }
     }
-    
+
     private RunOrder getRunOrderObject() {
         RunOrder runOrder = RunOrder.valueOf( getRunOrder() );
         return runOrder == null ? RunOrder.FILESYSTEM : runOrder;
@@ -1262,6 +1268,7 @@ public abstract class AbstractSurefireMo
         public void addProviderProperties()
         {
             convertJunitCoreParameters();
+            convertGroupParameters();
         }
 
         public Classpath getProviderClasspath()

Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/TestsToRun.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/TestsToRun.java?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/TestsToRun.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/TestsToRun.java Wed Nov  9 17:04:57 2011
@@ -19,14 +19,13 @@ package org.apache.maven.surefire.util;
  * under the License.
  */
 
-import org.apache.maven.surefire.testset.TestSetFailedException;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import org.apache.maven.surefire.testset.TestSetFailedException;
 
 /**
  * Contains all the tests that have been found according to specified include/exclude
@@ -84,4 +83,20 @@ public class TestsToRun
     {
         return locatedClasses.iterator();
     }
+
+    public String toString()
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append( "TestsToRun: [" );
+        Iterator it = iterator();
+        while ( it.hasNext() )
+        {
+            Class clazz = (Class) it.next();
+            sb.append( " " ).append( clazz.getName() );
+        }
+
+        sb.append( ']' );
+        return sb.toString();
+    }
+
 }

Copied: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java (from r1188905, maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java?p2=maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java&p1=maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java&r1=1188905&r2=1199853&rev=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java Wed Nov  9 17:04:57 2011
@@ -20,50 +20,44 @@ package org.apache.maven.surefire.its;
 
 
 /**
- * Test project using JUnit4.4 -dep.  junit-dep includes only junit.* classes, and depends explicitly on hamcrest-core
+ * Test project using "groups" support
  *
- * @author <a href="mailto:dfabulich@apache.org">Dan Fabulich</a>
+ * @author <a href="mailto:todd@apache.org">Todd Lipcon</a>
  */
-public class JUnitDepIT
+public class JUnit48TestCategoriesIT
     extends SurefireVerifierTestClass
 {
-    public JUnitDepIT()
+    public JUnit48TestCategoriesIT()
     {
-        super( "/junit44-dep" );
+        super( "/junit48-categories" );
     }
 
-    public void testJUnit44Dep()
+    public void testCategoriesAB()
         throws Exception
     {
-        debugLogging();
-        addGoal( "-Djunit-dep.version=4.4" );
-        executeTest();
-
-        verifyErrorFreeLog();
-        assertTestSuiteResults( 1, 0, 0, 0 );
-        verifyTextInLog( "surefire-junit4" ); // Ahem. Will match on the 4.7 provider too
-    }
-    public void testJUnit44DepWithSneaky381()
-        throws Exception
-    {
-        debugLogging();
-        activateProfile("provided381");
-        addGoal( "-Djunit-dep.version=4.4" );
         executeTest();
         verifyErrorFreeLog();
-        assertTestSuiteResults( 1, 0, 0, 0 );
+        assertTestSuiteResults( 2, 0, 0, 0 );
+        verifyTextInLog("catA: 1");
+        verifyTextInLog("catB: 1");
+        verifyTextInLog("catC: 0");
+        verifyTextInLog("catNone: 0");
     }
 
-    public void testJUnit47Dep()
+    public void testCategoriesAC()
         throws Exception
     {
-        debugLogging();
-        addGoal( "-Djunit-dep.version=4.7" );
+        addGoal( "-Dgroups=junit4.CategoryA,junit4.CategoryC" );
         executeTest();
         verifyErrorFreeLog();
-        assertTestSuiteResults( 1, 0, 0, 0 );
-        verifyTextInLog( "surefire-junit47" );
+        assertTestSuiteResults( 6, 0, 0, 0 );
+        verifyTextInLog("catA: 1");
+        verifyTextInLog("catB: 0");
+        verifyTextInLog("catC: 1");
+        verifyTextInLog("catNone: 0");
+        verifyTextInLog("mA: 1");
+        verifyTextInLog("mB: 1"); // This seems questionable !? The class is annotated with category C and method with B
+        verifyTextInLog("mC: 1");
+        verifyTextInLog("CatNone: 1");
     }
-
-
 }

Modified: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/JUnitDepIT.java Wed Nov  9 17:04:57 2011
@@ -43,11 +43,12 @@ public class JUnitDepIT
         assertTestSuiteResults( 1, 0, 0, 0 );
         verifyTextInLog( "surefire-junit4" ); // Ahem. Will match on the 4.7 provider too
     }
+
     public void testJUnit44DepWithSneaky381()
         throws Exception
     {
         debugLogging();
-        activateProfile("provided381");
+        activateProfile( "provided381" );
         addGoal( "-Djunit-dep.version=4.4" );
         executeTest();
         verifyErrorFreeLog();
@@ -65,5 +66,14 @@ public class JUnitDepIT
         verifyTextInLog( "surefire-junit47" );
     }
 
-
+    public void testJUnit48Dep()
+        throws Exception
+    {
+        debugLogging();
+        addGoal( "-Djunit-dep.version=4.8" );
+        executeTest();
+        verifyErrorFreeLog();
+        assertTestSuiteResults( 1, 0, 0, 0 );
+        verifyTextInLog( "surefire-junit47" );
+    }
 }

Modified: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit47-redirect-output/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit47-redirect-output/pom.xml?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit47-redirect-output/pom.xml (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit47-redirect-output/pom.xml Wed Nov  9 17:04:57 2011
@@ -33,7 +33,7 @@
               <dependency>
                 <groupId>org.apache.maven.surefire</groupId>
                 <artifactId>surefire-junit47</artifactId>
-                <version>2.7.2</version>
+                <version>${surefire.version}</version>
               </dependency>
             </dependencies>
            <configuration>

Copied: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/pom.xml (from r1188905, maven/surefire/trunk/surefire-providers/pom.xml)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/pom.xml?p2=maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/pom.xml&p1=maven/surefire/trunk/surefire-providers/pom.xml&r1=1188905&r2=1199853&rev=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/pom.xml (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/pom.xml Wed Nov  9 17:04:57 2011
@@ -18,51 +18,57 @@
   ~ under the License.
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.maven.surefire</groupId>
-    <artifactId>surefire</artifactId>
-    <version>2.11-SNAPSHOT</version>
-    <relativePath>../pom.xml</relativePath>
-  </parent>
-
-  <artifactId>surefire-providers</artifactId>
-  <packaging>pom</packaging>
-
-  <name>SureFire Providers</name>
-
-  <modules>
-    <module>common-junit3</module>
-    <module>common-junit4</module>
-    <module>surefire-junit3</module>
-    <module>surefire-junit4</module>
-    <module>surefire-junit47</module>
-    <module>surefire-testng-utils</module>
-    <module>surefire-testng</module>
-  </modules>
+  <groupId>org.apache.maven.plugins.surefire</groupId>
+  <artifactId>junit4</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>Test for JUnit 4.8.1</name>
+
+
+  <properties>
+    <junitVersion>4.8.1</junitVersion>
+      <groups>junit4.CategoryA,junit4.CategoryB</groups>
+  </properties>
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven.surefire</groupId>
-      <artifactId>surefire-api</artifactId>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${junitVersion}</version>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefire.version}</version>
+        <configuration>
+          <groups>${groups}</groups>
+        </configuration>
         <dependencies>
           <dependency>
             <groupId>org.apache.maven.surefire</groupId>
-            <artifactId>surefire-shadefire</artifactId>
-            <version>${project.version}</version>
+            <artifactId>surefire-junit47</artifactId>
+            <version>${surefire.version}</version>
           </dependency>
         </dependencies>
       </plugin>
     </plugins>
   </build>
-</project>
 
+</project>

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,54 @@
+package junit4;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+
+public class BasicTest
+{
+    static int catACount = 0;
+    static int catBCount = 0;
+    static int catCCount = 0;
+    static int catNoneCount = 0;
+
+    @Test
+    @Category(CategoryA.class)
+    public void testInCategoryA()
+    {
+        System.out.println( "Ran testInCategoryA" );
+        catACount++;
+    }
+
+    @Test
+    @Category(CategoryB.class)
+    public void testInCategoryB()
+    {
+        System.out.println( "Ran testInCategoryB" );
+        catBCount++;
+    }
+
+    @Test
+    @Category(CategoryC.class)
+    public void testInCategoryC()
+    {
+        System.out.println( "Ran testInCategoryC" );
+        catCCount++;
+    }
+
+    @Test
+    public void testInNoCategory()
+    {
+        System.out.println( "Ran testInNoCategory" );
+        catNoneCount++;
+    }
+
+    @AfterClass
+    public static void oneTimeTearDown()
+    {
+        System.out.println("catA: " + catACount + "\n" +
+            "catB: " + catBCount + "\n" +
+            "catC: " + catCCount + "\n" +
+            "catNone: " + catNoneCount);
+    }
+}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/BasicTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,3 @@
+package junit4;
+
+interface CategoryA {}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryA.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,3 @@
+package junit4;
+
+interface CategoryB {}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryB.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,3 @@
+package junit4;
+
+interface CategoryC {}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryC.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,49 @@
+package junit4;
+import org.junit.AfterClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+
+@Category(CategoryC.class)
+public class CategoryCTest
+{
+    static int catACount = 0;
+    static int catBCount = 0;
+    static int catCCount = 0;
+    static int catNoneCount = 0;
+
+    @Test
+    public void testInCategoryA()
+    {
+        catACount++;
+    }
+
+    @Test
+    @Category(CategoryB.class)
+    public void testInCategoryB()
+    {
+        catBCount++;
+    }
+
+    @Test
+    @Category(CategoryC.class)
+    public void testInCategoryC()
+    {
+        catCCount++;
+    }
+
+    @Test
+    public void testInNoCategory()
+    {
+        catNoneCount++;
+    }
+
+    @AfterClass
+    public static void oneTimeTearDown()
+    {
+        System.out.println("mA: " + catACount + "\n" +
+            "mB: " + catBCount + "\n" +
+            "mC: " + catCCount + "\n" +
+            "CatNone: " + catNoneCount);
+    }
+}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/junit48-categories/src/test/java/junit4/CategoryCTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: maven/surefire/trunk/surefire-providers/common-junit48/pom.xml (from r1188905, maven/surefire/trunk/surefire-providers/pom.xml)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/common-junit48/pom.xml?p2=maven/surefire/trunk/surefire-providers/common-junit48/pom.xml&p1=maven/surefire/trunk/surefire-providers/pom.xml&r1=1188905&r2=1199853&rev=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/pom.xml (original)
+++ maven/surefire/trunk/surefire-providers/common-junit48/pom.xml Wed Nov  9 17:04:57 2011
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
   ~ Licensed to the Apache Software Foundation (ASF) under one
   ~ or more contributor license agreements.  See the NOTICE file
@@ -23,46 +22,38 @@
 
   <parent>
     <groupId>org.apache.maven.surefire</groupId>
-    <artifactId>surefire</artifactId>
+    <artifactId>surefire-providers</artifactId>
     <version>2.11-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
-  <artifactId>surefire-providers</artifactId>
-  <packaging>pom</packaging>
+  <artifactId>common-junit48</artifactId>
 
-  <name>SureFire Providers</name>
-
-  <modules>
-    <module>common-junit3</module>
-    <module>common-junit4</module>
-    <module>surefire-junit3</module>
-    <module>surefire-junit4</module>
-    <module>surefire-junit47</module>
-    <module>surefire-testng-utils</module>
-    <module>surefire-testng</module>
-  </modules>
+  <name>Shared JUnit48 Provider Code</name>
 
   <dependencies>
     <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>org.apache.maven.surefire</groupId>
-      <artifactId>surefire-api</artifactId>
+      <artifactId>common-junit4</artifactId>
+      <version>${project.version}</version>
     </dependency>
-  </dependencies>
+ </dependencies>
 
   <build>
     <plugins>
       <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <dependencies>
-          <dependency>
-            <groupId>org.apache.maven.surefire</groupId>
-            <artifactId>surefire-shadefire</artifactId>
-            <version>${project.version}</version>
-          </dependency>
-        </dependencies>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
       </plugin>
     </plugins>
   </build>
 </project>
-

Added: 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=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java (added)
+++ maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,155 @@
+package org.apache.maven.surefire.common.junit48;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.junit.experimental.categories.Categories;
+import org.junit.runner.Description;
+import org.junit.runner.manipulation.Filter;
+
+/**
+ * @author Todd Lipcon
+ */
+public class FilterFactory
+{
+    private final ClassLoader testClassLoader;
+
+    public FilterFactory( ClassLoader testClassLoader )
+    {
+        this.testClassLoader = testClassLoader;
+    }
+
+    public Filter createGroupFilter( Properties providerProperties )
+    {
+        providerProperties.list( System.err );
+        String groups = providerProperties.getProperty( "groups" );
+        String excludedGroups = providerProperties.getProperty( "excludedgroups" );
+        List<Filter> included = commaSeparatedListToFilters( groups );
+        List<Filter> excluded = commaSeparatedListToFilters( excludedGroups );
+        return new CombinedCategoryFilter( included, excluded );
+    }
+
+    private List<Filter> commaSeparatedListToFilters( String str )
+    {
+        List<Filter> included = new ArrayList<Filter>();
+        if ( str != null )
+        {
+            for ( String group : str.split( "," ) )
+            {
+                group = group.trim();
+                if ( group == null || group.length() == 0)
+                {
+                    continue;
+                }
+                Class<?> categoryType = classloadCategory( group );
+                included.add( Categories.CategoryFilter.include( categoryType ) );
+            }
+        }
+        return included;
+    }
+
+    private static class CombinedCategoryFilter
+        extends Filter
+    {
+        private final List<Filter> includedFilters;
+
+        private final List<Filter> excludedFilters;
+
+        public CombinedCategoryFilter( List<Filter> includedFilters, List<Filter> excludedFilters )
+        {
+            this.includedFilters = includedFilters;
+            this.excludedFilters = excludedFilters;
+        }
+
+        @Override
+        public boolean shouldRun( Description description )
+        {
+            return ( includedFilters.isEmpty() || inOneOfFilters( includedFilters, description ) ) && (
+                excludedFilters.isEmpty() || !inOneOfFilters( excludedFilters, description ) );
+        }
+
+        private boolean inOneOfFilters( List<Filter> filters, Description description )
+        {
+            for ( Filter f : filters )
+            {
+                if ( f.shouldRun( description ) )
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        @Override
+        public String describe()
+        {
+            StringBuilder sb = new StringBuilder();
+            if ( !includedFilters.isEmpty() )
+            {
+                sb.append( "(" );
+                sb.append( joinFilters( includedFilters, " OR " ) );
+                sb.append( ")" );
+                if ( !excludedFilters.isEmpty() )
+                {
+                    sb.append( " AND " );
+                }
+            }
+            if ( !excludedFilters.isEmpty() )
+            {
+                sb.append( "NOT (" );
+                sb.append( joinFilters( includedFilters, " OR " ) );
+                sb.append( ")" );
+            }
+
+            return sb.toString();
+        }
+
+        private String joinFilters( List<Filter> filters, String sep )
+        {
+            int i = 0;
+            StringBuilder sb = new StringBuilder();
+            for ( Filter f : filters )
+            {
+                if ( i++ > 0 )
+                {
+                    sb.append( sep );
+                }
+                sb.append( f.describe() );
+            }
+            return sb.toString();
+        }
+    }
+
+    private Class<?> classloadCategory( String category )
+    {
+        try
+        {
+            return testClassLoader.loadClass( category );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            throw new RuntimeException( "Unable to load category: " + category, e );
+        }
+    }
+
+}

Propchange: maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/FilterFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java (added)
+++ maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,50 @@
+package org.apache.maven.surefire.common.junit48;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.surefire.util.ReflectionUtils;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public final class JUnit48Reflector
+{
+    private static final String CATEGORIES = "org.junit.experimental.categories.Categories";
+    private static final String CATEGORY = "org.junit.experimental.categories.Category";
+
+    private final Class categories;
+
+    private final Class category;
+
+    public JUnit48Reflector( ClassLoader testClassLoader )
+    {
+        categories = ReflectionUtils.tryLoadClass( testClassLoader, CATEGORIES );
+        category = ReflectionUtils.tryLoadClass( testClassLoader, CATEGORY );
+    }
+
+    public boolean isJUnit48Available()
+    {
+        return categories != null;
+    }
+    
+    public boolean isCategoryAnnotationPresent(Class clazz){
+        return category != null && clazz.getAnnotation( category ) != null;
+    }
+}

Propchange: maven/surefire/trunk/surefire-providers/common-junit48/src/main/java/org/apache/maven/surefire/common/junit48/JUnit48Reflector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java (added)
+++ maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,57 @@
+package org.apache.maven.surefire.common.junit48;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import junit.framework.TestCase;
+import org.junit.experimental.categories.Category;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class JUnit48ReflectorTest
+    extends TestCase
+{
+    public void testIsJUnit48Available()
+        throws Exception
+    {
+        JUnit48Reflector  jUnit48Reflector = new JUnit48Reflector( this.getClass().getClassLoader() );
+        assertTrue(  jUnit48Reflector.isJUnit48Available() );
+    }
+
+    public void testCategoryAnnotation()
+        throws Exception
+    {
+        JUnit48Reflector  jUnit48Reflector = new JUnit48Reflector( this.getClass().getClassLoader() );
+        assertTrue(  jUnit48Reflector.isCategoryAnnotationPresent(Test1.class) );
+        assertFalse(  jUnit48Reflector.isCategoryAnnotationPresent(Test2.class) );
+    }
+    
+    interface Foo{
+        
+    }
+    @Category(Foo.class)
+    private class Test1 {
+        
+    }
+    private class Test2 {
+
+    }
+
+}

Propchange: maven/surefire/trunk/surefire-providers/common-junit48/src/test/java/org/apache/maven/surefire/common/junit48/JUnit48ReflectorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/surefire/trunk/surefire-providers/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/pom.xml?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/pom.xml (original)
+++ maven/surefire/trunk/surefire-providers/pom.xml Wed Nov  9 17:04:57 2011
@@ -36,6 +36,7 @@
   <modules>
     <module>common-junit3</module>
     <module>common-junit4</module>
+    <module>common-junit48</module>
     <module>surefire-junit3</module>
     <module>surefire-junit4</module>
     <module>surefire-junit47</module>

Added: maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml (added)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml Wed Nov  9 17:04:57 2011
@@ -0,0 +1,8 @@
+<project default="copy-resources">
+  <target name="init"/>
+  <target name="copy-resources" depends="init">
+    <copy todir="target/classes/META-INF" filtering="false">
+      <fileset dir="src/main/resources/META-INF" includes="" excludes="**/*.java"/>
+    </copy>
+  </target>
+</project>
\ No newline at end of file

Propchange: maven/surefire/trunk/surefire-providers/surefire-junit47/maven-eclipse.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/pom.xml?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/pom.xml (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/pom.xml Wed Nov  9 17:04:57 2011
@@ -53,6 +53,11 @@
       <artifactId>common-junit4</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven.surefire</groupId>
+      <artifactId>common-junit48</artifactId>
+      <version>${project.version}</version>
+    </dependency>
   </dependencies>
 
   <build>

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java Wed Nov  9 17:04:57 2011
@@ -19,12 +19,15 @@ package org.apache.maven.surefire.junitc
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory;
 import org.apache.maven.surefire.common.junit4.JUnit4TestChecker;
+import org.apache.maven.surefire.common.junit48.FilterFactory;
+import org.apache.maven.surefire.common.junit48.JUnit48Reflector;
 import org.apache.maven.surefire.providerapi.AbstractProvider;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.report.ConsoleLogger;
@@ -39,6 +42,9 @@ import org.apache.maven.surefire.util.Di
 import org.apache.maven.surefire.util.ScannerFilter;
 import org.apache.maven.surefire.util.TestsToRun;
 
+import org.junit.runner.Description;
+import org.junit.runner.manipulation.Filter;
+
 /**
  * @author Kristian Rosenvold
  */
@@ -60,6 +66,7 @@ public class JUnitCoreProvider
 
     private TestsToRun testsToRun;
 
+    private JUnit48Reflector jUnit48Reflector;
 
     public JUnitCoreProvider( ProviderParameters providerParameters )
     {
@@ -70,7 +77,7 @@ public class JUnitCoreProvider
         this.scannerFilter = new JUnit4TestChecker( testClassLoader );
         customRunListeners = JUnit4RunListenerFactory.
             createCustomListeners( providerParameters.getProviderProperties().getProperty( "listener" ) );
-
+        jUnit48Reflector = new JUnit48Reflector( testClassLoader );
     }
 
     public Boolean isRunnable()
@@ -93,9 +100,11 @@ public class JUnitCoreProvider
         final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger();
         consoleLogger.info( message );
 
+        final Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null;
+
         if ( testsToRun == null )
         {
-            testsToRun = forkTestSet == null ? scanClassPath() : TestsToRun.fromClass( (Class) forkTestSet );
+            testsToRun = forkTestSet == null ? getSuitesAsList( filter ) : TestsToRun.fromClass( (Class) forkTestSet );
         }
         final Map<String, TestSet> testSetMap = new ConcurrentHashMap<String, TestSet>();
 
@@ -109,10 +118,34 @@ public class JUnitCoreProvider
         org.junit.runner.notification.RunListener jUnit4RunListener = new JUnitCoreRunListener( listener, testSetMap );
         customRunListeners.add( 0, jUnit4RunListener );
 
-        JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners );
+        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();
+        Iterator<Class<?>> it = max.iterator();
+        while ( it.hasNext() )
+        {
+            Class<?> clazz = it.next();
+            boolean isCategoryAnnotatedClass = jUnit48Reflector.isCategoryAnnotationPresent( clazz);
+            Description d = Description.createSuiteDescription( clazz );
+            if ( !isCategoryAnnotatedClass || filter == null || filter.shouldRun( d ) )
+            {
+                res.add( clazz );
+            }
+        }
+        return new TestsToRun( res );
+    }
+
+    private Filter createJUnit48Filter()
+    {
+        return new FilterFactory( testClassLoader ).createGroupFilter( providerParameters.getProviderProperties() );
+    }
+
     private TestsToRun scanClassPath()
     {
         return directoryScanner.locateTestClasses( testClassLoader, scannerFilter );

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java?rev=1199853&r1=1199852&r2=1199853&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java Wed Nov  9 17:04:57 2011
@@ -26,7 +26,9 @@ import org.apache.maven.surefire.util.Te
 
 import org.junit.runner.Computer;
 import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
 import org.junit.runner.Result;
+import org.junit.runner.manipulation.Filter;
 import org.junit.runner.notification.RunListener;
 
 /**
@@ -38,7 +40,7 @@ import org.junit.runner.notification.Run
 class JUnitCoreWrapper
 {
     public static void execute( TestsToRun testsToRun, JUnitCoreParameters jUnitCoreParameters,
-                                List<RunListener> listeners )
+                                List<RunListener> listeners, Filter filter )
         throws TestSetFailedException
     {
         Computer computer = getComputer( jUnitCoreParameters );
@@ -47,9 +49,16 @@ class JUnitCoreWrapper
         {
             junitCore.addListener( runListener );
         }
+
+        Request req = Request.classes( computer, testsToRun.getLocatedClasses() );
+        if ( filter != null )
+        {
+            req = req.filterWith( filter );
+        }
+
         try
         {
-            final Result run = junitCore.run( computer, testsToRun.getLocatedClasses() );
+            final Result run = junitCore.run( req );
 
             if ( run.getFailureCount() > 0 )
             {

Added: maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java?rev=1199853&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java (added)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java Wed Nov  9 17:04:57 2011
@@ -0,0 +1,181 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.maven.surefire.junitcore;
+
+import java.io.File;
+import java.util.HashMap;
+import org.apache.maven.plugin.surefire.report.FileReporterFactory;
+import org.apache.maven.surefire.booter.StartupReportConfiguration;
+import org.apache.maven.surefire.report.DefaultConsoleReporter;
+import org.apache.maven.surefire.report.ReporterConfiguration;
+import org.apache.maven.surefire.report.ReporterFactory;
+import org.apache.maven.surefire.report.RunListener;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.Computer;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+/**
+ * TestCase that expose "No tests were executed!" on Test failure using Maven Surefire 2.6-SNAPSHOT
+ * and the JUnit 4.8 Runner.
+ * <p/>
+ * -------------------------------------------------------
+ * T E S T S
+ * -------------------------------------------------------
+ * <p/>
+ * Results :
+ * <p/>
+ * Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
+ * <p/>
+ * [INFO] ------------------------------------------------------------------------
+ * [INFO] BUILD FAILURE
+ * [INFO] ------------------------------------------------------------------------
+ * [INFO] Total time: 11.011s
+ * [INFO] Finished at: Thu Jul 15 13:59:14 CEST 2010
+ * [INFO] Final Memory: 24M/355M
+ * [INFO] ------------------------------------------------------------------------
+ * [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test
+ * (default-test) on project xxxxxx: No tests were executed!  (Set -DfailIfNoTests=false to
+ * ignore this error.) -> [Help 1]
+ * <p/>
+ * <p/>
+ * <dependency>
+ * <groupId>junit</groupId>
+ * <artifactId>junit</artifactId>
+ * <version>4.8.1</version>
+ * <scope>test</scope>
+ * </dependency>
+ * <p/>
+ * <dependency>
+ * <groupId>org.apache.maven.surefire</groupId>
+ * <artifactId>surefire-booter</artifactId>
+ * <version>2.6-SNAPSHOT</version>
+ * <scope>test</scope>
+ * </dependency>
+ * <dependency>
+ * <groupId>org.apache.maven.plugins</groupId>
+ * <artifactId>maven-surefire-plugin</artifactId>
+ * <version>2.6-SNAPSHOT</version>
+ * <scope>test</scope>
+ * </dependency>
+ * <dependency>
+ * <groupId>org.apache.maven.surefire</groupId>
+ * <artifactId>surefire-junit48</artifactId>
+ * <version>2.6-SNAPSHOT</version>
+ * <scope>test</scope>
+ * </dependency>
+ *
+ * @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
+ * @version $Revision: $
+ */
+public class MavenSurefireJUnit48RunnerTest
+    extends TestCase
+{
+
+    /*
+    * Assumption:
+    * The ConcurrentReportingRunListener assumes a Test will be Started before it Fails or Finishes.
+    *
+    * Reality:
+    * JUnits ParentRunner is responsible for adding the BeforeClass/AfterClass statements to the
+    * statement execution chain. After BeforeClass is executed, a Statement that delegates to the
+    * abstract method: runChild(T child, RunNotifier notifier) is called. As the JavaDoc explains:
+    * "Subclasses are responsible for making sure that relevant test events are reported through {@code notifier}".
+    * When a @BeforeClass fail, the child that should handle the relevant test events(Started, Failed, Finished)
+    * is never executed.
+    *
+    * Result:
+    * When Test Failed event is received in ConcurrentReportingRunListener without a Started event received first,
+    * it causes a NullPointException because there is no ClassReporter setup for that class yet. When this Exception
+    * is thrown from the ConcurrentReportingRunListener, JUnit catches the exception and reports is as a Failed test.
+    * But to avoid a wild loop, it removes the failing Listener before calling Failed test again. Since the
+    * ConcurrentReportingRunListener now is removed from the chain it will never receive the RunFinished event
+    * and the recorded state will never be replayed on the ReportManager.
+    *
+    * The End result: ReporterManager falsely believe no Test were run.
+    *
+    */
+    @SuppressWarnings( { "unchecked", "ThrowableResultOfMethodCallIgnored" } )
+    public void testSurefireShouldBeAbleToReportRunStatusEvenWithFailingTests()
+        throws Exception
+    {
+        ReporterFactory reporterManagerFactory = new FileReporterFactory( StartupReportConfiguration.defaultNoXml() );
+
+        final HashMap<String, TestSet> classMethodCounts = new HashMap<String, TestSet>();
+        RunListener reporter =
+            ConcurrentReporterManager.createInstance( classMethodCounts, reporterManagerFactory, false, false,
+                                                      new DefaultConsoleReporter( System.out ) );
+
+        org.junit.runner.notification.RunListener concurrentReportingRunListener =
+            new JUnitCoreRunListener( reporter, classMethodCounts );
+        Computer computer = new Computer();
+
+        JUnitCore junitCore = new JUnitCore();
+
+        junitCore.addListener( concurrentReportingRunListener );
+
+        Result result = junitCore.run( computer, FailingTestClassTestNot.class );
+
+        junitCore.removeListener( concurrentReportingRunListener );
+
+        Assert.assertEquals( "JUnit should report correctly number of test ran(Finished)", 0, result.getRunCount() );
+
+        // Sys.out swallowed in ConsoleReporter..
+        for ( Failure failure : result.getFailures() )
+        {
+            System.out.println( failure.getException().getMessage() );
+        }
+
+        Assert.assertEquals( "There should only be one Exception reported, the one from the failing TestCase", 1,
+                             result.getFailureCount() );
+
+        Assert.assertEquals( "The exception thrown by the failing TestCase", RuntimeException.class,
+                             result.getFailures().get( 0 ).getException().getClass() );
+
+        reporterManagerFactory.close();
+    }
+
+    private ReporterConfiguration getReporterConfiguration()
+    {
+        return new ReporterConfiguration( new File( "." ), true );
+    }
+
+    /**
+     * Simple TestCase to force a Exception in @BeforeClass.
+     */
+    public static class FailingTestClassTestNot
+    {
+        @BeforeClass
+        public static void failingBeforeClass()
+            throws Exception
+        {
+            throw new RuntimeException( "Opps, we failed in @BeforeClass" );
+        }
+
+        @Test
+        public void shouldNeverBeCalled()
+            throws Exception
+        {
+            Assert.assertTrue( true );
+        }
+    }
+}

Propchange: maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MavenSurefireJUnit48RunnerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native