Author: krosenvold
Date: Tue Dec 14 14:55:52 2010
New Revision: 1049118

URL: http://svn.apache.org/viewvc?rev=1049118&view=rev
Log:
[SUREFIRE-321] Added runOrder mojo attribute, including documentation.

Also added IT for the various runOrder settings.
Also fixed minor regression in selection of reporters

Added:
    
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java
   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml
   (with props)
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java
   (with props)
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java
   (with props)
    
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.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/suite/AbstractDirectoryTestSuite.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/SurefireDirectoryScannerTest.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

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -595,6 +595,20 @@ public class IntegrationTestMojo
     private Boolean parallelMavenExecution;
 
     /**
+      * Defines the order the tests will be run in. Supported values are 
alphabetical, reversealphabetical
+      * random, hourly (alphabetical on even hours, reverse alphabetical on 
odd hours).
+      *
+      * Not supplying a value for this setting will run tests in filesystem 
order.
+      *
+      * Odd/Even is determined at the time the of scanning the classpath, 
meaning it could change during
+      * a multi-module build.
+      *
+      * @parameter
+      * @since 2.7
+      */
+     private String runOrder;
+
+    /**
      * @component
      */
     private ToolchainManager toolchainManager;
@@ -1332,5 +1346,13 @@ public class IntegrationTestMojo
         return parallelMavenExecution != null && 
parallelMavenExecution.booleanValue();
     }
 
+    public String getRunOrder()
+    {
+        return runOrder;
+    }
 
+    public void setRunOrder( String runOrder )
+    {
+        this.runOrder = runOrder;
+    }
 }

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -292,7 +292,8 @@ public abstract class AbstractSurefireMo
             List includes = getIncludeList();
             List excludes = getExcludeList();
             directoryScannerParameters = new DirectoryScannerParameters( 
getTestClassesDirectory(), includes, excludes,
-                                                                         
Boolean.valueOf( failIfNoTests ) );
+                                                                         
Boolean.valueOf( failIfNoTests ),
+                                                                         
getRunOrder() );
         }
 
         Properties providerProperties = getProperties();
@@ -855,9 +856,12 @@ public abstract class AbstractSurefireMo
      */
     private String getConsoleReporter( boolean forking )
     {
-        if ( isUseFile() && isPrintSummary() )
+        if ( isUseFile() )
         {
-            return forking ? ForkingConsoleReporter.class.getName() : 
ConsoleReporter.class.getName();
+            if ( isPrintSummary() )
+            {
+                return forking ? ForkingConsoleReporter.class.getName() : 
ConsoleReporter.class.getName();
+            }
         }
         else if ( BRIEF_REPORT_FORMAT.equals( getReportFormat() ) )
         {

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -269,4 +269,8 @@ public interface SurefireExecutionParame
 
     boolean isMavenParallel();
 
+    void setRunOrder(String runOrder);
+
+    String getRunOrder();
+
 }

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -102,6 +102,8 @@ public class BooterSerializer
             properties.addList( directoryScannerParameters.getExcludes(), 
BooterConstants.EXCLUDES_PROPERTY_PREFIX );
             properties.setProperty( BooterConstants.TEST_CLASSES_DIRECTORY,
                                     
directoryScannerParameters.getTestClassesDirectory() );
+            properties.setProperty( BooterConstants.RUN_ORDER,
+                                    directoryScannerParameters.getRunOrder() );
         }
 
         ReporterConfiguration reporterConfiguration = 
booterConfiguration.getReporterConfiguration();

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -172,7 +172,7 @@ public class BooterDeserializerProviderC
         excludes.add( "xx1" );
         excludes.add( "xx2" );
 
