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/06 23:29:56 UTC

svn commit: r1042820 - in /maven/surefire/trunk: maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/ maven-failsafe-plugin/src/site/ maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ maven-surefire-plugin/src/main/...

Author: krosenvold
Date: Mon Dec  6 22:29:54 2010
New Revision: 1042820

URL: http://svn.apache.org/viewvc?rev=1042820&view=rev
Log:
[SUREFIRE-141] Feature complete, including simple first version docs and javadoc.

A little fine tuning and some more docs remain before I close the issue

Added:
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java   (with props)
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java   (with props)
    maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java   (with props)
    maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt   (with props)
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire141PluggableProvidersIT.java
      - copied, changed from r1042818, maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/pom.xml   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/TestProvider.java
      - copied, changed from r1042818, maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/pom.xml   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java   (with props)
    maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java   (with props)
Removed:
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BooterParameters.java
Modified:
    maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
    maven/surefire/trunk/maven-failsafe-plugin/src/site/site.xml
    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/SurefireDependencyResolver.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/SurefireReflector.java
    maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BaseProviderFactory.java
    maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java
    maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
    maven/surefire/trunk/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
    maven/surefire/trunk/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java
    maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java

Modified: maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java (original)
+++ maven/surefire/trunk/maven-failsafe-plugin/src/main/java/org/apache/maven/plugin/failsafe/IntegrationTestMojo.java Mon Dec  6 22:29:54 2010
@@ -27,6 +27,7 @@ import org.apache.maven.execution.MavenS
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.surefire.AbstractSurefireMojo;
+import org.apache.maven.plugin.surefire.ProviderInfo;
 import org.apache.maven.plugin.surefire.SurefireExecutionParameters;
 import org.apache.maven.plugin.surefire.booterclient.ForkConfiguration;
 import org.apache.maven.plugin.surefire.booterclient.ForkStarter;
