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

svn commit: r1205186 [2/2] - in /maven/surefire/trunk: ./ maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/ maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ maven-surefire-common/src/main/java/org/apache/maven/p...

Propchange: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/ThreadedExecutionScheduler.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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -26,6 +26,7 @@ import org.apache.maven.surefire.report.
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.util.DefaultDirectoryScanner;
@@ -38,7 +39,7 @@ import org.apache.maven.surefire.util.Ru
  */
 public class BaseProviderFactory
     implements DirectoryScannerParametersAware, ReporterConfigurationAware, SurefireClassLoadersAware, TestRequestAware,
-    ProviderPropertiesAware, ProviderParameters, TestArtifactInfoAware
+    ProviderPropertiesAware, ProviderParameters, TestArtifactInfoAware, RunOrderParametersAware
 {
 
     private Properties providerProperties;
@@ -47,6 +48,8 @@ public class BaseProviderFactory
 
     private ReporterConfiguration reporterConfiguration;
 
+    private RunOrderParameters runOrderParameters;
+
     private ClassLoader testClassLoader;
 
     private TestRequest testRequest;
@@ -60,6 +63,7 @@ public class BaseProviderFactory
 
     private final boolean insideFork;
 
+
     public BaseProviderFactory( ReporterFactory reporterFactory, Boolean insideFork )
     {
         this.reporterFactory = reporterFactory;
@@ -77,13 +81,19 @@ public class BaseProviderFactory
                                             directoryScannerParameters.getExcludes() );
     }
 
+    private int getThreadCount()
+    {
+        final String threadcount = (String) providerProperties.get( "threadcount" );
+        return threadcount == null ? 1 : Integer.parseInt( threadcount );
+    }
+
     public RunOrderCalculator getRunOrderCalculator()
     {
         if ( directoryScannerParameters == null )
         {
             return null;
         }
-        return new DefaultRunOrderCalculator( directoryScannerParameters.getRunOrder() );
+        return new DefaultRunOrderCalculator( runOrderParameters, getThreadCount() );
     }
 
     public ReporterFactory getReporterFactory()
@@ -161,4 +171,9 @@ public class BaseProviderFactory
         this.testArtifactInfo = testArtifactInfo;
     }
 
+    public void setRunOrderParameters( RunOrderParameters runOrderParameters )
+    {
+        this.runOrderParameters = runOrderParameters;
+    }
+
 }

