Author: jdcasey
Date: Mon Jan 16 18:15:51 2012
New Revision: 1232091

URL: http://svn.apache.org/viewvc?rev=1232091&view=rev
Log:
[SUREFIRE-806] Adding parameter 'failIfNoSpecifiedTests' and separating 
-Dtest=... specified tests from includes, so they will not be included in every 
execution of the test mojo automatically. If a -Dtest=... class is not already 
included via the <includes/> of an execution, it will not be run in that 
execution. If -DfailIfNoSpecifiedTests=true and no specified tests are 
available in a particular execution of the plugin, the build will fail. When 
using -Dtest=... the plugin will now check if a value is set for 
-DfailIfNoSpecifiedTests, then -DfailIfNoTests, then default to fail if no 
specified test is present in a particular execution.

Still need integration tests for this feature, and may need a more careful 
examination of what happens with -Dtest using some test class that's not 
normally included, when there's only a single execution.

Added:
    
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java
   (with props)
    
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java
   (with props)
Modified:
    
maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
    
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
    
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java
    
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/BooterSerializer.java
    
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
    
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
    
maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
    
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
    
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
    
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/DirectoryScannerParameters.java
    
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultDirectoryScanner.java
    
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/DefaultDirectoryScannerTest.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterConstants.java
    
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
    
maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
    
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
    
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java

Modified: 
maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
 (original)
+++ 
maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
 Mon Jan 16 18:15:51 2012
@@ -352,6 +352,15 @@ public class IntegrationTestMojo
     private Boolean failIfNoTests;
 
     /**
+     * Set this to "true" to cause a failure if the none of the tests 
specified in -Dtest=... are run. Defaults to
+     * "true".
+     * 
+     * @parameter expression="${it.failIfNoSpecifiedTests}"
+     * @since 2.12
+     */
+    private Boolean failIfNoSpecifiedTests;
+
+    /**
      * Option to specify the forking mode. Can be "never", "once", "always" or 
"perthread". "none" and "pertest" are also accepted
      * for backwards compatibility. "always" forks for each test-class. 
"perthread" will create "threadCount" parallel forks.
      *
@@ -1407,4 +1416,14 @@ public class IntegrationTestMojo
         checksum.add( summaryFile );
     }
 
+    public Boolean getFailIfNoSpecifiedTests()
+    {
+        return failIfNoSpecifiedTests;
+    }
+
+    public void setFailIfNoSpecifiedTests( Boolean failIfNoSpecifiedTests )
+    {
+        this.failIfNoSpecifiedTests = failIfNoSpecifiedTests;
+    }
+
 }

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=1232091&r1=1232090&r2=1232091&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
 Mon Jan 16 18:15:51 2012
@@ -386,18 +386,34 @@ public abstract class AbstractSurefireMo
         }
         else
         {
-            if ( isSpecificTestSpecified() && getFailIfNoTests() == null )
+            if ( isSpecificTestSpecified() )
             {
-                setFailIfNoTests( Boolean.TRUE );
-            }
+                if ( getFailIfNoSpecifiedTests() != null )
+                {
+                    failIfNoTests = getFailIfNoSpecifiedTests().booleanValue();
+                }
+                else if ( getFailIfNoTests() != null )
+                {
+                    failIfNoTests = getFailIfNoTests().booleanValue();
+                }
+                else
+                {
+                    failIfNoTests = true;
+                }
 
-            failIfNoTests = getFailIfNoTests() != null && getFailIfNoTests();
+                setFailIfNoTests( Boolean.valueOf( failIfNoTests ) );
+            }
+            else
+            {
+                failIfNoTests = getFailIfNoTests() != null && 
getFailIfNoTests().booleanValue();
+            }
 
             List<String> includes = getIncludeList();
             List<String> excludes = getExcludeList();
-            directoryScannerParameters = new DirectoryScannerParameters( 
getTestClassesDirectory(), includes, excludes,
-                                                                         
failIfNoTests,
-                                                                         
getRunOrder() );
+            List<String> specificTests = getSpecificTests();
+            directoryScannerParameters =
+                new DirectoryScannerParameters( getTestClassesDirectory(), 
includes, excludes, specificTests,
+                                                failIfNoTests, getRunOrder() );
         }
 
         Properties providerProperties = getProperties();
@@ -530,41 +546,41 @@ public abstract class AbstractSurefireMo
 
     private List<String> getIncludeList()
     {
-        List<String> includes;
-        if ( isSpecificTestSpecified() )
+        List<String> includes = this.getIncludes();
+
+        // defaults here, qdox doesn't like the end javadoc value
+        // Have to wrap in an ArrayList as surefire expects an ArrayList 
instead of a List for some reason
+        if ( includes == null || includes.size() == 0 )
         {
-            // Check to see if we are running a single test. The raw parameter 
will
-            // come through if it has not been set.
+            includes = new ArrayList<String>( Arrays.asList( 
getDefaultIncludes() ) );
+        }
 
-            // FooTest -> **/FooTest.java
+        return includes;
+    }
 