@@ -47,6 +48,7 @@ import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -604,33 +606,44 @@ public class IntegrationTestMojo
         {
             logReportsDirectory();
 
-            final AbstractSurefireMojo.WellKnownProvider provider = initialize();
-            ForkConfiguration forkConfiguration = getForkConfiguration();
-            ForkStarter forkStarter = createForkStarter( provider, forkConfiguration );
-
+            final List providers = initialize();
+            String exceptionMessage = null;
             FailsafeSummary result = new FailsafeSummary();
-            try
-            {
-                result.setResult( forkStarter.run() );
-            }
-            catch ( SurefireBooterForkException e )
+
+            ForkConfiguration forkConfiguration = null;
+            for ( Iterator iter = providers.iterator(); iter.hasNext(); )
             {
-                // Don't stop processing when timeout or other exception occures
-                // Otherwise, the following life cycles (e.g. post-integration-test)
-                // won't be executed
-                result.setResult( ProviderConfiguration.TESTS_FAILED_EXIT_CODE );
-                result.setException( e.getMessage() );
+                ProviderInfo provider = (ProviderInfo) iter.next();
+                forkConfiguration = getForkConfiguration();
+                ForkStarter forkStarter = createForkStarter( provider, forkConfiguration );
+                try
+                {
+                    result.setResult( forkStarter.run() );
+                }
+                catch ( SurefireBooterForkException e )
+                {
+                    if ( exceptionMessage == null )
+                    {
+                        exceptionMessage = e.getMessage();
+                    }
+                }
+                catch ( SurefireExecutionException e )
+                {
+                    if ( exceptionMessage == null )
+                    {
+                        exceptionMessage = e.getMessage();
+                    }
+                }
             }
-            catch ( SurefireExecutionException e )
+
+            if ( exceptionMessage != null )
             {
-                // Don't stop processing when timeout or other exception occures
-                // Otherwise, the following life cycles (e.g. post-integration-test)
-                // won't be executed
+                // Fail no matter what as long as any provider failed
                 result.setResult( ProviderConfiguration.TESTS_FAILED_EXIT_CODE );
-                result.setException( e.getMessage() );
+                result.setException( exceptionMessage );
             }
 
-            if ( getOriginalSystemProperties() != null && !forkConfiguration.isForking() )
+            if ( getOriginalSystemProperties() != null && forkConfiguration != null && !forkConfiguration.isForking() )
             {
                 // restore system properties, only makes sense when not forking..
                 System.setProperties( getOriginalSystemProperties() );

Modified: maven/surefire/trunk/maven-failsafe-plugin/src/site/site.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-failsafe-plugin/src/site/site.xml?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/maven-failsafe-plugin/src/site/site.xml (original)
+++ maven/surefire/trunk/maven-failsafe-plugin/src/site/site.xml Mon Dec  6 22:29:54 2010
@@ -25,6 +25,7 @@
       <item name="Introduction" href="index.html"/>
       <item name="Goals" href="plugin-info.html"/>
       <item name="Usage" href="usage.html"/>
+      <item name="API" href="api.html"/>
       <item name="FAQ" href="faq.html"/>
     </menu>
     <menu name="Examples">

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=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java Mon Dec  6 22:29:54 2010
@@ -39,9 +39,7 @@ import org.apache.maven.shared.artifact.
 import org.apache.maven.surefire.booter.Classpath;
 import org.apache.maven.surefire.booter.ClasspathConfiguration;
 import org.apache.maven.surefire.booter.ProviderConfiguration;
-import org.apache.maven.surefire.booter.ProviderDetector;
 import org.apache.maven.surefire.booter.StartupConfiguration;
-import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.BriefConsoleReporter;
 import org.apache.maven.surefire.report.BriefFileReporter;
 import org.apache.maven.surefire.report.ConsoleReporter;
@@ -57,7 +55,6 @@ import org.apache.maven.toolchain.Toolch
 import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
-import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -98,9 +95,9 @@ public abstract class AbstractSurefireMo
     private Artifact surefireArtifact;
 
 
-    WellKnownProvider[] wellKnownProviders;
+    ProviderList wellKnownProviders;
 
-    protected WellKnownProvider initialize()
+    protected List initialize()
         throws MojoFailureException
     {
         dependencyResolver =
@@ -109,32 +106,11 @@ public abstract class AbstractSurefireMo
 
         try
         {
-            wellKnownProviders = new WellKnownProvider[]{ new TestNgProviderInfo( getTestNgArtifact() ),
+            wellKnownProviders = new ProviderList(new ProviderInfo[]{ new TestNgProviderInfo( getTestNgArtifact() ),
                 new JUnitCoreProviderInfo( getJunitArtifact() ), new JUnit4ProviderInfo( getJunitArtifact() ),
-                new JUnit3ProviderInfo() };
-            String manuallyConfiguredProvider = getManuallyConfiguredProviderName();
-            if ( manuallyConfiguredProvider != null )
-            {
-                // Ok, all this code will have to go when we solve surefire-141. In the meantime we solve surefire-408
-                for ( int i = 0; i < wellKnownProviders.length; i++ )
-                {
-                    WellKnownProvider wellKnownProvider = wellKnownProviders[i];
-                    if ( wellKnownProvider.getProviderName().equals( manuallyConfiguredProvider ) )
-                    {
-                        getLog().info( "Using explicitly configured provider " + wellKnownProvider.getProviderName() );
-                        return wellKnownProvider;
-                    }
-                }
-                throw new IllegalArgumentException( "Unknown provider configured " + manuallyConfiguredProvider );
-            }
-            for ( int i = 0; i < wellKnownProviders.length; i++ )
-            {
-                if ( wellKnownProviders[i].isApplicable() )
-                {
-                    return wellKnownProviders[i];
-                }
-            }
-            return null;
+                new JUnit3ProviderInfo() }, new DynamicProviderInfo( null ) );
+
+            return wellKnownProviders.resolve(getLog());
         }
         catch ( InvalidVersionSpecificationException e )
         {
@@ -149,33 +125,6 @@ public abstract class AbstractSurefireMo
     }
 
 
-    private String getManuallyConfiguredProviderName()
-    {
-        try
-        {
-            final Set objects = ProviderDetector.getServiceNames( SurefireProvider.class,
-                                                                  Thread.currentThread().getContextClassLoader() );
-            if ( objects == null || objects.size() == 0 )
-            {
-                return null;
-            }
-            if ( objects.size() > 1 )
-            {
-                throw new IllegalArgumentException(
-                    "Surefire currently only supports on manually configured provider" );
-            }
-            return (String) objects.iterator().next();
-
-        }
-
-        catch ( IOException e )
-        {
-            throw new RuntimeException( e );
-        }
-
-
-    }
-
     protected final Toolchain getToolchain()
     {
         Toolchain tc = null;
@@ -277,9 +226,7 @@ public abstract class AbstractSurefireMo
         return ForkConfiguration.FORK_NEVER.equals( getForkMode() );
     }
 
-    protected ProviderConfiguration createProviderConfiguration( ForkConfiguration forkConfiguration,
-                                                                 WellKnownProvider provider,
-                                                                 StartupConfiguration startupConfiguration )
+    protected ProviderConfiguration createProviderConfiguration( ForkConfiguration forkConfiguration )
         throws MojoExecutionException, MojoFailureException
     {
 
@@ -304,10 +251,6 @@ public abstract class AbstractSurefireMo
             junitArtifact = getJunitArtifact();
 
             testNgArtifact = getTestNgArtifact();
-
-            provider.addProviderProperties();
-            provider.addProviderArtifactToBootClasspath( forkConfiguration.getBootClasspath() );
-            provider.addProviderArtifactToSurefireClasspath( startupConfiguration.getClasspathConfiguration() );
         }
         catch ( ArtifactNotFoundException e )
         {
@@ -391,7 +334,7 @@ public abstract class AbstractSurefireMo
     }
 
     protected StartupConfiguration createStartupConfiguration( ForkConfiguration forkConfiguration,
-                                                               WellKnownProvider provider )
+                                                               ProviderInfo provider )
         throws MojoExecutionException, MojoFailureException
     {
         final ClasspathConfiguration classpathConfiguration =
@@ -559,12 +502,12 @@ public abstract class AbstractSurefireMo
         return junitArtifact;
     }
 
-    protected ForkStarter createForkStarter( WellKnownProvider provider, ForkConfiguration forkConfiguration )
+    protected ForkStarter createForkStarter( ProviderInfo provider, ForkConfiguration forkConfiguration )
         throws MojoExecutionException, MojoFailureException
     {
         StartupConfiguration startupConfiguration = createStartupConfiguration( forkConfiguration, provider );
         ProviderConfiguration providerConfiguration =
-            createProviderConfiguration( forkConfiguration, provider, startupConfiguration );
+            createProviderConfiguration( forkConfiguration );
         return new ForkStarter( providerConfiguration, startupConfiguration, getReportsDirectory(), forkConfiguration,
                                 getForkedProcessTimeoutInSeconds() );
     }
@@ -955,26 +898,8 @@ public abstract class AbstractSurefireMo
         }
     }
 