Copied: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/RunOrderParametersAware.java (from r1204953, maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/RunOrderParametersAware.java?p2=maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/RunOrderParametersAware.java&p1=maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java&r1=1204953&r2=1205186&rev=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/RunOrderParametersAware.java Tue Nov 22 21:43:19 2011
@@ -1,4 +1,4 @@
-package org.apache.maven.plugin.surefire.booterclient;
+package org.apache.maven.surefire.booter;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,30 +19,13 @@ package org.apache.maven.plugin.surefire
  * under the License.
  */
 
-import org.apache.maven.plugin.surefire.report.FileReporterFactory;
-import org.apache.maven.surefire.booter.StartupReportConfiguration;
-import org.apache.maven.surefire.report.DefaultConsoleReporter;
-import org.apache.maven.surefire.report.ConsoleLogger;
-import org.apache.maven.surefire.report.RunListener;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 
 /**
  * @author Kristian Rosenvold
+ * @noinspection UnusedDeclaration
  */
-public class TestSetMockReporterFactory
-    extends FileReporterFactory
+interface RunOrderParametersAware
 {
-    public TestSetMockReporterFactory()
-    {
-        super( StartupReportConfiguration.defaultValue() );
-    }
-
-    public ConsoleLogger createConsoleLogger()
-    {
-        return new DefaultConsoleReporter( System.out );
-    }
-
-    public RunListener createReporter()
-    {
-        return new MockReporter();
-    }
+    void setRunOrderParameters( RunOrderParameters runOrderParameters );
 }

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

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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -32,10 +32,12 @@ import org.apache.maven.surefire.report.
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.suite.RunResult;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.util.NestedRuntimeException;
 import org.apache.maven.surefire.util.ReflectionUtils;
+import org.apache.maven.surefire.util.RunOrder;
 import org.apache.maven.surefire.util.SurefireReflectionException;
 
 /**
@@ -59,6 +61,8 @@ public class SurefireReflector
 
     private final Class directoryScannerParameters;
 
+    private final Class runOrderParameters;
+
     private final Class directoryScannerParametersAware;
 
     private final Class testSuiteDefinitionAware;
@@ -88,6 +92,7 @@ public class SurefireReflector
             testArtifactInfo = surefireClassLoader.loadClass( TestArtifactInfo.class.getName() );
             testArtifactInfoAware = surefireClassLoader.loadClass( TestArtifactInfoAware.class.getName() );
             directoryScannerParameters = surefireClassLoader.loadClass( DirectoryScannerParameters.class.getName() );
+            runOrderParameters = surefireClassLoader.loadClass( RunOrderParameters.class.getName() );
             directoryScannerParametersAware =
                 surefireClassLoader.loadClass( DirectoryScannerParametersAware.class.getName() );
             testSuiteDefinitionAware = surefireClassLoader.loadClass( TestRequestAware.class.getName() );
@@ -176,7 +181,25 @@ public class SurefireReflector
                                                 directoryScannerParameters.getIncludes(),
                                                 directoryScannerParameters.getExcludes(),
                                                 directoryScannerParameters.isFailIfNoTests(),
-                                                directoryScannerParameters.getRunOrder().name() } );
+                                                RunOrder.asString( directoryScannerParameters.getRunOrder() ) } );
+    }
+
+
+    Object createRunOrderParameters( RunOrderParameters runOrderParameters )
+    {
+        if ( runOrderParameters == null )
+        {
+            return null;
+        }
+        //Can't use the constructor with the RunOrder parameter. Using it causes some integration tests to fail.
+        Class[] arguments = { String.class, String.class };
+        Constructor constructor = ReflectionUtils.getConstructor( this.runOrderParameters, arguments );
+        final File runStatisticsFile = runOrderParameters.getRunStatisticsFile();
+        return ReflectionUtils.newInstance( constructor,
+                                            new Object[]{ RunOrder.asString( runOrderParameters.getRunOrder() ),
+                                                runStatisticsFile != null
+                                                    ? runStatisticsFile.getAbsolutePath()
+                                                    : null } );
     }
 
     Object createTestArtifactInfo( TestArtifactInfo testArtifactInfo )
@@ -236,6 +259,12 @@ public class SurefireReflector
         ReflectionUtils.invokeSetter( o, "setDirectoryScannerParameters", this.directoryScannerParameters, param );
     }
 
+    public void setRunOrderParameters( Object o, RunOrderParameters runOrderParameters )
+    {
+        final Object param = createRunOrderParameters( runOrderParameters );
+        ReflectionUtils.invokeSetter( o, "setRunOrderParameters", this.runOrderParameters, param );
+    }
+
 
     public void setTestSuiteDefinitionAware( Object o, TestRequest testSuiteDefinition2 )
     {

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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -21,7 +21,6 @@ package org.apache.maven.surefire.testse
 
 import java.io.File;
 import java.util.List;
-
 import org.apache.maven.surefire.util.RunOrder;
 
 /**
@@ -37,10 +36,10 @@ public class DirectoryScannerParameters
 
     private final Boolean failIfNoTests;
 
-    private final RunOrder runOrder;
+    private final RunOrder[] runOrder;
 
-    public DirectoryScannerParameters( File testClassesDirectory, List includes, List excludes, Boolean failIfNoTests,
-                                       RunOrder runOrder )
+    private DirectoryScannerParameters( File testClassesDirectory, List includes, List excludes, Boolean failIfNoTests,
+                                        RunOrder[] runOrder )
     {
         this.testClassesDirectory = testClassesDirectory;
         this.includes = includes;
@@ -52,12 +51,13 @@ public class DirectoryScannerParameters
     public DirectoryScannerParameters( File testClassesDirectory, List includes, List excludes, Boolean failIfNoTests,
                                        String runOrder )
     {
-        this( testClassesDirectory, includes, excludes, failIfNoTests, runOrder == null ? RunOrder.FILESYSTEM : RunOrder.valueOf( runOrder ) );
+        this( testClassesDirectory, includes, excludes, failIfNoTests,
+              runOrder == null ? RunOrder.DEFAULT : RunOrder.valueOfMulti( runOrder ) );
     }
 
     /**
      * Returns the directory of the compiled classes, normally ${project.build.testOutputDirectory}
-     * 
+     *
      * @return A directory that can be scanned for .class files
      */
     public File getTestClassesDirectory()
@@ -67,7 +67,7 @@ public class DirectoryScannerParameters
 
     /**
      * The includes pattern list, as specified on the plugin includes parameter.
-     * 
+     *
      * @return A list of patterns. May contain both source file designators and .class extensions.
      */
     public List getIncludes()
@@ -77,7 +77,7 @@ public class DirectoryScannerParameters
 
     /**
      * The excludes pattern list, as specified on the plugin includes parameter.
-     * 
+     *
      * @return A list of patterns. May contain both source file designators and .class extensions.
      */
     public List getExcludes()
@@ -87,7 +87,7 @@ public class DirectoryScannerParameters
 
     /**
      * Indicates if lack of runable tests should fail the entire build
-     * 
+     *
      * @return true if no tests should fail the build
      */
     public Boolean isFailIfNoTests()
@@ -95,7 +95,7 @@ public class DirectoryScannerParameters
         return failIfNoTests;
     }
 
-    public RunOrder getRunOrder()
+    public RunOrder[] getRunOrder()
     {
         return runOrder;
     }