-            includes = new ArrayList<String>();
+    private List<String> getSpecificTests()
+    {
+        if ( !isSpecificTestSpecified() )
+        {
+            return Collections.emptyList();
+        }
 
-            String[] testRegexes = StringUtils.split( getTest(), "," );
+        List<String> specificTests = new ArrayList<String>();
+        String[] testRegexes = StringUtils.split( getTest(), "," );
 
-            for ( String testRegex : testRegexes )
-            {
-                if ( testRegex.endsWith( ".java" ) )
-                {
-                    testRegex = testRegex.substring( 0, testRegex.length() - 5 
);
-                }
-                // Allow paths delimited by '.' or '/'
-                testRegex = testRegex.replace( '.', '/' );
-                includes.add( "**/" + testRegex + ".java" );
-            }
-        }
-        else
+        for ( int i = 0; i < testRegexes.length; i++ )
         {
-            includes = this.getIncludes();
-
-            // defaults here, qdox doesn't like the end javadoc value
-            // Have to wrap in an ArrayList as surefire expects an ArrayList 
instead of a List for some reason
-            if ( includes == null || includes.size() == 0 )
+            String testRegex = testRegexes[i];
+            if ( testRegex.endsWith( ".java" ) )
             {
-                includes = new ArrayList<String>( Arrays.asList( 
getDefaultIncludes() ) );
+                testRegex = testRegex.substring( 0, testRegex.length() - 5 );
             }
+            // Allow paths delimited by '.' or '/'
+            testRegex = testRegex.replace( '.', '/' );
+            specificTests.add( "**/" + testRegex + ".java" );
         }
-        return includes;
+
+        return specificTests;
     }
 
     private Artifact getTestNgArtifact()

Modified: 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java
 (original)
+++ 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireExecutionParameters.java
 Mon Jan 16 18:15:51 2012
@@ -275,6 +275,10 @@ public interface SurefireExecutionParame
 
     void setToolchainManager( ToolchainManager toolchainManager );
 
+    Boolean getFailIfNoSpecifiedTests();
+
+    void setFailIfNoSpecifiedTests( Boolean failIfNoSpecifiedTests );
+
     Boolean getFailIfNoTests();
 
     void setFailIfNoTests( Boolean failIfNoTests );

Modified: 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/BooterSerializer.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/BooterSerializer.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/BooterSerializer.java
 (original)
+++ 
maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/BooterSerializer.java
 Mon Jan 16 18:15:51 2012
