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(),