-
-    public interface WellKnownProvider
-    {
-        String getProviderName();
-
-        String getProviderArtifactName();
-
-        public boolean isApplicable();
-
-        public void addProviderArtifactToBootClasspath( Classpath bootclasspath )
-            throws ArtifactResolutionException, ArtifactNotFoundException;
-
-        public void addProviderArtifactToSurefireClasspath( ClasspathConfiguration bootclasspath )
-            throws ArtifactResolutionException, ArtifactNotFoundException;
-
-        public void addProviderProperties();
-    }
-
     class TestNgProviderInfo
-        implements WellKnownProvider
+        implements ProviderInfo
     {
         private final Artifact testNgArtifact;
 
@@ -988,11 +913,6 @@ public abstract class AbstractSurefireMo
             return "org.apache.maven.surefire.testng.TestNGProvider";
         }
 
-        public String getProviderArtifactName()
-        {
-            return "surefire-testng";
-        }
-
         public boolean isApplicable()
         {
             return testNgArtifact != null;
@@ -1021,18 +941,13 @@ public abstract class AbstractSurefireMo
     }
 
     class JUnit3ProviderInfo
-        implements WellKnownProvider
+        implements ProviderInfo
     {
         public String getProviderName()
         {
             return "org.apache.maven.surefire.junit.JUnit3Provider";
         }
 
-        public String getProviderArtifactName()
-        {
-            return "surefire-junit3";
-        }
-
         public boolean isApplicable()
         {
             return true;
@@ -1051,7 +966,7 @@ public abstract class AbstractSurefireMo
         {
             // add the JUnit provider as default - it doesn't require JUnit to be present,
             // since it supports POJO tests.
-            dependencyResolver.addProviderToClasspath( classpathConfiguration, getProviderArtifactName(),
+            dependencyResolver.addProviderToClasspath( classpathConfiguration, "surefire-junit3",
                                                        surefireArtifact.getBaseVersion(), null );
 
         }
@@ -1059,7 +974,7 @@ public abstract class AbstractSurefireMo
     }
 
     class JUnit4ProviderInfo
-        implements WellKnownProvider
+        implements ProviderInfo
     {
         private final Artifact junitArtifact;
 
@@ -1073,11 +988,6 @@ public abstract class AbstractSurefireMo
             return "org.apache.maven.surefire.junit4.JUnit4Provider";
         }
 
-        public String getProviderArtifactName()
-        {
-            return "surefire-junit4";
-        }
-
         public boolean isApplicable()
         {
             return isAnyJunit4( junitArtifact );
@@ -1094,7 +1004,7 @@ public abstract class AbstractSurefireMo
         public void addProviderArtifactToSurefireClasspath( ClasspathConfiguration classpathConfiguration )
             throws ArtifactResolutionException, ArtifactNotFoundException
         {
-            dependencyResolver.addProviderToClasspath( classpathConfiguration, getProviderArtifactName(),
+            dependencyResolver.addProviderToClasspath( classpathConfiguration, "surefire-junit4",
                                                        surefireArtifact.getBaseVersion(), null );
 
         }
@@ -1102,7 +1012,7 @@ public abstract class AbstractSurefireMo
     }
 
     class JUnitCoreProviderInfo
-        implements WellKnownProvider
+        implements ProviderInfo
     {
         private final Artifact junitArtifact;
 
@@ -1116,19 +1026,57 @@ public abstract class AbstractSurefireMo
             return "org.apache.maven.surefire.junitcore.JUnitCoreProvider";
         }
 
-        public String getProviderArtifactName()
+        public boolean isApplicable()
         {
-            return "surefire-junit47";
+            return isAnyJunit4( junitArtifact ) && isAnyConcurrencySelected() && isJunit47Compatible( junitArtifact );
+        }
+
+        public void addProviderProperties()
+        {
+            convertJunitCoreParameters();
+        }
+
+        public void addProviderArtifactToBootClasspath( Classpath bootclasspath )
+        {
+        }
+
+        public void addProviderArtifactToSurefireClasspath( ClasspathConfiguration classpathConfiguration )
+            throws ArtifactResolutionException, ArtifactNotFoundException
+        {
+            dependencyResolver.addProviderToClasspath( classpathConfiguration, "surefire-junit47",
+                                                       surefireArtifact.getBaseVersion(), null );
+        }
+
+    }
+    public class DynamicProviderInfo
+        implements ConfigurableProviderInfo
+    {
+        final String providerName;
+
+        DynamicProviderInfo( String providerName )
+        {
+            this.providerName = providerName;
+        }
+
+        public ProviderInfo instantiate(String providerName){
+            return new DynamicProviderInfo(providerName);
+        }
+
+        public String getProviderName()
+        {
+            return providerName;
         }
 
         public boolean isApplicable()
         {
-            return isAnyJunit4( junitArtifact ) && isAnyConcurrencySelected() && isJunit47Compatible( junitArtifact );
+            return true;
         }
 
         public void addProviderProperties()
         {
+            // Ok this is a bit lazy.
             convertJunitCoreParameters();
+            convertTestNGParameters();
         }
 
         public void addProviderArtifactToBootClasspath( Classpath bootclasspath )
@@ -1138,9 +1086,11 @@ public abstract class AbstractSurefireMo
         public void addProviderArtifactToSurefireClasspath( ClasspathConfiguration classpathConfiguration )
             throws ArtifactResolutionException, ArtifactNotFoundException
         {
-            dependencyResolver.addProviderToClasspath( classpathConfiguration, getProviderArtifactName(),
-                                                       surefireArtifact.getBaseVersion(), null );
+            final Map pluginArtifactMap = getPluginArtifactMap();
+            Artifact plugin = (Artifact) pluginArtifactMap.get( "org.apache.maven.plugins:maven-surefire-plugin");
+            dependencyResolver.addProviderToClasspath( classpathConfiguration, pluginArtifactMap, plugin );
         }
 
     }
+
 }

Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java (added)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,29 @@
+package org.apache.maven.plugin.surefire;
+
+/*
+ * 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.
+ */
+
+/**
+ * @author Kristian Rosenvold
+ */
+interface ConfigurableProviderInfo
+    extends ProviderInfo
+{
+    ProviderInfo instantiate( String providerName );
+}

Propchange: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ConfigurableProviderInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java (added)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,43 @@
+package org.apache.maven.plugin.surefire;
+
+/*
+ * 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.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.surefire.booter.Classpath;
+import org.apache.maven.surefire.booter.ClasspathConfiguration;
+
+/**
+* @author Kristian Rosenvold
+*/
+public interface ProviderInfo
+{
+    String getProviderName();
+
+    public boolean isApplicable();
+
+    public void addProviderArtifactToBootClasspath( Classpath bootclasspath )
+        throws ArtifactResolutionException, ArtifactNotFoundException;
+
+    public void addProviderArtifactToSurefireClasspath( ClasspathConfiguration bootclasspath )
+        throws ArtifactResolutionException, ArtifactNotFoundException;
+
+    public void addProviderProperties();
+}

Propchange: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java (added)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,113 @@
+package org.apache.maven.plugin.surefire;
+
+/*
+ * 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.plugin.logging.Log;
+import org.apache.maven.surefire.booter.ProviderDetector;
+import org.apache.maven.surefire.providerapi.SurefireProvider;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Kristian Rosenvold
+ */
+public class ProviderList
+{
+    private final ProviderInfo[] wellKnownProviders;
+
+    private final ConfigurableProviderInfo dynamicProvider;
+
+    public ProviderList( ProviderInfo[] wellKnownProviders, ConfigurableProviderInfo dynamicProviderInfo )
+    {
+        this.wellKnownProviders = wellKnownProviders;
+        this.dynamicProvider = dynamicProviderInfo;
+    }
+
+
+    public List resolve( Log log )
+    {
+        List providersToRun = new ArrayList();
+
+        Set manuallyConfiguredProviders = getManuallyConfiguredProviders();
+        if ( manuallyConfiguredProviders.size() > 0 )
+        {
+            Iterator iter = manuallyConfiguredProviders.iterator();
+            String name;
+            while ( iter.hasNext() )
+            {
+                name = (String) iter.next();
+                ProviderInfo wellKnown = findByName( name );
+                ProviderInfo providerToAdd = wellKnown != null ? wellKnown : dynamicProvider.instantiate( name );
+                log.info( "Using configured provider " + providerToAdd.getProviderName() );
+                providersToRun.add( providerToAdd );
+            }
+            return providersToRun;
+        }
+
+        return autoDetectOneProvider();
+    }
+
+    private List autoDetectOneProvider()
+    {
+        List providersToRun = new ArrayList();
+        for ( int i = 0; i < wellKnownProviders.length; i++ )
+        {
+            if ( wellKnownProviders[i].isApplicable() )
+            {
+                providersToRun.add( wellKnownProviders[i] );
+                return providersToRun;
+            }
+        }
+        return providersToRun;
+    }
+
+    private Set getManuallyConfiguredProviders()
+    {
+        try
+        {
+            return ProviderDetector.getServiceNames( SurefireProvider.class,
+                                                     Thread.currentThread().getContextClassLoader() );
+        }
+
+        catch ( IOException e )
+        {
+            throw new RuntimeException( e );
+        }
+
+
+    }
+
+    private ProviderInfo findByName( String providerClassName )
+    {
+        for ( int i = 0; i < wellKnownProviders.length; i++ )
+        {
+            ProviderInfo wellKnownProvider = wellKnownProviders[i];
+            if ( wellKnownProvider.getProviderName().equals( providerClassName ) )
+            {
+                return wellKnownProvider;
+            }
+        }
+        return null;
+    }
+}

Propchange: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/ProviderList.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java (original)
+++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireDependencyResolver.java Mon Dec  6 22:29:54 2010
@@ -41,10 +41,11 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
- * Abstract base class for running tests using Surefire.
+ * Does dependency resolution and artifact handling for the surefire plugin.
  *
  * @author Stephen Connolly
  * @author Kristian Rosenvold
@@ -186,4 +187,17 @@ public class SurefireDependencyResolver
             bootClasspath.addClassPathElementUrl( artifact.getFile().getAbsolutePath() );
         }
     }