@@ -94,6 +94,9 @@ class BooterSerializer
                                     String.valueOf( 
directoryScannerParameters.isFailIfNoTests() ) );
             properties.addList( directoryScannerParameters.getIncludes(), 
BooterConstants.INCLUDES_PROPERTY_PREFIX );
             properties.addList( directoryScannerParameters.getExcludes(), 
BooterConstants.EXCLUDES_PROPERTY_PREFIX );
+            properties.addList( directoryScannerParameters.getSpecificTests(),
+                                BooterConstants.SPECIFIC_TEST_PROPERTY_PREFIX 
);
+
             properties.setProperty( BooterConstants.TEST_CLASSES_DIRECTORY,
                                     
directoryScannerParameters.getTestClassesDirectory() );
         }

Modified: 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
 (original)
+++ 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
 Mon Jan 16 18:15:51 2012
@@ -24,6 +24,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 import org.apache.maven.surefire.booter.BooterDeserializer;
@@ -90,7 +91,7 @@ public class BooterDeserializerProviderC
     public void testReporterConfiguration()
         throws IOException
     {
-        DirectoryScannerParameters directoryScannerParameters = 
getDirectoryScannerParameters();
+        DirectoryScannerParameters directoryScannerParameters = 
getDirectoryScannerParametersWithoutSpecificTests();
         ClassLoaderConfiguration forkConfiguration = getForkConfiguration();
 
         ProviderConfiguration providerConfiguration = 
getTestProviderConfiguration( directoryScannerParameters );
@@ -144,14 +145,14 @@ public class BooterDeserializerProviderC
     private ProviderConfiguration getReloadedProviderConfiguration()
         throws IOException
     {
-        DirectoryScannerParameters directoryScannerParameters = 
getDirectoryScannerParameters();
+        DirectoryScannerParameters directoryScannerParameters = 
getDirectoryScannerParametersWithoutSpecificTests();
         ClassLoaderConfiguration forkConfiguration = getForkConfiguration();
         ProviderConfiguration booterConfiguration = 
getTestProviderConfiguration( directoryScannerParameters );
         final StartupConfiguration testProviderConfiguration = 
getTestStartupConfiguration( forkConfiguration );
         return saveAndReload( booterConfiguration, testProviderConfiguration );
     }
 
-    private DirectoryScannerParameters getDirectoryScannerParameters()
+    private DirectoryScannerParameters 
getDirectoryScannerParametersWithoutSpecificTests()
     {
         File aDir = new File( "." );
         List<String> includes = new ArrayList<String>();
@@ -161,7 +162,7 @@ public class BooterDeserializerProviderC
         excludes.add( "xx1" );
         excludes.add( "xx2" );
 
-        return new DirectoryScannerParameters( aDir, includes, excludes, 
Boolean.TRUE,
+        return new DirectoryScannerParameters( aDir, includes, excludes, 
Collections.emptyList(), Boolean.TRUE,
                                                RunOrder.asString( 
RunOrder.DEFAULT ) );
     }
 

Modified: 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
 (original)
+++ 
maven/surefire/trunk/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerStartupConfigurationTest.java
 Mon Jan 16 18:15:51 2012
@@ -24,6 +24,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Properties;
 import org.apache.maven.surefire.booter.BooterDeserializer;
 import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
@@ -142,8 +143,8 @@ public class BooterDeserializerStartupCo
 
         File cwd = new File( "." );
         DirectoryScannerParameters directoryScannerParameters =
-            new DirectoryScannerParameters( cwd, new ArrayList<String>(), new 
ArrayList<String>(), Boolean.TRUE,
-                                            "hourly" );
+            new DirectoryScannerParameters( cwd, new ArrayList<String>(), new 
ArrayList<String>(), new ArrayList<String>(),
+                                            Boolean.TRUE, "hourly" );
         ReporterConfiguration reporterConfiguration = new 
ReporterConfiguration( cwd, Boolean.TRUE );
         String aUserRequestedTest = "aUserRequestedTest";
         String aUserRequestedTestMethod = "aUserRequestedTestMethod";

Modified: 
maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
 (original)
+++ 
maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java
 Mon Jan 16 18:15:51 2012
@@ -321,6 +321,15 @@ public class SurefirePlugin
     private Boolean failIfNoTests;
 
     /**
+     * Set this to "true" to cause a failure if the none of the tests 
specified in -Dtest=... are run. Defaults to
+     * "true".
+     * 
+     * @parameter expression="${surefire.failIfNoSpecifiedTests}"
+     * @since 2.12
+     */
+    private Boolean failIfNoSpecifiedTests;
+
+    /**
      * Option to specify the forking mode. Can be "never", "once", "always" or 
"perthread". "none" and "pertest" are also accepted
      * for backwards compatibility. "always" forks for each test-class. 
"perthread" will create "threadCount" parallel forks.
      *
@@ -989,6 +998,16 @@ public class SurefirePlugin
         this.redirectTestOutputToFile = redirectTestOutputToFile;
     }
 
+    public Boolean getFailIfNoSpecifiedTests()
+    {
+        return failIfNoSpecifiedTests;
+    }
+
+    public void setFailIfNoSpecifiedTests( Boolean failIfNoSpecifiedTests )
+    {
+        this.failIfNoSpecifiedTests = failIfNoSpecifiedTests;
+    }
+
     public Boolean getFailIfNoTests()
     {
         return failIfNoTests;

Added: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java?rev=1232091&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java
 (added)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java
 Mon Jan 16 18:15:51 2012
@@ -0,0 +1,67 @@
+package org.apache.maven.surefire;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.maven.surefire.util.ScannerFilter;
+import org.codehaus.plexus.util.SelectorUtils;
+
+public class SpecificTestClassFilter
+    implements ScannerFilter
+{
+
+    private static final char FS = System.getProperty( "file.separator" 
).charAt( 0 );
+
+    private static final String JAVA_CLASS_FILE_EXTENSION = ".class";
+
+    private Set names;
+
+    public SpecificTestClassFilter( String[] classNames )
+    {
+        if ( classNames != null && classNames.length > 0 )
+        {
+            this.names = new HashSet();
+            for ( int i = 0; i < classNames.length; i++ )
+            {
+                String name = classNames[i];
+                names.add( name );
+            }
+        }
+    }
+
+    public boolean accept( Class testClass )
+    {
+        // If the tests enumeration is empty, allow anything.
+        boolean result = true;
+
+        if ( names != null && !names.isEmpty() )
+        {
+            String className = testClass.getName().replace( '.', FS ) + 
JAVA_CLASS_FILE_EXTENSION;
+            System.out.println( "Checking classname: '" + className + "' 
against patterns:\n\n" + names + "\n\n" );
+
+            boolean found = false;
+            for ( Iterator it = names.iterator(); it.hasNext(); )
+            {
+                String pattern = (String) it.next();
+
+                // This is the same utility used under the covers in the 
plexus DirectoryScanner, and
+                // therefore in the surefire DefaultDirectoryScanner 
implementation.
+                if ( SelectorUtils.matchPath( pattern, className, true ) )
+                {
+                    found = true;
+                    break;
+                }
+            }
+
+            if ( !found )
+            {
+                result = false;
+            }
+        }
+
+        System.out.println( "Accepted? " + result );
+        return result;
+    }
+
+}

Propchange: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/SpecificTestClassFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java
 Mon Jan 16 18:15:51 2012
@@ -78,7 +78,8 @@ public class BaseProviderFactory
         }
         return new DefaultDirectoryScanner( 
directoryScannerParameters.getTestClassesDirectory(),
                                             
directoryScannerParameters.getIncludes(),
-                                            
directoryScannerParameters.getExcludes() );
+                                            
directoryScannerParameters.getExcludes(),
+                                            
directoryScannerParameters.getSpecificTests() );
     }
 
     private int getThreadCount()

Modified: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java
 Mon Jan 16 18:15:51 2012
@@ -168,12 +168,13 @@ public class SurefireReflector
             return null;
         }
         //Can't use the constructor with the RunOrder parameter. Using it 
causes some integration tests to fail.
-        Class[] arguments = { File.class, List.class, List.class, 
Boolean.class, String.class };
+        Class[] arguments = { File.class, List.class, List.class, List.class, 
Boolean.class, String.class };
         Constructor constructor = ReflectionUtils.getConstructor( 
this.directoryScannerParameters, arguments );
         return ReflectionUtils.newInstance( constructor,
                                             new Object[]{ 
directoryScannerParameters.getTestClassesDirectory(),
                                                 
directoryScannerParameters.getIncludes(),
                                                 
directoryScannerParameters.getExcludes(),
+                                                
directoryScannerParameters.getSpecificTests(),
                                                 
directoryScannerParameters.isFailIfNoTests(),
                                                 RunOrder.asString( 
directoryScannerParameters.getRunOrder() ) } );
     }

Modified: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/DirectoryScannerParameters.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/DirectoryScannerParameters.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/DirectoryScannerParameters.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/DirectoryScannerParameters.java
 Mon Jan 16 18:15:51 2012
@@ -34,27 +34,37 @@ public class DirectoryScannerParameters
 
     private final List excludes;
 
+    private final List specificTests;
+
     private final Boolean failIfNoTests;
 
     private final RunOrder[] runOrder;
 
-    private DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, Boolean failIfNoTests,
+    private DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, List specificTests,
+                                        Boolean failIfNoTests,
                                         RunOrder[] runOrder )
     {
         this.testClassesDirectory = testClassesDirectory;
         this.includes = includes;
         this.excludes = excludes;
+        this.specificTests = specificTests;
         this.failIfNoTests = failIfNoTests;
         this.runOrder = runOrder;
     }
 
-    public DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, Boolean failIfNoTests,
+    public DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, List specificTests,
+                                       Boolean failIfNoTests,
                                        String runOrder )
     {
-        this( testClassesDirectory, includes, excludes, failIfNoTests,
+        this( testClassesDirectory, includes, excludes, specificTests, 
failIfNoTests,
               runOrder == null ? RunOrder.DEFAULT : RunOrder.valueOfMulti( 
runOrder ) );
     }
 
+    public List getSpecificTests()
+    {
+        return specificTests;
+    }
+
     /**
      * Returns the directory of the compiled classes, normally 
${project.build.testOutputDirectory}
      *

Modified: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultDirectoryScanner.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultDirectoryScanner.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultDirectoryScanner.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultDirectoryScanner.java
 Mon Jan 16 18:15:51 2012
@@ -24,6 +24,8 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.maven.surefire.SpecificTestClassFilter;
+
 /**
  * Scans directories looking for tests.
  * 
@@ -48,13 +50,16 @@ public class DefaultDirectoryScanner
 
     private final List excludes;
 
+    private final List specificTests;
+
     private final List classesSkippedByValidation = new ArrayList();
 
-    public DefaultDirectoryScanner( File basedir, List includes, List excludes 
)
+    public DefaultDirectoryScanner( File basedir, List includes, List 
excludes, List specificTests )
     {
         this.basedir = basedir;
         this.includes = includes;
         this.excludes = excludes;
+        this.specificTests = specificTests;
     }
 
     public TestsToRun locateTestClasses( ClassLoader classLoader, 
ScannerFilter scannerFilter )
@@ -62,12 +67,23 @@ public class DefaultDirectoryScanner
         String[] testClassNames = collectTests();
         List result = new ArrayList();
 
+        System.out.println( "Got specific tests: " + specificTests );
+        String[] specific = specificTests == null ? new String[0] : 
processIncludesExcludes( specificTests );
+        SpecificTestClassFilter specificTestFilter = new 
SpecificTestClassFilter( specific );
+
         for ( int i = 0; i < testClassNames.length; i++ )
         {
             String className = testClassNames[i];
 
             Class testClass = loadClass( classLoader, className );
 
+            if ( !specificTestFilter.accept( testClass ) )
+            {
+                System.out.println( "Skip: " + testClass.getName() );
+                // FIXME: Log this somehow!
+                continue;
+            }
+
             if ( scannerFilter == null || scannerFilter.accept( testClass ) )
             {
                 result.add( testClass );
@@ -77,6 +93,8 @@ public class DefaultDirectoryScanner
                 classesSkippedByValidation.add( testClass );
             }
         }
+
+        System.out.println( "Running: " + result );
         return new TestsToRun( result );
     }
 

Added: 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java?rev=1232091&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java
 (added)
+++ 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java
 Mon Jan 16 18:15:51 2012
@@ -0,0 +1,41 @@
+package org.apache.maven.surefire;
+
+import junit.framework.TestCase;
+
+public class SpecificTestClassFilterTest
+    extends TestCase
+{
+
+    public void testMatchSingleCharacterWildcard()
+    {
+        SpecificTestClassFilter filter =
+            new SpecificTestClassFilter( new String[] { 
"org/apache/maven/surefire/?pecificTestClassFilter.class" } );
+
+        assertTrue( filter.accept( SpecificTestClassFilter.class ) );
+    }
+
+    public void testMatchSingleSegmentWordWildcard()
+    {
+        SpecificTestClassFilter filter =
+            new SpecificTestClassFilter( new String[] { 
"org/apache/maven/surefire/*TestClassFilter.class" } );
+
+        assertTrue( filter.accept( SpecificTestClassFilter.class ) );
+    }
+
+    public void testMatchMultiSegmentWildcard()
+    {
+        SpecificTestClassFilter filter =
+            new SpecificTestClassFilter( new String[] { 
"org/**/SpecificTestClassFilter.class" } );
+
+        assertTrue( filter.accept( SpecificTestClassFilter.class ) );
+    }
+
+    public void testMatchSingleSegmentWildcard()
+    {
+        SpecificTestClassFilter filter =
+            new SpecificTestClassFilter( new String[] { 
"org/*/maven/surefire/SpecificTestClassFilter.class" } );
+
+        assertTrue( filter.accept( SpecificTestClassFilter.class ) );
+    }
+
+}