-        return new DirectoryScannerParameters( aDir, includes, excludes, 
Boolean.TRUE );
+        return new DirectoryScannerParameters( aDir, includes, excludes, 
Boolean.TRUE, null );
     }
 
     private ProviderConfiguration saveAndReload( ProviderConfiguration 
booterConfiguration,

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -129,7 +129,7 @@ public class BooterDeserializerStartupCo
 
         File cwd = new File( "." );
         DirectoryScannerParameters directoryScannerParameters =
-            new DirectoryScannerParameters( cwd, new ArrayList(), new 
ArrayList(), Boolean.TRUE );
+            new DirectoryScannerParameters( cwd, new ArrayList(), new 
ArrayList(), Boolean.TRUE, "hourly" );
         ReporterConfiguration reporterConfiguration = new 
ReporterConfiguration( new ArrayList(), cwd, Boolean.TRUE );
         TestRequest testSuiteDefinition =
             new TestRequest( Arrays.asList( getSuiteXmlFileStrings()), 
getTestSourceDirectory(), aUserRequestedTest );

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -445,7 +445,6 @@ public class SurefirePlugin
      * (JUnit 4.7 provider) Supports values classes/methods/both to run in 
separate threads, as controlled by threadCount.
      *
      * @parameter expression="${parallel}"
-     * @todo test how this works with forking, and console/file output 
parallelism
      * @since 2.2
      */
     private String parallel;
@@ -559,6 +558,20 @@ public class SurefirePlugin
     private Boolean parallelMavenExecution;
 
     /**
+     * Defines the order the tests will be run in. Supported values are 
alphabetical, reversealphabetical
+     * random, hourly (alphabetical on even hours, reverse alphabetical on odd 
hours).
+     *
+     * Not supplying a value for this setting will run tests in filesystem 
order.
+     *
+     * Odd/Even is determined at the time the of scanning the classpath, 
meaning it could change during
+     * a multi-module build.
+     *
+     * @parameter
+     * @since 2.7
+     */
+    private String runOrder;
+
+    /**
      * @component
      */
     private ToolchainManager toolchainManager;
@@ -1236,5 +1249,13 @@ public class SurefirePlugin
         return parallelMavenExecution != null && 
parallelMavenExecution.booleanValue();
     }
 
+    public String getRunOrder()
+    {
+        return runOrder;
+    }
 
+    public void setRunOrder( String runOrder )
+    {
+        this.runOrder = runOrder;
+    }
 }

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -61,7 +61,8 @@ public class BaseProviderFactory
         }
         return new DefaultDirectoryScanner( 
directoryScannerParameters.getTestClassesDirectory(),
                                             
directoryScannerParameters.getIncludes(),
-                                            
directoryScannerParameters.getExcludes() );
+                                            
directoryScannerParameters.getExcludes(),
+                                            
directoryScannerParameters.getRunOrder());
     }
 
     public ReporterFactory getReporterFactory()

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -156,13 +156,14 @@ public class SurefireReflector
         {
             return null;
         }
-        Class[] arguments = { File.class, List.class, List.class, 
Boolean.class };
+        Class[] arguments = { File.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.isFailIfNoTests() } );
+                                                
directoryScannerParameters.isFailIfNoTests(),
+                                                
directoryScannerParameters.getRunOrder() } );
     }
 
     Object createTestArtifactInfo( TestArtifactInfo testArtifactInfo )

Modified: 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/suite/AbstractDirectoryTestSuite.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/suite/AbstractDirectoryTestSuite.java?rev=1049118&r1=1049117&r2=1049118&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/suite/AbstractDirectoryTestSuite.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/suite/AbstractDirectoryTestSuite.java
 Tue Dec 14 14:55:52 2010
@@ -63,7 +63,8 @@ public abstract class AbstractDirectoryT
 
     protected AbstractDirectoryTestSuite( File basedir, List includes, List 
excludes )
     {
-        this.surefireDirectoryScanner = new DefaultDirectoryScanner( basedir, 
includes, excludes );
+        this.surefireDirectoryScanner = new DefaultDirectoryScanner( basedir, 
includes, excludes,
+                                                                     
"filesystem" );
     }
 
     public Map locateTestSets( ClassLoader classLoader )

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -35,13 +35,15 @@ public class DirectoryScannerParameters
 
     private final Boolean failIfNoTests;
 
+    private final String runOrder;
 
