You are viewing a plain text version of this content. The canonical link for it is here.
Posted to surefire-commits@maven.apache.org by kr...@apache.org on 2010/12/07 23:17:47 UTC

svn commit: r1043215 - in /maven/surefire/trunk: maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ surefire-api/src/main/java/org/apache/maven/surefire/ surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ surefire-api/...

Author: krosenvold
Date: Tue Dec  7 22:17:46 2010
New Revision: 1043215

URL: http://svn.apache.org/viewvc?rev=1043215&view=rev
Log:
o Pimped the junit47 provider to be reasonably best-practice

Added:
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassFilter.java   (contents, props changed)
      - copied, changed from r1042926, maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassScannerFilter.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java   (with props)
Removed:
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassScannerFilter.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreDirectoryTestSuite.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreTestSet.java
Modified:
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/SurefireProvider.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/util/DefaultDirectoryScanner.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentPrintStream.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreParameters.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestsToRun.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/TestsToRunTest.java

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java?rev=1043215&r1=1043214&r2=1043215&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  7 22:17:46 2010
@@ -290,11 +290,6 @@ public abstract class AbstractSurefireMo
 
             failIfNoTests = getFailIfNoTests() != null && getFailIfNoTests().booleanValue();
 
-            if ( isAnyConcurrencySelected() && isJunit47Compatible( junitArtifact ) )
-            {
-                getLog().info( "Concurrency config is " + getProperties().toString() );
-            }
-
             List includes = getIncludeList();
             List excludes = getExcludeList();
             directoryScannerParameters = new DirectoryScannerParameters( getTestClassesDirectory(), includes, excludes,

Copied: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassFilter.java (from r1042926, maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassScannerFilter.java)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassFilter.java?p2=maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassFilter.java&p1=maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassScannerFilter.java&r1=1042926&r2=1043215&rev=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassScannerFilter.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/NonAbstractClassFilter.java Tue Dec  7 22:17:46 2010
@@ -26,7 +26,7 @@ import java.lang.reflect.Modifier;
 /**
  * @author Kristian Rosenvold
  */
-public class NonAbstractClassScannerFilter
+public class NonAbstractClassFilter
     implements ScannerFilter
 {
     public boolean accept( Class testClass )

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

Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/SurefireProvider.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/SurefireProvider.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/SurefireProvider.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/SurefireProvider.java Tue Dec  7 22:17:46 2010
@@ -28,6 +28,12 @@ import java.util.Iterator;
 /**
  * Interface to be implemented by all Surefire providers.
  *
+ * Called in one of three ways:
+ * Forkmode = never: getSuites is not called, invoke is called with null parameter
+ * Forkmode = once: getSuites is not called, invoke is called with null parameter
+ * Forkmode anything else: getSuites is called, invoke is called on NEW INSTANCE for each item in getSuites
+ * response.
+ *
  * @author Kristian Rosenvold
  */
 public interface SurefireProvider

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=1043215&r1=1043214&r2=1043215&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  7 22:17:46 2010
@@ -19,7 +19,7 @@ package org.apache.maven.surefire.suite;
  * under the License.
  */
 
-import org.apache.maven.surefire.NonAbstractClassScannerFilter;
+import org.apache.maven.surefire.NonAbstractClassFilter;
 import org.apache.maven.surefire.Surefire;
 import org.apache.maven.surefire.report.ReporterManagerFactory;
 import org.apache.maven.surefire.util.DefaultDirectoryScanner;
@@ -73,7 +73,7 @@ public abstract class AbstractDirectoryT
         }
         testSets = new TreeMap();
 
-        Class[] locatedClasses = surefireDirectoryScanner.locateTestClasses( classLoader, new NonAbstractClassScannerFilter() );
+        Class[] locatedClasses = surefireDirectoryScanner.locateTestClasses( classLoader, new NonAbstractClassFilter() );
 
         for ( int i = 0; i < locatedClasses.length; i++ )
         {

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=1043215&r1=1043214&r2=1043215&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  7 22:17:46 2010
@@ -64,15 +64,7 @@ public class DefaultDirectoryScanner
         {
             String className = testClassNames[i];
 
-            Class testClass;
-            try
-            {
-                testClass = classLoader.loadClass( className );
-            }
-            catch ( ClassNotFoundException e )
-            {
-                throw new RuntimeException( "Unable to create test class '" + className + "'", e );
-            }
+            Class testClass = loadClass( classLoader, className );
 
             if (scannerFilter.accept( testClass)){
                 result.add( testClass );
@@ -81,6 +73,20 @@ public class DefaultDirectoryScanner
         return (Class[]) result.toArray( new Class[result.size()] );
     }
 
+    public static Class loadClass( ClassLoader classLoader, String className )
+    {
+        Class testClass;
+        try
+        {
+            testClass = classLoader.loadClass( className );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            throw new RuntimeException( "Unable to create test class '" + className + "'", e );
+        }
+        return testClass;
+    }
+
 
     String[] collectTests()
     {

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentPrintStream.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentPrintStream.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentPrintStream.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentPrintStream.java Tue Dec  7 22:17:46 2010
@@ -27,9 +27,6 @@ class ConcurrentPrintStream
 {
     private final boolean isStdout;
 
-    private final LogicalStream defaultStream = new  LogicalStream();
-
-
     ConcurrentPrintStream( boolean stdout )
     {
         super( new ByteArrayOutputStream() );

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreParameters.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreParameters.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreParameters.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreParameters.java Tue Dec  7 22:17:46 2010
@@ -94,7 +94,7 @@ class JUnitCoreParameters
     @Override
     public String toString()
     {
-        return "JUnitCoreParameters{" + "parallel='" + parallel + '\'' + ", perCoreThreadCount=" + perCoreThreadCount +
-            ", threadCount=" + threadCount + ", useUnlimitedThreads=" + useUnlimitedThreads + '}';
+        return "parallel='" + parallel + '\'' + ", perCoreThreadCount=" + perCoreThreadCount +
+            ", threadCount=" + threadCount + ", useUnlimitedThreads=" + useUnlimitedThreads;
     }
 }

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java Tue Dec  7 22:17:46 2010
@@ -19,17 +19,16 @@ package org.apache.maven.surefire.junitc
  * under the License.
  */
 
+import org.apache.maven.surefire.NonAbstractClassFilter;
 import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.ReporterException;
 import org.apache.maven.surefire.report.ReporterManagerFactory;
-import org.apache.maven.surefire.report.RunStatistics;
 import org.apache.maven.surefire.suite.RunResult;
 import org.apache.maven.surefire.testset.TestSetFailedException;
 import org.apache.maven.surefire.util.DirectoryScanner;
 
 import java.util.Iterator;
-import java.util.Properties;
 
 /**
  * @author Kristian Rosenvold
@@ -38,61 +37,58 @@ import java.util.Properties;
 public class JUnitCoreProvider
     implements SurefireProvider
 {
-    private final Properties providerProperties;
     private final ReporterManagerFactory reporterManagerFactory;
+
     private final ClassLoader testClassLoader;
+
     private final DirectoryScanner directoryScanner;
 
+    private final JUnitCoreParameters jUnitCoreParameters;
+
+    private final NonAbstractClassFilter scannerFilter;
+
+    private TestsToRun testsToRun;
 
+    @SuppressWarnings( { "UnusedDeclaration" } )
     public JUnitCoreProvider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();
         this.directoryScanner = booterParameters.getDirectoryScanner();
-        this.providerProperties = booterParameters.getProviderProperties();
+        this.jUnitCoreParameters = new JUnitCoreParameters( booterParameters.getProviderProperties() );
+        this.scannerFilter = new NonAbstractClassFilter();
+    }
+
+    public Boolean isRunnable()
+    {
+        return Boolean.TRUE;
     }
 
+    public Iterator getSuites()
+    {
+        testsToRun = scanClassPath();
+        return testsToRun.iterator();
+    }
 
-    @SuppressWarnings( { "UnnecessaryUnboxing" } )
     public RunResult invoke( Object forkTestSet )
         throws TestSetFailedException, ReporterException
     {
-        // Todo; Not there quite yet
-        JUnitCoreDirectoryTestSuite jUnitCoreDirectoryTestSuite = getSuite();
-
-        RunStatistics runStatistics = reporterManagerFactory.getGlobalRunStatistics();
-
-        jUnitCoreDirectoryTestSuite.locateTestSets( testClassLoader );
-        // getLog().info( "Concurrency config is " + getProperties().toString() );
+        final String message = "Concurrency config is " + jUnitCoreParameters.toString();
+        this.reporterManagerFactory.createReporterManager().writeConsoleMessage( message );
 
-        if ( forkTestSet != null )
+        if ( testsToRun == null )
         {
-            jUnitCoreDirectoryTestSuite.execute( (String) forkTestSet, reporterManagerFactory,
-                                                 testClassLoader );
-        }
-        else
-        {
-            jUnitCoreDirectoryTestSuite.execute( reporterManagerFactory, testClassLoader );
+            testsToRun = forkTestSet == null
+                ? scanClassPath()
+                : TestsToRun.fromClassName( (String) forkTestSet, testClassLoader );
         }
+        JUnitCoreWrapper.execute( testsToRun.getLocatedClasses(), this.reporterManagerFactory, jUnitCoreParameters );
         reporterManagerFactory.warnIfNoTests();
-
         return reporterManagerFactory.close();
     }
 
-    private JUnitCoreDirectoryTestSuite getSuite()
-    {
-        return new JUnitCoreDirectoryTestSuite( directoryScanner, new JUnitCoreParameters( providerProperties ),
-                                                reporterManagerFactory );
-    }
-
-    public Iterator getSuites()
+    private TestsToRun scanClassPath()
     {
-        return getSuite().locateTestSetsImpl( testClassLoader ).entrySet().iterator();
+        return new TestsToRun( directoryScanner.locateTestClasses( testClassLoader, scannerFilter ) );
     }
-
-    public Boolean isRunnable()
-    {
-        return Boolean.TRUE;
-    }
-
 }

Added: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java?rev=1043215&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java (added)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java Tue Dec  7 22:17:46 2010
@@ -0,0 +1,100 @@
+package org.apache.maven.surefire.junitcore;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.surefire.report.ReporterManagerFactory;
+import org.apache.maven.surefire.testset.TestSetFailedException;
+import org.junit.runner.Computer;
+import org.junit.runner.JUnitCore;
+
+import java.util.concurrent.ExecutionException;
+
+/**
+ * Encapsulates access to JUnitCore
+ *
+ * @author Kristian Rosenvold
+ */
+
+class JUnitCoreWrapper
+{
+    public static void execute( Class[] classes, ReporterManagerFactory reporterManagerFactory,
+                                JUnitCoreParameters jUnitCoreParameters )
+        throws TestSetFailedException
+    {
+        final ConcurrentReportingRunListener listener =
+            ConcurrentReportingRunListener.createInstance( reporterManagerFactory,
+                                                           jUnitCoreParameters.isParallelClasses(),
+                                                           jUnitCoreParameters.isParallelBoth() );
+        Computer computer = getComputer( jUnitCoreParameters );
+        JUnitCore junitCore = new JUnitCore();
+        junitCore.addListener( listener );
+        try
+        {
+            junitCore.run( computer, classes );
+        }
+        finally
+        {
+            junitCore.removeListener( listener );
+            closeIfConfigurable( computer );
+        }
+    }
+
+    private static void closeIfConfigurable( Computer computer )
+        throws TestSetFailedException
+    {
+        if ( computer instanceof ConfigurableParallelComputer )
+        {
+            try
+            {
+                ( (ConfigurableParallelComputer) computer ).close();
+            }
+            catch ( ExecutionException e )
+            {
+                throw new TestSetFailedException( e );
+            }
+        }
+    }
+
+    private static Computer getComputer( JUnitCoreParameters jUnitCoreParameters )
+        throws TestSetFailedException
+    {
+        if ( jUnitCoreParameters.isNoThreading() )
+        {
+            return new Computer();
+        }
+        return getConfigurableParallelComputer( jUnitCoreParameters );
+    }
+
+    private static Computer getConfigurableParallelComputer( JUnitCoreParameters JUnitCoreParameters )
+        throws TestSetFailedException
+    {
+        if ( JUnitCoreParameters.isUseUnlimitedThreads() )
+        {
+            return new ConfigurableParallelComputer();
+        }
+        else
+        {
+            return new ConfigurableParallelComputer( JUnitCoreParameters.isParallelClasses(),
+                                                     JUnitCoreParameters.isParallelMethod(),
+                                                     JUnitCoreParameters.getThreadCount(),
+                                                     JUnitCoreParameters.isPerCoreThreadCount() );
+        }
+    }
+}

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

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java Tue Dec  7 22:17:46 2010
@@ -28,7 +28,6 @@ import java.util.List;
  */
 public class LogicalStream
 {
-
     private final List<Entry> output = new ArrayList<Entry>();
 
     class Entry
@@ -80,7 +79,6 @@ public class LogicalStream
         }
     }
 
-
     public void writeToConsole( ReporterManager reporter )
     {
         for ( Entry entry : output )
@@ -101,5 +99,4 @@ public class LogicalStream
         }
         return stringBuilder.toString();
     }
-
 }

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestsToRun.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestsToRun.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestsToRun.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestsToRun.java Tue Dec  7 22:17:46 2010
@@ -21,8 +21,9 @@ package org.apache.maven.surefire.junitc
 import org.apache.maven.surefire.testset.TestSetFailedException;
 
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 /**
  * Contains all the tests that have been found according to specified include/exclude
@@ -32,34 +33,46 @@ import java.util.Map;
  */
 class TestsToRun
 {
-    final Class[] locatedClasses;
+    private final Class[] locatedClasses;
 
-    final int totalTests;
-
-    Map<String, JUnitCoreTestSet> testSets;
+    private final Set<Class> testSets;
 
     public TestsToRun( Class... locatedClasses )
     {
         this.locatedClasses = locatedClasses;
-        testSets = new HashMap<String, JUnitCoreTestSet>();
-        int testCount = 0;
+        testSets = new HashSet<Class>();
         for ( Class testClass : locatedClasses )
         {
-            JUnitCoreTestSet testSet = new JUnitCoreTestSet( testClass );
-
-            if ( testSets.containsKey( testSet.getName() ) )
+            if ( testSets.contains( testClass ) )
             {
-                throw new RuntimeException( "Duplicate test set '" + testSet.getName() + "'" );
+                throw new RuntimeException( "Duplicate test set '" + testClass.getName() + "'" );
             }
-            testSets.put( testSet.getName(), testSet );
-            testCount++;
+            testSets.add( testClass );
         }
-        this.totalTests = testCount;
     }
 
-    public Map<String, JUnitCoreTestSet> getTestSets()
+    private TestsToRun( String className, ClassLoader classLoader )
+        throws ClassNotFoundException
     {
-        return Collections.unmodifiableMap( testSets );
+        this( classLoader.loadClass( className ) );
+    }
+
+    public static TestsToRun fromClassName( String className, ClassLoader classLoader )
+        throws TestSetFailedException
+    {
+        try
+        {
+            return new TestsToRun( className, classLoader );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            throw new TestSetFailedException( e );
+        }
+    }
+
+    public Set<Class> getTestSets()
+    {
+        return Collections.unmodifiableSet( testSets );
     }
 
     public int size()
@@ -72,9 +85,8 @@ class TestsToRun
         return locatedClasses;
     }
 
-    public JUnitCoreTestSet getTestSet( String name )
+    public Iterator iterator()
     {
-        return testSets.get( name );
+        return testSets.iterator();
     }
-
 }

Modified: maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/TestsToRunTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/TestsToRunTest.java?rev=1043215&r1=1043214&r2=1043215&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/TestsToRunTest.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/TestsToRunTest.java Tue Dec  7 22:17:46 2010
@@ -21,10 +21,10 @@ package org.apache.maven.surefire.junitc
 
 import org.junit.Test;
 
-import java.util.Map;
+import java.util.Set;
 
 import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
 
 /*
  * @author Kristian Rosenvold, kristian.rosenvold@gmail com
@@ -38,10 +38,8 @@ public class TestsToRunTest
     {
         TestsToRun testsToRun = new TestsToRun( T1.class, T2.class );
         assertEquals( 2, testsToRun.size() );
-        JUnitCoreTestSet coreTestSet = testsToRun.getTestSet( "org.apache.maven.surefire.junitcore.TestsToRunTest$T1" );
-        assertNotNull( coreTestSet );
-        assertEquals( T1.class, coreTestSet.getTestClass() );
-        Map<String, JUnitCoreTestSet> stringJUnitCoreTestSetMap = testsToRun.getTestSets();
+        Set<Class> stringJUnitCoreTestSetMap = testsToRun.getTestSets();
+        assertTrue( stringJUnitCoreTestSetMap.contains( T1.class ) );
         assertEquals( 2, stringJUnitCoreTestSetMap.size() );
     }