Propchange: 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/SpecificTestClassFilterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/DefaultDirectoryScannerTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/DefaultDirectoryScannerTest.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/DefaultDirectoryScannerTest.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/DefaultDirectoryScannerTest.java
 Mon Jan 16 18:15:51 2012
@@ -43,7 +43,9 @@ public class DefaultDirectoryScannerTest
         include.add( "**/*ZT*A.java" );
         List exclude = new ArrayList();
 
-        DefaultDirectoryScanner surefireDirectoryScanner = new 
DefaultDirectoryScanner( baseDir, include, exclude );
+        DefaultDirectoryScanner surefireDirectoryScanner =
+            new DefaultDirectoryScanner( baseDir, include, exclude, new 
ArrayList() );
+
         String[] classNames = surefireDirectoryScanner.collectTests();
         assertNotNull( classNames );
         System.out.println("classNames " + Arrays.asList( classNames ));

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterConstants.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterConstants.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterConstants.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterConstants.java
 Mon Jan 16 18:15:51 2012
@@ -27,6 +27,7 @@ package org.apache.maven.surefire.booter
  */
 public interface BooterConstants
 {
+    String SPECIFIC_TEST_PROPERTY_PREFIX = "specificTest";
     String INCLUDES_PROPERTY_PREFIX = "includes";
     String EXCLUDES_PROPERTY_PREFIX = "excludes";
     String USESYSTEMCLASSLOADER = "useSystemClassLoader";

Modified: 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
 Mon Jan 16 18:15:51 2012
@@ -68,6 +68,8 @@ public class BooterDeserializer
 
         final List excludesList = properties.getStringList( 
EXCLUDES_PROPERTY_PREFIX );
         final List includesList = properties.getStringList( 
INCLUDES_PROPERTY_PREFIX );
+        final List specificTestsList = properties.getStringList( 
SPECIFIC_TEST_PROPERTY_PREFIX );
+        System.out.println( "DESER: Got specific tests: " + specificTestsList 
);
 
         final List testSuiteXmlFiles = properties.getStringList( 
TEST_SUITE_XML_FILES );
         final File testClassesDirectory = properties.getFileProperty( 
TEST_CLASSES_DIRECTORY );
@@ -75,7 +77,7 @@ public class BooterDeserializer
         final String runStatisticsFile = properties.getProperty( 
RUN_STATISTICS_FILE );
 
         DirectoryScannerParameters dirScannerParams =
-            new DirectoryScannerParameters( testClassesDirectory, 
includesList, excludesList,
+            new DirectoryScannerParameters( testClassesDirectory, 
includesList, excludesList, specificTestsList,
                                             
properties.getBooleanObjectProperty( FAILIFNOTESTS ), runOrder );
 
         RunOrderParameters runOrderParameters = new RunOrderParameters( 
runOrder, runStatisticsFile );

Modified: 
maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
 (original)
+++ 
maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java
 Mon Jan 16 18:15:51 2012
@@ -49,7 +49,8 @@ public class SurefireReflectorTest
         Object foo = getFoo();
 
         DirectoryScannerParameters directoryScannerParameters =
-            new DirectoryScannerParameters( new File( "ABC" ), new 
ArrayList(), new ArrayList(), Boolean.FALSE,
+            new DirectoryScannerParameters( new File( "ABC" ), new 
ArrayList(), new ArrayList(), new ArrayList(),
+                                            Boolean.FALSE,
                                             "hourly" );
         surefireReflector.setDirectoryScannerParameters( foo, 
directoryScannerParameters );
         assertTrue( isCalled( foo ).booleanValue() );

Modified: 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
 (original)
+++ 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGDirectoryTestSuite.java
 Mon Jan 16 18:15:51 2012
@@ -70,12 +70,13 @@ public class TestNGDirectoryTestSuite
 
     private final RunOrderCalculator runOrderCalculator;
 
-    public TestNGDirectoryTestSuite( File basedir, ArrayList includes, 
ArrayList excludes, String testSourceDirectory,
+    public TestNGDirectoryTestSuite( File basedir, ArrayList includes, 
ArrayList excludes, ArrayList specificTests,
+                                     String testSourceDirectory,
                                      String artifactVersion, Properties 
confOptions, File reportsDirectory,
                                      String testMethodPattern, 
RunOrderCalculator runOrderCalculator )
     {
 
-        this.surefireDirectoryScanner = new DefaultDirectoryScanner( basedir, 
includes, excludes );
+        this.surefireDirectoryScanner = new DefaultDirectoryScanner( basedir, 
includes, excludes, specificTests );
         this.runOrderCalculator = runOrderCalculator;
 
         this.options = confOptions;

Modified: 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java?rev=1232091&r1=1232090&r2=1232091&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java
 (original)
+++ 
maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java
 Mon Jan 16 18:15:51 2012
@@ -130,6 +130,7 @@ public class TestNGProvider
     {
         return new TestNGDirectoryTestSuite( basedir, new ArrayList( 
directoryScannerParameters.getIncludes() ),
                                              new ArrayList( 
directoryScannerParameters.getExcludes() ),
+                                             new ArrayList( 
directoryScannerParameters.getSpecificTests() ),
                                              
testRequest.getTestSourceDirectory().toString(),
                                              testArtifactInfo.getVersion(), 
providerProperties,
                                              
reporterConfiguration.getReportsDirectory(),


Reply via email to