-    public DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, Boolean failIfNoTests )
+    public DirectoryScannerParameters( File testClassesDirectory, List 
includes, List excludes, Boolean failIfNoTests, String runOrder )
     {
         this.testClassesDirectory = testClassesDirectory;
         this.includes = includes;
         this.excludes = excludes;
         this.failIfNoTests = failIfNoTests;
+        this.runOrder = runOrder;
     }
 
     /**
@@ -79,4 +81,9 @@ public class DirectoryScannerParameters
     {
         return failIfNoTests;
     }
+
+    public String getRunOrder()
+    {
+        return runOrder;
+    }
 }

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -21,6 +21,9 @@ package org.apache.maven.surefire.util;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -49,12 +52,18 @@ public class DefaultDirectoryScanner
 
     private final List classesSkippedByValidation = new ArrayList();
 
+    private final Comparator sortOrder;
 
-    public DefaultDirectoryScanner( File basedir, List includes, List excludes 
)
+    private final String runOrder;
+
+
+    public DefaultDirectoryScanner( File basedir, List includes, List 
excludes, String runOrder )
     {
         this.basedir = basedir;
         this.includes = includes;
         this.excludes = excludes;
+        this.runOrder = runOrder;
+        this.sortOrder = getSortOrderComparator( runOrder );
     }
 
     public TestsToRun locateTestClasses( ClassLoader classLoader, 
ScannerFilter scannerFilter )
@@ -77,6 +86,14 @@ public class DefaultDirectoryScanner
                 classesSkippedByValidation.add( testClass );
             }
         }
+        if ( "random".equals( runOrder ) )
+        {
+            Collections.shuffle( result );
+        }
+        else if ( sortOrder != null )
+        {
+            Collections.sort( result, sortOrder );
+        }
         return new TestsToRun( result );
     }
 
@@ -161,4 +178,48 @@ public class DefaultDirectoryScanner
     {
         return classesSkippedByValidation;
     }
+
+    private Comparator getSortOrderComparator( String runOrder )
+    {
+        if ( "alphabetical".equals( runOrder ) )
+        {
+            return getAlphabeticalComparator();
+        }
+
+        else if ( "reversealphabetical".equals( runOrder ) )
+        {
+            return getReverseAlphabeticalComparator();
+        }
+        else if ( "hourly".equals( runOrder ) )
+        {
+            final int hour = Calendar.getInstance().get( Calendar.HOUR_OF_DAY 
);
+            return ( ( hour % 2 ) == 0 )
+                ? getAlphabeticalComparator()
+                : getReverseAlphabeticalComparator();
+        }
+        return null;
+    }
+
+    private Comparator getReverseAlphabeticalComparator()
+    {
+        return new Comparator()
+        {
+            public int compare( Object o1, Object o2 )
+            {
+                return ( (Class) o2 ).getName().compareTo( ( (Class) o1 
).getName() );
+            }
+        };
+    }
+
+    private Comparator getAlphabeticalComparator()
+    {
+        return new Comparator()
+        {
+            public int compare( Object o1, Object o2 )
+            {
+                return ( (Class) o1 ).getName().compareTo( ( (Class) o2 
).getName() );
+            }
+        };
+    }
+
 }

Modified: 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/SurefireDirectoryScannerTest.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/SurefireDirectoryScannerTest.java?rev=1049118&r1=1049117&r2=1049118&view=diff
==============================================================================
--- 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/SurefireDirectoryScannerTest.java
 (original)
+++ 
maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/SurefireDirectoryScannerTest.java
 Tue Dec 14 14:55:52 2010
@@ -20,13 +20,12 @@ package org.apache.maven.surefire.util;
  */
 
 import junit.framework.TestCase;
+import org.apache.maven.surefire.testset.TestSetFailedException;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.List;
 import java.util.ArrayList;
-
-import org.apache.maven.surefire.testset.TestSetFailedException;
+import java.util.List;
 
 /**
  * Test of the directory scanner.
@@ -42,7 +41,8 @@ public class SurefireDirectoryScannerTes
         include.add( "**/*ZT*A.java" );
         List exclude = new ArrayList();
 