Added: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/RunOrderParameters.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/RunOrderParameters.java?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/RunOrderParameters.java (added)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/testset/RunOrderParameters.java Tue Nov 22 21:43:19 2011
@@ -0,0 +1,71 @@
+package org.apache.maven.surefire.testset;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import org.apache.maven.surefire.util.RunOrder;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class RunOrderParameters
+{
+    private final RunOrder[] runOrder;
+
+    private File runStatisticsFile;
+
+    public RunOrderParameters( RunOrder[] runOrder, File runStatisticsFile )
+    {
+        this.runOrder = runOrder;
+        this.runStatisticsFile = runStatisticsFile;
+    }
+
+    public RunOrderParameters( String runOrder, String runStatisticsFile )
+    {
+        this.runOrder = runOrder == null ? RunOrder.DEFAULT : RunOrder.valueOfMulti( runOrder );
+        this.runStatisticsFile = runStatisticsFile != null ? new File( runStatisticsFile ) : null;
+    }
+
+    public static RunOrderParameters DEFAULT()
+    {
+        return new RunOrderParameters( RunOrder.DEFAULT, null );
+    }
+
+    public static RunOrderParameters ALPHABETICAL()
+    {
+        return new RunOrderParameters( new RunOrder[]{ RunOrder.ALPHABETICAL }, null );
+    }
+
+    public RunOrder[] getRunOrder()
+    {
+        return runOrder;
+    }
+
+    public File getRunStatisticsFile()
+    {
+        return runStatisticsFile;
+    }
+
+    public String getRunStatisticsFileName()
+    {
+        return runStatisticsFile != null ? runStatisticsFile.getAbsolutePath() : null;
+    }
+
+}

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

Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultRunOrderCalculator.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultRunOrderCalculator.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultRunOrderCalculator.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/DefaultRunOrderCalculator.java Tue Nov 22 21:43:19 2011
@@ -25,10 +25,12 @@ import java.util.Calendar;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import org.apache.maven.plugin.surefire.runorder.RunEntryStatisticsMap;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 
 /**
- * Applies the final unorder of the tests
- * 
+ * Applies the final runorder of the tests
+ *
  * @author Kristian Rosenvold
  */
 public class DefaultRunOrderCalculator