+
+    public void addProviderToClasspath( ClasspathConfiguration classpathConfiguration, Map pluginArtifactMap,
+                                        Artifact surefireArtifact )
+        throws ArtifactResolutionException, ArtifactNotFoundException
+    {
+        final ArtifactResolutionResult artifactResolutionResult = resolveArtifact( null, surefireArtifact );
+        for (Iterator iterator = pluginArtifactMap.values().iterator(); iterator.hasNext();){
+            Artifact artifact = (Artifact) iterator.next();
+            if( !artifactResolutionResult.getArtifacts().contains( artifact )){
+                classpathConfiguration.addClasspathUrl(  artifact.getFile().getPath() );
+            }
+        }
+    }
 }

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=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java (original)
+++ maven/surefire/trunk/maven-surefire-plugin/src/main/java/org/apache/maven/plugin/surefire/SurefirePlugin.java Mon Dec  6 22:29:54 2010
@@ -32,10 +32,10 @@ import org.apache.maven.project.MavenPro
 import org.apache.maven.surefire.booter.SurefireBooterForkException;
 import org.apache.maven.surefire.booter.SurefireExecutionException;
 import org.apache.maven.toolchain.ToolchainManager;
-import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -569,25 +569,36 @@ public class SurefirePlugin
         {
             logReportsDirectory();
 
-            final WellKnownProvider provider = initialize();
-            ForkConfiguration forkConfiguration = getForkConfiguration();
-            ForkStarter forkStarter = createForkStarter( provider, forkConfiguration );
-
-            int result;
-            try
-            {
-                result = forkStarter.run();
-            }
-            catch ( SurefireBooterForkException e )
+            final List providers = initialize();
+            Exception exception = null;
+            ForkConfiguration forkConfiguration = null;
+            int result = 0;
+            for ( Iterator iter = providers.iterator(); iter.hasNext(); )
             {
-                throw new MojoExecutionException( e.getMessage(), e );
+                ProviderInfo provider = (ProviderInfo) iter.next();
+                forkConfiguration = getForkConfiguration();
+                ForkStarter forkStarter = createForkStarter( provider, forkConfiguration );
+
+                try
+                {
+                    result = forkStarter.run();
+                }
+                catch ( SurefireBooterForkException e )
+                {
+                    exception = e;
+                }
+                catch ( SurefireExecutionException e )
+                {
+                    exception = e;
+                }
             }
-            catch ( SurefireExecutionException e )
+
+            if ( exception != null )
             {
-                throw new MojoExecutionException( e.getMessage(), e );
+                throw new MojoExecutionException( exception.getMessage(), exception );
             }
 
-            if ( getOriginalSystemProperties() != null && !forkConfiguration.isForking() )
+            if ( getOriginalSystemProperties() != null && forkConfiguration != null && !forkConfiguration.isForking() )
             {
                 // restore system properties, only makes sense when not forking..
                 System.setProperties( getOriginalSystemProperties() );

Added: maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt (added)
+++ maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt Mon Dec  6 22:29:54 2010
@@ -0,0 +1,51 @@
+  ------
+  Provider API
+  ------
+  Kristian Rosenvold
+  ------
+  2010-12-09
+  ------
+
+~~ 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.
+
+~~ NOTE: For help with the syntax of this file, see:
+~~ http://maven.apache.org/doxia/references/apt-format.html
+
+Maven Surefire Provider API
+
+  As of version 2.7 of surefire, there is a proposed public api available for
+  external providers to use surefire features.
+
+  The key features of surefire are forking, reporting and directory/classpath scanning.
+  The remaining features are implemented in the providers.
+
+   Please note that this API is still subject to change until otherwise declared, even in minor revisions.
+
+* Requirements for a provider
+
+  A provider contains a META-INF/services file entry named org.apache.maven.surefire.providerapi.SurefireProvider
+  ( as per {{{http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html}ServiceLoader}}). This file
+  contains the name of the actual provider class.
+
+  The actual provider class contains a one-arg constructor that accepts an instance of
+  org.apache.maven.surefire.providerapi.ProviderParameters. This interface delivers all the surefire feature
+  to the provider implementation, please see the javadoc of this interface for options.
+
+  There are 4 well-known providers within surefire that are also implemented this way, so
+  examples can be found by looking at the surefire source code itself. surefire-junit47 is
+  the showcase implementation.
\ No newline at end of file

Propchange: maven/surefire/trunk/maven-surefire-plugin/src/site/apt/api.apt
------------------------------------------------------------------------------
    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=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java Mon Dec  6 22:29:54 2010
@@ -20,7 +20,7 @@ package org.apache.maven.surefire.booter
  */
 
 import org.apache.maven.surefire.providerapi.BaseProviderFactory;
-import org.apache.maven.surefire.providerapi.BooterParameters;
+import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.providerapi.DirectoryScannerParametersAware;
 import org.apache.maven.surefire.providerapi.ProviderPropertiesAware;
 import org.apache.maven.surefire.providerapi.ReporterConfigurationAware;
@@ -97,7 +97,7 @@ public class SurefireReflector
             reporterConfigurationAware = surefireClassLoader.loadClass( ReporterConfigurationAware.class.getName() );
             providerPropertiesAware = surefireClassLoader.loadClass( ProviderPropertiesAware.class.getName() );
             runResult = surefireClassLoader.loadClass( RunResult.class.getName() );
-            booterParameters= surefireClassLoader.loadClass( BooterParameters.class.getName() );
+            booterParameters= surefireClassLoader.loadClass( ProviderParameters.class.getName() );
         }
         catch ( ClassNotFoundException e )
         {

Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BaseProviderFactory.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BaseProviderFactory.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BaseProviderFactory.java (original)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/BaseProviderFactory.java Mon Dec  6 22:29:54 2010
@@ -35,7 +35,7 @@ import java.util.Properties;
  */
 public class BaseProviderFactory
     implements DirectoryScannerParametersAware, ReporterConfigurationAware, SurefireClassLoadersAware, TestRequestAware,
-    ProviderPropertiesAware, BooterParameters, TestArtifactInfoAware
+    ProviderPropertiesAware, ProviderParameters, TestArtifactInfoAware
 {
     private Properties providerProperties;
 

Added: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java (added)
+++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/providerapi/ProviderParameters.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,67 @@
+package org.apache.maven.surefire.providerapi;
+
+import org.apache.maven.surefire.report.ReporterConfiguration;
+import org.apache.maven.surefire.report.ReporterManagerFactory;
+import org.apache.maven.surefire.testset.DirectoryScannerParameters;
+import org.apache.maven.surefire.testset.TestArtifactInfo;
+import org.apache.maven.surefire.testset.TestRequest;
+import org.apache.maven.surefire.util.DirectoryScanner;
+
+import java.util.Properties;
+
+/**
+ * Injected into the providers upon provider construction. Allows the provider to request services and data it needs.
+ *
+ * @author Kristian Rosenvold
+ */
+public interface ProviderParameters
+{
+    /**
+     * Provides a directory scanner that enforces the includes/excludes parameters that were passed to surefire.
+     * @return The directory scanner
+     */
+    DirectoryScanner getDirectoryScanner();
+
+    /**
+     * Provides features for creating reporting objects
+     * @return A reportermanager factory that allows the creation of one or more ReporterManagers
+     */
+    ReporterManagerFactory getReporterManagerFactory();
+
+    /**
+     * The raw parameters used in creating the directory scanner
+     * @return The parameters
+     */
+    DirectoryScannerParameters getDirectoryScannerParameters();
+
+    /**
+     * The raw parameters used in creating the ReporterManagerFactory
+     * @return The reporter configuration
+     */
+    ReporterConfiguration getReporterConfiguration();
+
+    /**
+     * Contains information about requested test suites or individual tests from the command line.
+     * @return The testRequest
+     */
+
+    TestRequest getTestRequest();
+
+    /**
+     * The class loader for the tests
+     * @return the classloader
+     */
+    ClassLoader getTestClassLoader();
+
+    /**
+     * The per-provider specific properties that may come all the way from the plugin's properties setting.
+     * @return the provider specific properties
+     */
+    Properties getProviderProperties();
+
+    /**
+     * Artifact info about the artifact used to autodetect provider
+     * @return The artifactinfo, or null if autodetect was not used.
+     */
+    TestArtifactInfo getTestArtifactInfo();
+}

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

Copied: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire141PluggableProvidersIT.java (from r1042818, maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire141PluggableProvidersIT.java?p2=maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire141PluggableProvidersIT.java&p1=maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java&r1=1042818&r2=1042820&rev=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire141PluggableProvidersIT.java Mon Dec  6 22:29:54 2010
@@ -31,20 +31,26 @@ import java.util.Arrays;
  *
  * @author Kristian Rosenvold
  */
-public class Surefire408ManualProviderSelectionIT
+public class Surefire141PluggableProvidersIT
     extends AbstractSurefireIntegrationTestClass
 {
     public void testPaallelBuildResultCount()
         throws Exception
     {
-        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/surefire-408-manual-provider-selection" );
-
+        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/surefire-141-pluggableproviders/test-provider" );
         Verifier verifier = new Verifier( testDir.getAbsolutePath() );
-        String[] opts = { "-X" };
-        verifier.setCliOptions( new ArrayList( Arrays.asList( opts ) ) );
-        this.executeGoal( verifier, "test" );
+        this.executeGoal(  verifier, "install" );
         verifier.resetStreams();
 
-        verifier.verifyTextInLog("Using explicitly configured provider org.apache.maven.surefire.junit.JUnit3Provider");
+        testDir = ResourceExtractor.simpleExtractResources( getClass(), "/surefire-141-pluggableproviders/test" );
+        verifier = new Verifier( testDir.getAbsolutePath() );
+        String[] opts = { "-e" };
+        verifier.setCliOptions( new ArrayList( Arrays.asList( opts ) ) );
+        this.executeGoal( verifier, "install" );
+
+        verifier.verifyTextInLog("Using configured provider org.apache.maven.surefire.testprovider.TestProvider");
+        verifier.verifyTextInLog("Using configured provider org.apache.maven.surefire.junit.JUnit3Provider");
+
+        verifier.verifyErrorFreeLog();
     }
 }
\ No newline at end of file

Modified: maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/Surefire408ManualProviderSelectionIT.java Mon Dec  6 22:29:54 2010
@@ -40,11 +40,11 @@ public class Surefire408ManualProviderSe
         File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/surefire-408-manual-provider-selection" );
 
         Verifier verifier = new Verifier( testDir.getAbsolutePath() );
-        String[] opts = { "-X" };
+        String[] opts = { "-e" };
         verifier.setCliOptions( new ArrayList( Arrays.asList( opts ) ) );
         this.executeGoal( verifier, "test" );
         verifier.resetStreams();
 
-        verifier.verifyTextInLog("Using explicitly configured provider org.apache.maven.surefire.junit.JUnit3Provider");
+        verifier.verifyTextInLog("Using configured provider org.apache.maven.surefire.junit.JUnit3Provider");
     }
 }
\ No newline at end of file

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/pom.xml?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/pom.xml (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/pom.xml Mon Dec  6 22:29:54 2010
@@ -0,0 +1,47 @@
+<!--
+  ~ 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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.plugins.surefire</groupId>
+  <artifactId>surefire-test-provider</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>Test provider</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.surefire</groupId>
+      <artifactId>surefire-api</artifactId>
+      <version>${surefire.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources/META-INF</directory>
+        <targetPath>META-INF</targetPath>
+      </resource>
+    </resources>
+  </build>
+
+
+</project>

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

Copied: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/TestProvider.java (from r1042818, maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java)
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/TestProvider.java?p2=maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/TestProvider.java&p1=maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java&r1=1042818&r2=1042820&rev=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java (original)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/java/org/apache/maven/surefire/testprovider/TestProvider.java Mon Dec  6 22:29:54 2010
@@ -1,4 +1,4 @@
-package org.apache.maven.surefire.junit;
+package org.apache.maven.surefire.testprovider;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,75 +19,44 @@ package org.apache.maven.surefire.junit;
  * under the License.
  */
 
-import org.apache.maven.surefire.providerapi.BooterParameters;
+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.suite.RunResult;
 import org.apache.maven.surefire.testset.TestSetFailedException;
-import org.apache.maven.surefire.util.DirectoryScanner;
 
 import java.util.Iterator;
 
 /**
  * @author Kristian Rosenvold
- * @noinspection UnusedDeclaration
  */
-public class JUnit3Provider
+public class TestProvider
     implements SurefireProvider
 {
     private final ReporterManagerFactory reporterManagerFactory;
-
     private final ClassLoader testClassLoader;
 
-    private final DirectoryScanner directoryScanner;
-
-    public JUnit3Provider( BooterParameters booterParameters )
+    public TestProvider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();
-        this.directoryScanner = booterParameters.getDirectoryScanner();
     }
 
-    public RunResult invoke( Object forkTestSet )
-        throws TestSetFailedException, ReporterException
-    {
-        JUnitDirectoryTestSuite suite = getSuite();
-        suite.locateTestSets( testClassLoader );
-        if ( forkTestSet != null )
-        {
-            suite.execute( (String) forkTestSet, reporterManagerFactory, testClassLoader );
-        }
-        else
-        {
-            suite.execute( reporterManagerFactory, testClassLoader );
-        }
-
-        reporterManagerFactory.warnIfNoTests();
-
-        return reporterManagerFactory.close();
-    }
 
-    private JUnitDirectoryTestSuite getSuite()
+    public Boolean isRunnable()
     {
-        return new JUnitDirectoryTestSuite( directoryScanner );
-
+        return Boolean.TRUE;
     }
 
     public Iterator getSuites()
     {
-        try
-        {
-            return getSuite().locateTestSets( testClassLoader ).keySet().iterator();
-        }
-        catch ( TestSetFailedException e )
-        {
-            throw new RuntimeException( e );
-        }
+        return null;
     }
 
-    public Boolean isRunnable()
+    public RunResult invoke( Object forkTestSet )
+        throws TestSetFailedException, ReporterException
     {
-        return Boolean.TRUE;
+        return new RunResult( 1,0,0,2 );
     }
 }

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test-provider/src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider Mon Dec  6 22:29:54 2010
@@ -0,0 +1 @@
+org.apache.maven.surefire.testprovider.TestProvider

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/pom.xml
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/pom.xml?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/pom.xml (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/pom.xml Mon Dec  6 22:29:54 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>junit-twoTestCases</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>Test for two test cases</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>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.surefire</groupId>
+                        <artifactId>surefire-junit3</artifactId>
+                        <version>${surefire.version}</version>
+                    </dependency>
+                  <dependency>
+                      <groupId>org.apache.maven.plugins.surefire</groupId>
+                      <artifactId>surefire-test-provider</artifactId>
+                      <version>1.0-SNAPSHOT</version>
+                  </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

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

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,67 @@
+package junit.twoTestCases;
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class BasicTest
+    extends TestCase
+{
+
+    private boolean setUpCalled = false;
+
+    private static boolean tearDownCalled = false;
+
+    public BasicTest( String name, String extraName )
+    {
+        super( name );
+    }
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite();
+        Test test = new BasicTest( "testSetUp", "dummy" );
+        suite.addTest( test );
+        TestSetup setup = new TestSetup( suite )
+        {
+
+            protected void setUp()
+            {
+                //oneTimeSetUp();
+            }
+
+            protected void tearDown()
+            {
+                oneTimeTearDown();
+            }
+
+        };
+
+        return setup;
+    }
+
+    protected void setUp()
+    {
+        setUpCalled = true;
+        tearDownCalled = false;
+        System.out.println( "Called setUp" );
+    }
+
+    protected void tearDown()
+    {
+        setUpCalled = false;
+        tearDownCalled = true;
+        System.out.println( "Called tearDown" );
+    }
+
+    public void testSetUp()
+    {
+        assertTrue( "setUp was not called", setUpCalled );
+    }
+
+    public static void oneTimeTearDown()
+    {
+        assertTrue( "tearDown was not called", tearDownCalled );
+    }
+
+}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/BasicTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java?rev=1042820&view=auto
==============================================================================
--- maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java (added)
+++ maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java Mon Dec  6 22:29:54 2010
@@ -0,0 +1,9 @@
+package junit.twoTestCases;
+import junit.framework.TestCase;
+
+
+public class TestTwo
+    extends TestCase
+{
+    public void testTwo() {}
+}

Propchange: maven/surefire/trunk/surefire-integration-tests/src/test/resources/surefire-141-pluggableproviders/test/src/test/java/junit/twoTestCases/TestTwo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java Mon Dec  6 22:29:54 2010
@@ -19,7 +19,7 @@ package org.apache.maven.surefire.junit;
  * under the License.
  */
 
-import org.apache.maven.surefire.providerapi.BooterParameters;
+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;
@@ -42,7 +42,7 @@ public class JUnit3Provider
 
     private final DirectoryScanner directoryScanner;
 
-    public JUnit3Provider( BooterParameters booterParameters )
+    public JUnit3Provider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();

Modified: maven/surefire/trunk/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java
URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java?rev=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java Mon Dec  6 22:29:54 2010
@@ -19,7 +19,7 @@ package org.apache.maven.surefire.junit4
  * under the License.
  */
 
-import org.apache.maven.surefire.providerapi.BooterParameters;
+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;
@@ -43,7 +43,7 @@ public class JUnit4Provider
 
     private final DirectoryScanner directoryScanner;
 
-    public JUnit4Provider( BooterParameters booterParameters )
+    public JUnit4Provider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();

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=1042820&r1=1042819&r2=1042820&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 Mon Dec  6 22:29:54 2010
@@ -19,7 +19,7 @@ package org.apache.maven.surefire.junitc
  * under the License.
  */
 
-import org.apache.maven.surefire.providerapi.BooterParameters;
+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;
@@ -44,7 +44,7 @@ public class JUnitCoreProvider
     private final DirectoryScanner directoryScanner;
 
 
-    public JUnitCoreProvider( BooterParameters booterParameters )
+    public JUnitCoreProvider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();

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=1042820&r1=1042819&r2=1042820&view=diff
==============================================================================
--- maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java (original)
+++ maven/surefire/trunk/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java Mon Dec  6 22:29:54 2010
@@ -19,7 +19,7 @@ package org.apache.maven.surefire.testng
  * under the License.
  */
 
-import org.apache.maven.surefire.providerapi.BooterParameters;
+import org.apache.maven.surefire.providerapi.ProviderParameters;
 import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.report.ReporterException;
@@ -30,7 +30,6 @@ import org.apache.maven.surefire.testset
 import org.apache.maven.surefire.testset.TestArtifactInfo;
 import org.apache.maven.surefire.testset.TestRequest;
 import org.apache.maven.surefire.testset.TestSetFailedException;
-import org.apache.maven.surefire.util.DirectoryScanner;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -60,7 +59,7 @@ public class TestNGProvider
 
     private final File basedir;
 
-    public TestNGProvider( BooterParameters booterParameters )
+    public TestNGProvider( ProviderParameters booterParameters )
     {
         this.reporterManagerFactory = booterParameters.getReporterManagerFactory();
         this.testClassLoader = booterParameters.getTestClassLoader();