-        DefaultDirectoryScanner surefireDirectoryScanner = new 
DefaultDirectoryScanner( baseDir, include, exclude );
+        DefaultDirectoryScanner surefireDirectoryScanner = new 
DefaultDirectoryScanner( baseDir, include, exclude,
+                                                                               
         "filesystem" );
         String[] classNames = surefireDirectoryScanner.collectTests();
         assertNotNull( classNames );
         assertEquals( 4, classNames.length );

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -47,6 +47,7 @@ public interface BooterConstants
     String REQUESTEDTEST = "requestedTest";
     String SOURCE_DIRECTORY = "testSuiteDefinitionTestSourceDirectory";
     String TEST_CLASSES_DIRECTORY = "testClassesDirectory";
+    String RUN_ORDER = "runOrder";
     String TEST_SUITE_XML_FILES = "testSuiteXmlFiles";
     String PROVIDER_CONFIGURATION = "providerConfiguration";
     String FORKTESTSET = "forkTestSet";

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -72,12 +72,13 @@ public class BooterDeserializer
         final List excludesList = properties.getStringList( 
EXCLUDES_PROPERTY_PREFIX );
         final List includesList = properties.getStringList( 
INCLUDES_PROPERTY_PREFIX );
 
-        List testSuiteXmlFiles = properties.getStringList( 
TEST_SUITE_XML_FILES );
+        final List testSuiteXmlFiles = properties.getStringList( 
TEST_SUITE_XML_FILES );
         final File testClassesDirectory = properties.getFileProperty( 
TEST_CLASSES_DIRECTORY );
+        final String runOrder = properties.getProperty( RUN_ORDER );
 
         DirectoryScannerParameters dirScannerParams =
             new DirectoryScannerParameters( testClassesDirectory, 
includesList, excludesList,
-                                            valueOf( 
properties.getBooleanProperty( FAILIFNOTESTS ) ) );
+                                            valueOf( 
properties.getBooleanProperty( FAILIFNOTESTS ) ) , runOrder);
 
         TestArtifactInfo testNg = new TestArtifactInfo( testNgVersion, 
testArtifactClassifier );
         TestRequest testSuiteDefinition = new TestRequest( testSuiteXmlFiles, 
sourceDirectory, requestedTest );

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=1049118&r1=1049117&r2=1049118&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
 Tue Dec 14 14:55:52 2010
@@ -45,7 +45,7 @@ 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(), Boolean.FALSE, "hourly" );
         surefireReflector.setDirectoryScannerParameters( foo, 
directoryScannerParameters );
         assertTrue( isCalled( foo ).booleanValue());
 

Added: 
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java?rev=1049118&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java
 (added)
+++ 
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java
 Tue Dec 14 14:55:52 2010