@@ -36,34 +38,59 @@ public class DefaultRunOrderCalculator
 {
     private final Comparator sortOrder;
 
-    private final RunOrder runOrder;
+    private final RunOrder[] runOrder;
 
-    public DefaultRunOrderCalculator( RunOrder runOrder )
+    private final RunOrderParameters runOrderParameters;
+
+    private final int threadCount;
+
+    public DefaultRunOrderCalculator( RunOrderParameters runOrderParameters, int threadCount )
     {
-        this.runOrder = runOrder;
-        this.sortOrder = getSortOrderComparator();
+        this.runOrderParameters = runOrderParameters;
+        this.threadCount = threadCount;
+        this.runOrder = runOrderParameters.getRunOrder();
+        this.sortOrder = this.runOrder.length > 0 ? getSortOrderComparator( this.runOrder[0] ) : null;
     }
 
-  public TestsToRun orderTestClasses( TestsToRun scannedClasses ){
-    List result = new ArrayList(Arrays.asList(scannedClasses.getLocatedClasses()));
-    orderTestClasses(result);
-    return new TestsToRun( result );
+    public TestsToRun orderTestClasses( TestsToRun scannedClasses )
+    {
+        List result = new ArrayList( Arrays.asList( scannedClasses.getLocatedClasses() ) );
 
-  }
+        orderTestClasses( result, runOrder.length != 0 ? runOrder[0] : null );
+        return new TestsToRun( result );
+    }
 
-  private void orderTestClasses( List testClasses )
+    private void orderTestClasses( List testClasses, RunOrder runOrder )
     {
         if ( RunOrder.RANDOM.equals( runOrder ) )
         {
             Collections.shuffle( testClasses );
         }
+        else if ( RunOrder.FAILEDFIRST.equals( runOrder ) )
+        {
+            RunEntryStatisticsMap runEntryStatisticsMap =
+                RunEntryStatisticsMap.fromFile( runOrderParameters.getRunStatisticsFile() );
+            final List prioritized = runEntryStatisticsMap.getPrioritizedTestsByFailureFirst( testClasses );
+            testClasses.clear();
+            testClasses.addAll( prioritized );
+
+        }
+        else if ( RunOrder.BALANCED.equals( runOrder ) )
+        {
+            RunEntryStatisticsMap runEntryStatisticsMap =
+                RunEntryStatisticsMap.fromFile( runOrderParameters.getRunStatisticsFile() );
+            final List prioritized = runEntryStatisticsMap.getPrioritizedTestsClassRunTime( testClasses, threadCount );
+            testClasses.clear();
+            testClasses.addAll( prioritized );
+
+        }
         else if ( sortOrder != null )
         {
             Collections.sort( testClasses, sortOrder );
         }
     }
 
-    private Comparator getSortOrderComparator()
+    private Comparator getSortOrderComparator( RunOrder runOrder )
     {
         if ( RunOrder.ALPHABETICAL.equals( runOrder ) )
         {

Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/RunOrder.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/RunOrder.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/RunOrder.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/RunOrder.java Tue Nov 22 21:43:19 2011
@@ -19,9 +19,13 @@ package org.apache.maven.surefire.util;
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
 /**
  * A RunOrder specifies the order in which the tests will be run.
- * 
+ *
  * @author Stefan Birkner
  */
 public class RunOrder
@@ -36,6 +40,32 @@ public class RunOrder
 
     public static final RunOrder REVERSE_ALPHABETICAL = new RunOrder( "reversealphabetical" );
 
+    public static final RunOrder BALANCED = new RunOrder( "balanced" );
+
+    public static final RunOrder FAILEDFIRST = new RunOrder( "failedfirst" );
+
+    public static final RunOrder[] DEFAULT = new RunOrder[]{ FILESYSTEM };
+
+    /**
+     * Returns the specified RunOrder
+     *
+     * @param values The runorder string value
+     * @return An array of RunOrder objects, never null
+     */
+    public static RunOrder[] valueOfMulti( String values )
+    {
+        List result = new ArrayList();
+        if ( values != null )
+        {
+            StringTokenizer stringTokenizer = new StringTokenizer( values, "," );
+            while ( stringTokenizer.hasMoreTokens() )
+            {
+                result.add( valueOf( stringTokenizer.nextToken() ) );
+            }
+        }
+        return (RunOrder[]) result.toArray( new RunOrder[result.size()] );
+    }
+
     public static RunOrder valueOf( String name )
     {
         if ( name == null )
@@ -79,7 +109,22 @@ public class RunOrder
 
     private static RunOrder[] values()
     {
-        return new RunOrder[] { ALPHABETICAL, FILESYSTEM, HOURLY, RANDOM, REVERSE_ALPHABETICAL };
+        return new RunOrder[]{ ALPHABETICAL, FILESYSTEM, HOURLY, RANDOM, REVERSE_ALPHABETICAL, BALANCED, FAILEDFIRST };
+    }
+
+    public static String asString( RunOrder[] runOrder )
+    {
+        StringBuffer stringBuffer = new StringBuffer();
+        for ( int i = 0; i < runOrder.length; i++ )
+        {
+            stringBuffer.append( runOrder[i].name );
+            if ( i < ( runOrder.length - 1 ) )
+            {
+                stringBuffer.append( "," );
+            }
+        }
+        return stringBuffer.toString();
+
     }
 
     private final String name;

Added: maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/plugin/surefire/runorder/ThreadedExecutionSchedulerTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/plugin/surefire/runorder/ThreadedExecutionSchedulerTest.java?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/plugin/surefire/runorder/ThreadedExecutionSchedulerTest.java (added)
+++ maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/plugin/surefire/runorder/ThreadedExecutionSchedulerTest.java Tue Nov 22 21:43:19 2011
@@ -0,0 +1,118 @@
+package org.apache.maven.plugin.surefire.runorder;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class ThreadedExecutionSchedulerTest
+    extends TestCase
+{
+
+    private final RunEntryStatistics a1 = RunEntryStatistics.fromValues( 200, 2, A.class, "at1" );
+
+    private final RunEntryStatistics a2 = RunEntryStatistics.fromValues( 300, 2, A.class, "at2" );
+
+    private final RunEntryStatistics b1 = RunEntryStatistics.fromValues( 400, 2, B.class, "bt1" );
+
+    private final RunEntryStatistics b2 = RunEntryStatistics.fromValues( 300, 2, B.class, "bt2" );
+
+    private final RunEntryStatistics c1 = RunEntryStatistics.fromValues( 400, 2, C.class, "ct1" );
+
+    private final RunEntryStatistics c2 = RunEntryStatistics.fromValues( 200, 2, C.class, "ct2" );
+
+    private final RunEntryStatistics d1 = RunEntryStatistics.fromValues( 401, 2, D.class, "ct2" );
+
+    private final RunEntryStatistics e1 = RunEntryStatistics.fromValues( 200, 2, E.class, "ct2" );
+
+    public void testAddTest()
+        throws Exception
+    {
+        ThreadedExecutionScheduler threadedExecutionScheduler = new ThreadedExecutionScheduler( 2 );
+        addPrioritizedTests( threadedExecutionScheduler );
+        final List result = threadedExecutionScheduler.getResult();
+        assertEquals( 5, result.size() );
+        assertEquals( B.class, result.get( 0 ) );
+        assertEquals( C.class, result.get( 1 ) );
+        assertEquals( D.class, result.get( 2 ) );
+        assertEquals( A.class, result.get( 3 ) );
+        assertEquals( E.class, result.get( 4 ) );
+
+    }
+
+    public void testAddTestJaggedResult()
+        throws Exception
+    {
+        ThreadedExecutionScheduler threadedExecutionScheduler = new ThreadedExecutionScheduler( 4 );
+        addPrioritizedTests( threadedExecutionScheduler );
+        final List result = threadedExecutionScheduler.getResult();
+        assertEquals( 5, result.size() );
+
+    }
+
+    private void addPrioritizedTests( ThreadedExecutionScheduler threadedExecutionScheduler )
+    {
+        threadedExecutionScheduler.addTest( new PrioritizedTest( B.class, createPriority( b1, b2 ) ) );
+        threadedExecutionScheduler.addTest( new PrioritizedTest( C.class, createPriority( c1, c2 ) ) );
+        threadedExecutionScheduler.addTest( new PrioritizedTest( A.class, createPriority( a1, a2 ) ) );
+        threadedExecutionScheduler.addTest( new PrioritizedTest( D.class, createPriority( d1 ) ) );
+        threadedExecutionScheduler.addTest( new PrioritizedTest( E.class, createPriority( e1 ) ) );
+    }
+
+    private Priority createPriority( RunEntryStatistics runEntryStatistics )
+    {
+        final Priority priority = new Priority( A.class.getName() );
+        priority.addItem( runEntryStatistics );
+        return priority;
+    }
+
+    private Priority createPriority( RunEntryStatistics runEntryStatistics, RunEntryStatistics runEntryStatistics2 )
+    {
+        final Priority priority = new Priority( A.class.getName() );
+        priority.addItem( runEntryStatistics );
+        priority.addItem( runEntryStatistics2 );
+        return priority;
+    }
+
+
+    class A
+    {
+    } // 500 total
+
+    class B
+    {
+    } // 700 total
+
+    class C
+    {
+    } // 600  total
+
+    class D
+    {
+    } // 400 total
+
+    class E
+    {
+    } // 200 total
+
+}

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

Modified: maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderCalculatorTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderCalculatorTest.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderCalculatorTest.java (original)
+++ maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderCalculatorTest.java Tue Nov 22 21:43:19 2011
@@ -1,38 +1,46 @@
 package org.apache.maven.surefire.util;
 
-import junit.framework.TestCase;
-
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.maven.surefire.testset.RunOrderParameters;
+
+import junit.framework.TestCase;
 
 /**
  * @author Kristian Rosenvold
  */
-public class RunOrderCalculatorTest extends TestCase {
-
-  public void testOrderTestClasses() throws Exception {
-    getClassesToRun();
-    TestsToRun testsToRun = new TestsToRun(getClassesToRun());
-    RunOrderCalculator runOrderCalculator = new DefaultRunOrderCalculator(RunOrder.ALPHABETICAL);
-    final TestsToRun testsToRun1 = runOrderCalculator.orderTestClasses(testsToRun);
-    assertEquals( A.class, testsToRun1.iterator().next());
-
-  }
-
-  private List getClassesToRun() {
-    List classesToRun = new ArrayList();
-    classesToRun.add( B.class);
-    classesToRun.add( A.class);
-    return classesToRun;
-  }
-
-  class A {
+public class RunOrderCalculatorTest
+    extends TestCase
+{
+
+    public void testOrderTestClasses()
+        throws Exception
+    {
+        getClassesToRun();
+        TestsToRun testsToRun = new TestsToRun( getClassesToRun() );
+        RunOrderCalculator runOrderCalculator = new DefaultRunOrderCalculator( RunOrderParameters.ALPHABETICAL(), 1 );
+        final TestsToRun testsToRun1 = runOrderCalculator.orderTestClasses( testsToRun );
+        assertEquals( A.class, testsToRun1.iterator().next() );
+
+    }
+
+    private List getClassesToRun()
+    {
+        List classesToRun = new ArrayList();
+        classesToRun.add( B.class );
+        classesToRun.add( A.class );
+        return classesToRun;
+    }
+
+    class A
+    {
 
-  }
+    }
 
-  class B {
+    class B
+    {
 
-  }
+    }
 
 
 }

Modified: maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderTest.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderTest.java (original)
+++ maven/surefire/trunk/surefire-api/src/test/java/org/apache/maven/surefire/util/RunOrderTest.java Tue Nov 22 21:43:19 2011
@@ -26,24 +26,37 @@ public class RunOrderTest
 {
     public void testShouldReturnRunOrderForLowerCaseName()
     {
-        assertEquals( RunOrder.HOURLY, RunOrder.valueOf( "hourly" ) );
+        assertEquals( RunOrder.HOURLY, RunOrder.valueOfMulti( "hourly" )[0] );
+    }
+
+    public void testMultiValue()
+    {
+        final RunOrder[] hourlies = RunOrder.valueOfMulti( "failedfirst,balanced" );
+        assertEquals( RunOrder.FAILEDFIRST, hourlies[0] );
+        assertEquals( RunOrder.BALANCED, hourlies[1] );
+    }
+
+    public void testAsString()
+    {
+        RunOrder[] orders = new RunOrder[]{ RunOrder.FAILEDFIRST, RunOrder.ALPHABETICAL };
+        assertEquals( "failedfirst,alphabetical", RunOrder.asString( orders ) );
     }
 
     public void testShouldReturnRunOrderForUpperCaseName()
     {
-        assertEquals( RunOrder.HOURLY, RunOrder.valueOf( "HOURLY" ) );
+        assertEquals( RunOrder.HOURLY, RunOrder.valueOfMulti( "HOURLY" )[0] );
     }
 
     public void testShouldReturnNullForNullName()
     {
-        assertNull( RunOrder.valueOf( null ) );
+        assertTrue( RunOrder.valueOfMulti( null ).length == 0 );
     }
 
     public void testShouldThrowExceptionForInvalidName()
     {
         try
         {
-            RunOrder.valueOf( "arbitraryName" );
+            RunOrder.valueOfMulti( "arbitraryName" );
             fail( "IllegalArgumentException not thrown." );
         }
         catch ( IllegalArgumentException expected )

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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -42,6 +42,7 @@ public interface BooterConstants
     String SOURCE_DIRECTORY = "testSuiteDefinitionTestSourceDirectory";
     String TEST_CLASSES_DIRECTORY = "testClassesDirectory";
     String RUN_ORDER = "runOrder";
+    String RUN_STATISTICS_FILE = "runStatisticsFile";
     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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -25,6 +25,7 @@ import java.io.InputStream;
 import java.util.List;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 
@@ -71,11 +72,14 @@ public class BooterDeserializer
         final List testSuiteXmlFiles = properties.getStringList( TEST_SUITE_XML_FILES );
         final File testClassesDirectory = properties.getFileProperty( TEST_CLASSES_DIRECTORY );
         final String runOrder = properties.getProperty( RUN_ORDER );
+        final String runStatisticsFile = properties.getProperty( RUN_STATISTICS_FILE );
 
         DirectoryScannerParameters dirScannerParams =
             new DirectoryScannerParameters( testClassesDirectory, includesList, excludesList,
                                             properties.getBooleanObjectProperty( FAILIFNOTESTS ), runOrder );
 
+        RunOrderParameters runOrderParameters = new RunOrderParameters( runOrder, runStatisticsFile );
+
         TestArtifactInfo testNg = new TestArtifactInfo( testNgVersion, testArtifactClassifier );
         TestRequest testSuiteDefinition =
             new TestRequest( testSuiteXmlFiles, sourceDirectory, requestedTest, requestedTestMethod );
@@ -83,9 +87,9 @@ public class BooterDeserializer
         ReporterConfiguration reporterConfiguration =
             new ReporterConfiguration( reportsDirectory, properties.getBooleanObjectProperty( ISTRIMSTACKTRACE ) );
 
-        return new ProviderConfiguration( dirScannerParams, properties.getBooleanProperty( FAILIFNOTESTS ),
-                                          reporterConfiguration, testNg, testSuiteDefinition,
-                                          properties.getProperties(), typeEncodedTestForFork );
+        return new ProviderConfiguration( dirScannerParams, runOrderParameters,
+                                          properties.getBooleanProperty( FAILIFNOTESTS ), reporterConfiguration, testNg,
+                                          testSuiteDefinition, properties.getProperties(), typeEncodedTestForFork );
     }
 
     public StartupConfiguration getProviderConfiguration()

Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderConfiguration.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderConfiguration.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderConfiguration.java (original)
+++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderConfiguration.java Tue Nov 22 21:43:19 2011
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Properties;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 
@@ -56,17 +57,21 @@ public class ProviderConfiguration
 
     private final TestRequest testSuiteDefinition;
 
+    private final RunOrderParameters runOrderParameters;
+
     private final Properties providerProperties;
 
     private final boolean failIfNoTests;
 
     private final TypeEncodedValue forkTestSet;
 
-    public ProviderConfiguration( DirectoryScannerParameters directoryScannerParameters, boolean failIfNoTests,
+    public ProviderConfiguration( DirectoryScannerParameters directoryScannerParameters,
+                                  RunOrderParameters runOrderParameters, boolean failIfNoTests,
                                   ReporterConfiguration reporterConfiguration, TestArtifactInfo testArtifact,
                                   TestRequest testSuiteDefinition, Properties providerProperties,
                                   TypeEncodedValue typeEncodedTestSet )
     {
+        this.runOrderParameters = runOrderParameters;
         this.providerProperties = providerProperties;
         this.reporterConfiguration = reporterConfiguration;
         this.testArtifact = testArtifact;
@@ -129,5 +134,8 @@ public class ProviderConfiguration
         return forkTestSet;
     }
 
-
+    public RunOrderParameters getRunOrderParameters()
+    {
+        return runOrderParameters;
+    }
 }

Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java (original)
+++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java Tue Nov 22 21:43:19 2011
@@ -63,20 +63,21 @@ public class ProviderFactory
         this.reporterManagerFactory = reporterManagerFactory;
     }
 
-    public SurefireProvider createProvider(boolean isInsideFork)
+    public SurefireProvider createProvider( boolean isInsideFork )
     {
         ClassLoader context = java.lang.Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader( surefireClassLoader );
 
         StartupConfiguration starterConfiguration = startupConfiguration;
 
-        final Object o = surefireReflector.createBooterConfiguration( surefireClassLoader, reporterManagerFactory,
-                                                                      isInsideFork );
+        final Object o =
+            surefireReflector.createBooterConfiguration( surefireClassLoader, reporterManagerFactory, isInsideFork );
         surefireReflector.setTestSuiteDefinitionAware( o, providerConfiguration.getTestSuiteDefinition() );
         surefireReflector.setProviderPropertiesAware( o, providerConfiguration.getProviderProperties() );
         surefireReflector.setReporterConfigurationAware( o, providerConfiguration.getReporterConfiguration() );
         surefireReflector.setTestClassLoaderAware( o, surefireClassLoader, testsClassLoader );
         surefireReflector.setTestArtifactInfoAware( o, providerConfiguration.getTestArtifact() );
+        surefireReflector.setRunOrderParameters( o, providerConfiguration.getRunOrderParameters() );
         surefireReflector.setIfDirScannerAware( o, providerConfiguration.getDirScannerParams() );
 
         Object provider = surefireReflector.instantiateProvider( starterConfiguration.getProviderClassName(), o );

Modified: maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/Foo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/Foo.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/Foo.java (original)
+++ maven/surefire/trunk/surefire-booter/src/test/java/org/apache/maven/surefire/booter/Foo.java Tue Nov 22 21:43:19 2011
@@ -23,15 +23,16 @@ package org.apache.maven.surefire.booter
 import java.util.Properties;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 
 /**
-* @author Kristian Rosenvold
-*/
+ * @author Kristian Rosenvold
+ */
 public class Foo
     implements DirectoryScannerParametersAware, TestRequestAware, ProviderPropertiesAware, ReporterConfigurationAware,
-    SurefireClassLoadersAware, TestArtifactInfoAware
+    SurefireClassLoadersAware, TestArtifactInfoAware, RunOrderParametersAware
 {
     DirectoryScannerParameters directoryScannerParameters;
 
@@ -49,6 +50,8 @@ public class Foo
 
     TestArtifactInfo testArtifactInfo;
 
+    RunOrderParameters runOrderParameters;
+
     boolean called = false;
 
     public void setDirectoryScannerParameters( DirectoryScannerParameters directoryScanner )
@@ -58,11 +61,13 @@ public class Foo
     }
 
 
-    /** @noinspection UnusedDeclaration
-     * @return true if it has been callsed */
+    /**
+     * @return true if it has been callsed
+     * @noinspection UnusedDeclaration
+     */
     public Boolean isCalled()
     {
-        return Boolean.valueOf( called);
+        return Boolean.valueOf( called );
     }
 
     public void setProviderProperties( Properties providerProperties )
@@ -95,4 +100,10 @@ public class Foo
         this.testArtifactInfo = testArtifactInfo;
         this.called = true;
     }
+
+    public void setRunOrderParameters( RunOrderParameters runOrderParameters )
+    {
+        this.runOrderParameters = runOrderParameters;
+        this.called = true;
+    }
 }

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=1205186&r1=1205185&r2=1205186&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 Nov 22 21:43:19 2011
@@ -28,9 +28,11 @@ import java.util.Arrays;
 import java.util.Properties;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.RunOrderParameters;
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.util.NestedRuntimeException;
+import org.apache.maven.surefire.util.RunOrder;
 
 import junit.framework.TestCase;
 
@@ -54,6 +56,18 @@ public class SurefireReflectorTest
 
     }
 
+    public void testRunOrderParameters()
+        throws Exception
+    {
+        SurefireReflector surefireReflector = getReflector();
+        Object foo = getFoo();
+
+        RunOrderParameters runOrderParameters = new RunOrderParameters( RunOrder.DEFAULT, new File( "." ) );
+        surefireReflector.setRunOrderParameters( foo, runOrderParameters );
+        assertTrue( isCalled( foo ).booleanValue() );
+
+    }
+
     public void testTestSuiteDefinition()
         throws Exception
     {

Modified: maven/surefire/trunk/surefire-integration-tests/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/pom.xml?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/pom.xml (original)
+++ maven/surefire/trunk/surefire-integration-tests/pom.xml Tue Nov 22 21:43:19 2011
@@ -37,7 +37,7 @@
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     <it.settings.showPasswords>false</it.settings.showPasswords>
     <testng.version>5.7</testng.version>
-    <surefire.threadcount>1s</surefire.threadcount>
+    <surefire.threadcount>1</surefire.threadcount>
     <surefire.build.version>2.8</surefire.build.version>
   </properties>
 

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/pom.xml?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/pom.xml (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/pom.xml Tue Nov 22 21:43:19 2011
@@ -0,0 +1,49 @@
+<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-parallel</artifactId>
+  <packaging>jar</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>runorder-parallel</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.1</version>
+    </dependency>
+  </dependencies>
+
+    <properties>
+       <runOrder>balanced</runOrder>
+     </properties>
+
+  <build>
+     <plugins>
+        <plugin>
+           <groupId>org.apache.maven.plugins</groupId>
+           <artifactId>maven-compiler-plugin</artifactId>
+           <configuration>
+              <source>1.5</source>
+              <target>1.5</target>
+           </configuration>
+        </plugin>
+        <plugin>
+           <groupId>org.apache.maven.plugins</groupId>
+           <artifactId>maven-surefire-plugin</artifactId>
+           <version>${surefire.version}</version>
+           <configuration>
+             <forkMode>once</forkMode>
+             <parallel>classes</parallel>
+             <runOrder>${runOrder}</runOrder>
+             <threadCount>2</threadCount>
+             <perCoreThreadCount>false</perCoreThreadCount>
+             <includes>
+                <include>**/Test*.java</include>
+             </includes>
+           </configuration>
+        </plugin>
+     </plugins>
+  </build>
+</project>

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

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test1.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test1.java?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test1.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test1.java Tue Nov 22 21:43:19 2011
@@ -0,0 +1,33 @@
+package runorder.parallel;
+
+import org.junit.Test;
+public class Test1
+{
+  
+    static void sleep(int ms){
+      try {
+        Thread.sleep(ms);
+      } catch (InterruptedException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+   @Test
+    public void testSleep200() {
+     System.out.println("Test1.sleep200 started @ " + System.currentTimeMillis());
+        sleep(200);
+    }
+
+  @Test
+   public void testSleep400() {
+    System.out.println("Test1.sleep400 started @ " + System.currentTimeMillis());
+       sleep(400);
+   }
+
+  @Test
+   public void testSleep600() {
+    System.out.println("Test1.sleep600 started @ " + System.currentTimeMillis());
+       sleep(600);
+   }
+
+}
\ No newline at end of file

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test1.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test2.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test2.java?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test2.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test2.java Tue Nov 22 21:43:19 2011
@@ -0,0 +1,27 @@
+package runorder.parallel;
+
+import org.junit.Test;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class Test2 {
+
+  @Test
+  public void testSleep100() {
+    System.out.println("Test2.sleep100 started @ " + System.currentTimeMillis());
+    Test1.sleep(100);
+  }
+
+  @Test
+  public void testSleep300() {
+    System.out.println("Test2.sleep300 started @ " + System.currentTimeMillis());
+    Test1.sleep(300);
+  }
+
+  @Test
+  public void testSleep500() {
+    System.out.println("Test2.sleep500 started @ " + System.currentTimeMillis());
+    Test1.sleep(500);
+  }
+}
\ No newline at end of file

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test3.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test3.java?rev=1205186&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test3.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test3.java Tue Nov 22 21:43:19 2011
@@ -0,0 +1,35 @@
+package runorder.parallel;
+
+import org.junit.Test;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class Test3 {
+
+  private void sleep(int ms) {
+    try {
+      Thread.sleep(ms);
+    } catch (InterruptedException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Test
+  public void testSleep10() {
+    System.out.println("Test3.sleep10 started @ " + System.currentTimeMillis());
+    Test1.sleep(10);
+  }
+
+  @Test
+  public void testSleep30() {
+    System.out.println("Test3.sleep30 started @ " + System.currentTimeMillis());
+    Test1.sleep(30);
+  }
+
+  @Test
+  public void testSleep50() {
+    System.out.println("Test3.sleep50 started @ " + System.currentTimeMillis());
+    Test1.sleep(50);
+  }
+}
\ No newline at end of file

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/runorder-parallel/src/test/java/runorder/parallel/Test3.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java?rev=1205186&r1=1205185&r2=1205186&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java Tue Nov 22 21:43:19 2011
@@ -19,6 +19,7 @@ package org.apache.maven.surefire.junitc
  * under the License.
  */
 
+import org.apache.maven.surefire.report.CategorizedReportEntry;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
 import org.apache.maven.surefire.report.ConsoleOutputReceiverForCurrentThread;
 import org.apache.maven.surefire.report.ReportEntry;
@@ -120,7 +121,9 @@ class TestMethod
 
     private ReportEntry createReportEntry()
     {
-        return this.description;
+        int elapsed = (int) ( endTime - startTime );
+        return new CategorizedReportEntry( description.getSourceName(), description.getName(), description.getGroup(),
+                                           description.getStackTraceWriter(), elapsed );
     }
 
     public void attachToThread()

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=1205186&r1=1205185&r2=1205186&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 Tue Nov 22 21:43:19 2011
@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.SortedMap;
 import java.util.TreeMap;
-
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.apache.maven.surefire.NonAbstractClassFilter;
@@ -42,9 +41,7 @@ import org.apache.maven.surefire.report.
 import org.apache.maven.surefire.report.SimpleReportEntry;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 import org.apache.maven.surefire.util.DefaultDirectoryScanner;
-import org.apache.maven.surefire.util.DefaultRunOrderCalculator;
 import org.apache.maven.surefire.util.DirectoryScanner;
-import org.apache.maven.surefire.util.RunOrder;
 import org.apache.maven.surefire.util.RunOrderCalculator;
 import org.apache.maven.surefire.util.TestsToRun;
 
@@ -75,11 +72,11 @@ public class TestNGDirectoryTestSuite
 
     public TestNGDirectoryTestSuite( File basedir, ArrayList includes, ArrayList excludes, String testSourceDirectory,
                                      String artifactVersion, Properties confOptions, File reportsDirectory,
-                                     String testMethodPattern )
+                                     String testMethodPattern, RunOrderCalculator runOrderCalculator )
     {
 
         this.surefireDirectoryScanner = new DefaultDirectoryScanner( basedir, includes, excludes );
-        this.runOrderCalculator = new DefaultRunOrderCalculator( RunOrder.FILESYSTEM );
+        this.runOrderCalculator = runOrderCalculator;
 
         this.options = confOptions;
 
@@ -180,7 +177,6 @@ public class TestNGDirectoryTestSuite
                                 this, junitReportsDirectory, testMethodPattern );
         }
 
-
         finishTestSuite( reporterManager, this );
     }
 
@@ -273,7 +269,7 @@ public class TestNGDirectoryTestSuite
         final TestsToRun scanned =
             surefireDirectoryScanner.locateTestClasses( classLoader, new NonAbstractClassFilter() );
 
-        final TestsToRun testsToRun = runOrderCalculator.orderTestClasses(  scanned );
+        final TestsToRun testsToRun = runOrderCalculator.orderTestClasses( scanned );
         Class[] locatedClasses = testsToRun.getLocatedClasses();
 
         for ( int i = 0; i < locatedClasses.length; i++ )

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=1205186&r1=1205185&r2=1205186&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 Tue Nov 22 21:43:19 2011
@@ -133,7 +133,7 @@ public class TestNGProvider
                                              testRequest.getTestSourceDirectory().toString(),
                                              testArtifactInfo.getVersion(), providerProperties,
                                              reporterConfiguration.getReportsDirectory(),
-                                             testRequest.getRequestedTestMethod() );
+                                             testRequest.getRequestedTestMethod(), runOrderCalculator );
     }
 
     private TestNGXmlTestSuite getXmlSuite()
@@ -167,7 +167,7 @@ public class TestNGProvider
     private TestsToRun scanClassPath()
     {
         final TestsToRun scanned = directoryScanner.locateTestClasses( testClassLoader, null );
-        return runOrderCalculator.orderTestClasses(  scanned );
+        return runOrderCalculator.orderTestClasses( scanned );
     }