@@ -0,0 +1,131 @@
+package org.apache.maven.surefire.its;
+/*
+ * 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.it.VerificationException;
+import org.apache.maven.it.Verifier;
+import org.apache.maven.it.util.ResourceExtractor;
+import org.apache.maven.reporting.MavenReportException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Verifies the runOrder setting and its effect
+ *
+ * @author Kristian Rosenvold
+ */
+public class RunOrderIT
+    extends AbstractSurefireIntegrationTestClass
+{
+    // testing random is left as an exercise to the reader. Patches welcome
+
+    public void testAlphabetical()
+        throws Exception
+    {
+        checkOrder( "alphabetical", getAlphabetical() );
+    }
+
+
+    public void testReverseAlphabetical()
+        throws Exception
+    {
+        checkOrder( "reversealphabetical", getReverseAlphabetical() );
+    }
+
+
+    public void testHourly()
+        throws Exception
+    {
+        int startHour = Calendar.getInstance().get( Calendar.HOUR_OF_DAY );
+        final List actual = executeWithRunOrder( "hourly" );
+        int endHour = Calendar.getInstance().get( Calendar.HOUR_OF_DAY );
+        if ( startHour != endHour )
+        {
+            return; // Race condition, cannot test when hour changed mid-run
+        }
+
+        List expected = ( ( startHour % 2 ) == 0 ) ? getAlphabetical() : 
getReverseAlphabetical();
+        if ( !contains( actual, expected ) )
+        {
+            throw new VerificationException( "Response does not contain 
expected item" );
+        }
+    }
+
+    private boolean contains( List items, List expected )
+    {
+        Iterator expectedIterator = expected.iterator();
+        String next = (String) expectedIterator.next();
+        Iterator content = items.iterator();
+        while ( content.hasNext() )
+        {
+            String line = (String) content.next();
+            if ( line.startsWith( next ) )
+            {
+                if ( !expectedIterator.hasNext() )
+                {
+                    return true;
+                }
+                next = (String) expectedIterator.next();
+            }
+        }
+        return content.hasNext();
+    }
+
+    private void checkOrder( String alphabetical, List expected )
+        throws VerificationException, MavenReportException, IOException
+    {
+        final List list = executeWithRunOrder( alphabetical );
+        if ( !contains( list, expected ) )
+        {
+            throw new VerificationException( "Response does not contain 
expected item" );
+        }
+    }
+
+    private List executeWithRunOrder( String runOrder )
+        throws IOException, VerificationException, MavenReportException
+    {
+        File testDir = ResourceExtractor.simpleExtractResources( getClass(), 
"/runOrder" );
+        Verifier verifier = new Verifier( testDir.getAbsolutePath() );
+
+        List goals = getInitialGoals();
+        goals.add( "-DrunOrder=" + runOrder );
+        goals.add( "test" );
+        this.executeGoals( verifier, goals );
+        verifier.verifyErrorFreeLog();
+        verifier.resetStreams();
+        HelperAssertions.assertTestSuiteResults( 3, 0, 0, 0, testDir );
+        return verifier.loadFile( verifier.getBasedir(), 
verifier.getLogFileName(), false );
+    }
+
+    private List getAlphabetical()
+    {
+        return Arrays.asList( new String[]{ "TA", "TB", "TC" } );
+    }
+
+    private List getReverseAlphabetical()
+    {
+        return Arrays.asList( new String[]{ "TC", "TB", "TA" } );
+    }
+
+}

Propchange: 
maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/RunOrderIT.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml?rev=1049118&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml
 (added)
+++ 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml
 Tue Dec 14 14:55:52 2010
@@ -0,0 +1,62 @@
+<?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
+  ~ 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.
+  -->
+
+<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>
+
+  <groupId>org.apache.maven.plugins.surefire</groupId>
+  <artifactId>runOrder</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>Test for runOrder</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>${surefire.version}</version>
+        <configuration>
+          <forkMode>once</forkMode>
+          <printSummary>false</printSummary>
+          <runOrder>${runOrder}</runOrder>
+        </configuration>
+        <dependencies>
+          <!-- dependency>
+              <groupId>org.apache.maven.surefire</groupId>
+              <artifactId>${testProvider}</artifactId>
+              <version>${surefire.version}</version>
+          </dependency -->
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

Propchange: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java?rev=1049118&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java
 (added)
+++ 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java
 Tue Dec 14 14:55:52 2010
@@ -0,0 +1,11 @@
+package junit.runOrder;
+import junit.framework.TestCase;
+
+
+public class TestA
+    extends TestCase
+{
+    public void testTwo() {
+        System.out.println("TA");
+    }
+}

Propchange: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestA.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java?rev=1049118&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java
 (added)
+++ 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java
 Tue Dec 14 14:55:52 2010
@@ -0,0 +1,11 @@
+package junit.runOrder;
+import junit.framework.TestCase;
+
+
+public class TestB
+    extends TestCase
+{
+    public void testTwo() {
+        System.out.println("TB");
+    }
+}

Propchange: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestB.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.java
URL: 
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.java?rev=1049118&view=auto
==============================================================================
--- 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.java
 (added)
+++ 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.java
 Tue Dec 14 14:55:52 2010
@@ -0,0 +1,11 @@
+package junit.runOrder;
+import junit.framework.TestCase;
+
+
+public class TestC
+    extends TestCase
+{
+    public void testTwo() {
+        System.out.println("TC");
+    }
+}

Propchange: 
maven/surefire/trunk/surefire-integration-tests/src/test/resources/runOrder/src/test/java/junit/runOrder/TestC.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to