Author: krosenvold Date: Sun Nov 20 22:22:25 2011 New Revision: 1204285 URL: http://svn.apache.org/viewvc?rev=1204285&view=rev Log: o Refactored slightly to split InProcess/Forked creation. Also tried to move reporting further out of the fork.
This area of the code still needs a lot more work Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java (with props) maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java (with props) maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StarterCommon.java - copied, changed from r1203992, maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java Modified: 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/booterclient/ForkStarter.java maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/SurefireReflector.java maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/ReflectionUtils.java maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java maven/surefire/trunk/surefire-providers/surefire-junit4/src/test/java/org/apache/maven/surefire/junit4/JUnit4ProviderTest.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=1204285&r1=1204284&r2=1204285&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 Sun Nov 20 22:22:25 2011 @@ -33,7 +33,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; - import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; @@ -59,7 +58,6 @@ import org.apache.maven.surefire.booter. import org.apache.maven.surefire.booter.StartupReportConfiguration; import org.apache.maven.surefire.booter.SurefireBooterForkException; import org.apache.maven.surefire.booter.SurefireExecutionException; -import org.apache.maven.surefire.booter.SurefireStarter; import org.apache.maven.surefire.report.ReporterConfiguration; import org.apache.maven.surefire.suite.RunResult; import org.apache.maven.surefire.testset.DirectoryScannerParameters; @@ -190,7 +188,7 @@ public abstract class AbstractSurefireMo final RunResult result; if ( ForkConfiguration.FORK_NEVER.equals( forkConfiguration.getForkMode() ) ) { - SurefireStarter surefireStarter = + InPluginVMSurefireStarter surefireStarter = createInprocessStarter( provider, forkConfiguration, classLoaderConfiguration ); result = surefireStarter.runSuitesInProcess(); } @@ -571,7 +569,7 @@ public abstract class AbstractSurefireMo getForkedProcessTimeoutInSeconds(), startupReportConfiguration ); } - protected SurefireStarter createInprocessStarter( ProviderInfo provider, ForkConfiguration forkConfiguration, + protected InPluginVMSurefireStarter createInprocessStarter( ProviderInfo provider, ForkConfiguration forkConfiguration, ClassLoaderConfiguration classLoaderConfiguration ) throws MojoExecutionException, MojoFailureException { @@ -579,7 +577,7 @@ public abstract class AbstractSurefireMo createStartupConfiguration( forkConfiguration, provider, classLoaderConfiguration ); StartupReportConfiguration startupReportConfiguration = getStartupReportConfiguration(); ProviderConfiguration providerConfiguration = createProviderConfiguration(); - return new SurefireStarter( startupConfiguration, providerConfiguration, startupReportConfiguration ); + return new InPluginVMSurefireStarter( startupConfiguration, providerConfiguration, startupReportConfiguration ); } Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java?rev=1204285&view=auto ============================================================================== --- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java (added) +++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java Sun Nov 20 22:22:25 2011 @@ -0,0 +1,81 @@ +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 java.io.File; +import java.lang.reflect.Constructor; +import org.apache.maven.plugin.surefire.report.FileReporterFactory; +import org.apache.maven.surefire.booter.StartupReportConfiguration; +import org.apache.maven.surefire.util.ReflectionUtils; +import org.apache.maven.surefire.util.SurefireReflectionException; + +/** + * @author Kristian Rosenvold + */ +public class CommonReflector +{ + private final Class startupReportConfiguration; + + private final ClassLoader surefireClassLoader; + + public CommonReflector( ClassLoader surefireClassLoader ) + { + this.surefireClassLoader = surefireClassLoader; + + try + { + startupReportConfiguration = surefireClassLoader.loadClass( StartupReportConfiguration.class.getName() ); + } + catch ( ClassNotFoundException e ) + { + throw new SurefireReflectionException( e ); + } + } + + public Object createReportingReporterFactory( StartupReportConfiguration startupReportConfiguration ) + { + Class[] args = + new Class[]{ this.startupReportConfiguration }; + Object src = createStartupReportConfiguration( startupReportConfiguration ); + Object[] params = new Object[]{ src }; + return ReflectionUtils.instantiateObject( FileReporterFactory.class.getName(), args, + params, surefireClassLoader ); + } + + + Object createStartupReportConfiguration( StartupReportConfiguration reporterConfiguration ) + { + Constructor constructor = ReflectionUtils.getConstructor( this.startupReportConfiguration, + new Class[]{ boolean.class, boolean.class, + String.class, boolean.class, boolean.class, + File.class, boolean.class, String.class } ); + //noinspection BooleanConstructorCall + final Object[] params = + { new Boolean( reporterConfiguration.isUseFile() ), new Boolean( reporterConfiguration.isPrintSummary() ), + reporterConfiguration.getReportFormat(), + new Boolean( reporterConfiguration.isRedirectTestOutputToFile() ), + new Boolean( reporterConfiguration.isDisableXmlReport() ), + reporterConfiguration.getReportsDirectory(), + new Boolean( reporterConfiguration.isTrimStackTrace()), + reporterConfiguration.getReportNameSuffix()}; + return ReflectionUtils.newInstance( constructor, params ); + } + +} Propchange: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java?rev=1204285&view=auto ============================================================================== --- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java (added) +++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java Sun Nov 20 22:22:25 2011 @@ -0,0 +1,73 @@ +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.surefire.booter.ProviderConfiguration; +import org.apache.maven.surefire.booter.StarterCommon; +import org.apache.maven.surefire.booter.StartupConfiguration; +import org.apache.maven.surefire.booter.StartupReportConfiguration; +import org.apache.maven.surefire.booter.SurefireExecutionException; +import org.apache.maven.surefire.suite.RunResult; + +/** + * Starts the provider in the same VM as the surefire plugin. + * <p/> + * This part of the booter is always guaranteed to be in the + * same vm as the tests will be run in. + * + * @author Jason van Zyl + * @author Brett Porter + * @author Emmanuel Venisse + * @author Dan Fabulich + * @author Kristian Rosenvold + * @version $Id$ + */ +public class InPluginVMSurefireStarter +{ + + private final StartupReportConfiguration startupReportConfiguration; + + private final StarterCommon starterCommon; + + public InPluginVMSurefireStarter( StartupConfiguration startupConfiguration, + ProviderConfiguration providerConfiguration, + StartupReportConfiguration startupReportConfiguration ) + { + this.startupReportConfiguration = startupReportConfiguration; + this.starterCommon = new StarterCommon( startupConfiguration, providerConfiguration ); + } + + public RunResult runSuitesInProcess() + throws SurefireExecutionException + { + // The test classloader must be constructed first to avoid issues with commons-logging until we properly + // separate the TestNG classloader + ClassLoader testsClassLoader = starterCommon.createInProcessTestClassLoader(); + + ClassLoader surefireClassLoader = starterCommon.createSurefireClassloader( testsClassLoader ); + + CommonReflector surefireReflector = new CommonReflector( surefireClassLoader ); + + final Object factory = surefireReflector.createReportingReporterFactory( startupReportConfiguration ); + + return starterCommon.invokeProvider( null, testsClassLoader, surefireClassLoader, factory, false ); + } + +} Propchange: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/InPluginVMSurefireStarter.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java (original) +++ maven/surefire/trunk/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java Sun Nov 20 22:22:25 2011 @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Properties; +import org.apache.maven.plugin.surefire.CommonReflector; import org.apache.maven.plugin.surefire.booterclient.output.ForkClient; import org.apache.maven.plugin.surefire.booterclient.output.ThreadedStreamConsumer; import org.apache.maven.plugin.surefire.report.FileReporterFactory; @@ -34,7 +35,6 @@ import org.apache.maven.surefire.booter. import org.apache.maven.surefire.booter.StartupReportConfiguration; import org.apache.maven.surefire.booter.SurefireBooterForkException; import org.apache.maven.surefire.booter.SurefireExecutionException; -import org.apache.maven.surefire.booter.SurefireReflector; import org.apache.maven.surefire.booter.SystemPropertyManager; import org.apache.maven.surefire.providerapi.SurefireProvider; import org.apache.maven.surefire.report.ReporterFactory; @@ -220,13 +220,13 @@ public class ForkStarter ClassLoader testsClassLoader = classpathConfiguration.createTestClassLoader( false ); ClassLoader surefireClassLoader = classpathConfiguration.createSurefireClassLoader( testsClassLoader ); - SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); - Object reporterFactory = surefireReflector.createReportingReporterFactory( startupReportConfiguration ); + CommonReflector commonReflector = new CommonReflector( surefireClassLoader ); + Object reporterFactory = commonReflector.createReportingReporterFactory( startupReportConfiguration ); final ProviderFactory providerFactory = new ProviderFactory( startupConfiguration, providerConfiguration, surefireClassLoader, testsClassLoader, reporterFactory ); - SurefireProvider surefireProvider = providerFactory.createProvider(); + SurefireProvider surefireProvider = providerFactory.createProvider(false); return surefireProvider.getSuites(); } catch ( SurefireExecutionException e ) @@ -235,4 +235,6 @@ public class ForkStarter } } + + } Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java (original) +++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/booter/BaseProviderFactory.java Sun Nov 20 22:22:25 2011 @@ -20,7 +20,6 @@ package org.apache.maven.surefire.booter */ import java.util.Properties; -import org.apache.maven.plugin.surefire.report.FileReporterFactory; import org.apache.maven.surefire.providerapi.ProviderParameters; import org.apache.maven.surefire.report.ConsoleLogger; import org.apache.maven.surefire.report.DefaultDirectConsoleReporter; @@ -59,9 +58,12 @@ public class BaseProviderFactory private final ReporterFactory reporterFactory; - public BaseProviderFactory( ReporterFactory reporterFactory ) + private final boolean insideFork; + + public BaseProviderFactory( ReporterFactory reporterFactory, Boolean insideFork ) { this.reporterFactory = reporterFactory; + this.insideFork = insideFork.booleanValue(); } public DirectoryScanner getDirectoryScanner() @@ -106,13 +108,12 @@ public class BaseProviderFactory public ConsoleLogger getConsoleLogger() { - // Maybe a somewhat odd way to determine if we're forking - if ( getReporterFactory() instanceof FileReporterFactory ) + if ( insideFork ) { - return new DefaultDirectConsoleReporter( reporterConfiguration.getOriginalSystemOut() ); + return new ForkingRunListener( reporterConfiguration.getOriginalSystemOut(), ROOT_CHANNEl.intValue(), + reporterConfiguration.isTrimStackTrace().booleanValue() ); } - return new ForkingRunListener( reporterConfiguration.getOriginalSystemOut(), ROOT_CHANNEl.intValue(), - reporterConfiguration.isTrimStackTrace().booleanValue() ); + return new DefaultDirectConsoleReporter( reporterConfiguration.getOriginalSystemOut() ); } public void setTestRequest( TestRequest testRequest ) 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=1204285&r1=1204284&r2=1204285&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 Sun Nov 20 22:22:25 2011 @@ -26,8 +26,6 @@ import java.lang.reflect.InvocationHandl import java.lang.reflect.Method; import java.util.List; import java.util.Properties; - -import org.apache.maven.plugin.surefire.report.FileReporterFactory; import org.apache.maven.surefire.providerapi.ProviderParameters; import org.apache.maven.surefire.report.ReporterConfiguration; import org.apache.maven.surefire.report.ReporterFactory; @@ -36,7 +34,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.util.ReflectionUtils; -import org.apache.maven.surefire.util.RunOrder; import org.apache.maven.surefire.util.SurefireReflectionException; /** @@ -76,15 +73,12 @@ public class SurefireReflector private final Class reporterFactory; - private final Class startupReportConfiguration; - public SurefireReflector( ClassLoader surefireClassLoader ) { this.surefireClassLoader = surefireClassLoader; try { reporterConfiguration = surefireClassLoader.loadClass( ReporterConfiguration.class.getName() ); - startupReportConfiguration = surefireClassLoader.loadClass( StartupReportConfiguration.class.getName() ); testRequest = surefireClassLoader.loadClass( TestRequest.class.getName() ); testArtifactInfo = surefireClassLoader.loadClass( TestArtifactInfo.class.getName() ); testArtifactInfoAware = surefireClassLoader.loadClass( TestArtifactInfoAware.class.getName() ); @@ -199,24 +193,6 @@ public class SurefireReflector reporterConfiguration.isTrimStackTrace()} ); } - Object createStartupReportConfiguration( StartupReportConfiguration reporterConfiguration ) - { - Constructor constructor = ReflectionUtils.getConstructor( this.startupReportConfiguration, - new Class[]{ boolean.class, boolean.class, - String.class, boolean.class, boolean.class, - File.class, boolean.class, String.class } ); - //noinspection BooleanConstructorCall - final Object[] params = - { new Boolean( reporterConfiguration.isUseFile() ), new Boolean( reporterConfiguration.isPrintSummary() ), - reporterConfiguration.getReportFormat(), - new Boolean( reporterConfiguration.isRedirectTestOutputToFile() ), - new Boolean( reporterConfiguration.isDisableXmlReport() ), - reporterConfiguration.getReportsDirectory(), - new Boolean( reporterConfiguration.isTrimStackTrace()), - reporterConfiguration.getReportNameSuffix()}; - return ReflectionUtils.newInstance( constructor, params ); - } - public Object createForkingReporterFactory( Boolean trimStackTrace, PrintStream originalSystemOut ) { Class[] args = new Class[]{ Boolean.class, PrintStream.class }; @@ -225,21 +201,12 @@ public class SurefireReflector surefireClassLoader ); } - public Object createReportingReporterFactory( StartupReportConfiguration startupReportConfiguration ) - { - Class[] args = - new Class[]{ this.startupReportConfiguration }; - Object src = createStartupReportConfiguration( startupReportConfiguration ); - Object[] params = new Object[]{ src }; - return ReflectionUtils.instantiateObject( FileReporterFactory.class.getName(), args, params, - surefireClassLoader ); - - } - - public Object createBooterConfiguration( ClassLoader surefireClassLoader, Object factoryInstance ) + public Object createBooterConfiguration( ClassLoader surefireClassLoader, Object factoryInstance, + boolean insideFork ) { - return ReflectionUtils.instantiateOneArg( surefireClassLoader, BaseProviderFactory.class.getName(), - reporterFactory, factoryInstance ); + return ReflectionUtils.instantiateTwoArgs( surefireClassLoader, BaseProviderFactory.class.getName(), + reporterFactory, factoryInstance, Boolean.class, + insideFork ? Boolean.TRUE : Boolean.FALSE ); } public Object instantiateProvider( String providerClassName, Object booterParameters ) Modified: maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/ReflectionUtils.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/ReflectionUtils.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/ReflectionUtils.java (original) +++ maven/surefire/trunk/surefire-api/src/main/java/org/apache/maven/surefire/util/ReflectionUtils.java Sun Nov 20 22:22:25 2011 @@ -142,7 +142,31 @@ public class ReflectionUtils throw new SurefireReflectionException( e ); } } + public static Object instantiateTwoArgs( ClassLoader classLoader, String className, Class param1Class, + Object param1, Class param2Class, Object param2 ) + { + try + { + Class aClass = loadClass( classLoader, className ); + Constructor constructor = ReflectionUtils.getConstructor( aClass, new Class[]{ param1Class, param2Class } ); + return constructor.newInstance( new Object[]{ param1, param2 } ); + } + catch ( InvocationTargetException e ) + { + throw new SurefireReflectionException( e ); + } + catch ( InstantiationException e ) + { + throw new SurefireReflectionException( e ); + } + catch ( IllegalAccessException e ) + { + throw new SurefireReflectionException( e ); + } + } + + public static void invokeSetter( Object o, String name, Class value1clazz, Object value ) { Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProviderFactory.java Sun Nov 20 22:22:25 2011 @@ -63,14 +63,15 @@ public class ProviderFactory this.reporterManagerFactory = reporterManagerFactory; } - public SurefireProvider createProvider() + public SurefireProvider createProvider(boolean isInsideFork) { ClassLoader context = java.lang.Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader( surefireClassLoader ); StartupConfiguration starterConfiguration = startupConfiguration; - final Object o = surefireReflector.createBooterConfiguration( surefireClassLoader, reporterManagerFactory ); + final Object o = surefireReflector.createBooterConfiguration( surefireClassLoader, reporterManagerFactory, + isInsideFork ); surefireReflector.setTestSuiteDefinitionAware( o, providerConfiguration.getTestSuiteDefinition() ); surefireReflector.setProviderPropertiesAware( o, providerConfiguration.getProviderProperties() ); surefireReflector.setReporterConfigurationAware( o, providerConfiguration.getReporterConfiguration() ); Copied: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StarterCommon.java (from r1203992, maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java) URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StarterCommon.java?p2=maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StarterCommon.java&p1=maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java&r1=1203992&r2=1204285&rev=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/StarterCommon.java Sun Nov 20 22:22:25 2011 @@ -25,7 +25,6 @@ import org.apache.maven.surefire.report. import org.apache.maven.surefire.suite.RunResult; import org.apache.maven.surefire.testset.TestSetFailedException; import org.apache.maven.surefire.util.NestedRuntimeException; -import org.apache.maven.surefire.util.ReflectionUtils; /** * Invokes surefire with the correct classloader setup. @@ -40,7 +39,7 @@ import org.apache.maven.surefire.util.Re * @author Kristian Rosenvold * @version $Id$ */ -public class SurefireStarter +public class StarterCommon { private final ProviderConfiguration providerConfiguration; @@ -48,82 +47,13 @@ public class SurefireStarter private final static String SUREFIRE_TEST_CLASSPATH = "surefire.test.class.path"; - private final StartupReportConfiguration startupReportConfiguration; - - public SurefireStarter( StartupConfiguration startupConfiguration, ProviderConfiguration providerConfiguration, - StartupReportConfiguration startupReportConfiguration ) + public StarterCommon( StartupConfiguration startupConfiguration, ProviderConfiguration providerConfiguration ) { this.providerConfiguration = providerConfiguration; this.startupConfiguration = startupConfiguration; - this.startupReportConfiguration = startupReportConfiguration; - } - - public RunResult runSuitesInProcessWhenForked( TypeEncodedValue testSet ) - throws SurefireExecutionException - { - writeSurefireTestClasspathProperty(); - final ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); - - // todo: Find out.... - // Why is the classloader structure created differently when a testSet is specified ? - // Smells like a legacy bug. Need to check issue tracker. - ClassLoader testsClassLoader = classpathConfiguration.createTestClassLoaderConditionallySystem( - startupConfiguration.useSystemClassLoader() ); - - ClassLoader surefireClassLoader = classpathConfiguration.createSurefireClassLoader( testsClassLoader ); - - SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); - - final Object forkingReporterFactory = createForkingReporterFactory( surefireReflector ); - - Object test = testSet.getDecodedValue(); - - return invokeProvider( test, testsClassLoader, surefireClassLoader, forkingReporterFactory ); - } - - private Object createForkingReporterFactory( SurefireReflector surefireReflector ) - { - final Boolean trimStackTrace = this.providerConfiguration.getReporterConfiguration().isTrimStackTrace(); - final PrintStream originalSystemOut = - this.providerConfiguration.getReporterConfiguration().getOriginalSystemOut(); - return surefireReflector.createForkingReporterFactory( trimStackTrace, originalSystemOut ); - } - - // todo: Fix duplication in this method and runSuitesInProcess - // This should be fixed "at a higher level", because this whole way - // of organizing the code stinks. - - public RunResult runSuitesInProcessWhenForked() - throws SurefireExecutionException - { - ClassLoader testsClassLoader = createInProcessTestClassLoader(); - - ClassLoader surefireClassLoader = createSurefireClassloader( testsClassLoader ); - - SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); - - final Object factory = createForkingReporterFactory( surefireReflector ); - - return invokeProvider( null, testsClassLoader, surefireClassLoader, factory ); - } - - public RunResult runSuitesInProcess() - throws SurefireExecutionException - { - // The test classloader must be constructed first to avoid issues with commons-logging until we properly - // separate the TestNG classloader - ClassLoader testsClassLoader = createInProcessTestClassLoader(); - - ClassLoader surefireClassLoader = createSurefireClassloader( testsClassLoader ); - - SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); - - final Object factory = surefireReflector.createReportingReporterFactory( startupReportConfiguration ); - - return invokeProvider( null, testsClassLoader, surefireClassLoader, factory ); } - private ClassLoader createSurefireClassloader( ClassLoader testsClassLoader ) + public ClassLoader createSurefireClassloader( ClassLoader testsClassLoader ) throws SurefireExecutionException { final ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); @@ -131,7 +61,7 @@ public class SurefireStarter return classpathConfiguration.createSurefireClassLoader( testsClassLoader ); } - private ClassLoader createInProcessTestClassLoader() + public ClassLoader createInProcessTestClassLoader() throws SurefireExecutionException { writeSurefireTestClasspathProperty(); @@ -151,14 +81,14 @@ public class SurefireStarter } } - private void writeSurefireTestClasspathProperty() + public void writeSurefireTestClasspathProperty() { ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); classpathConfiguration.getTestClasspath().writeToSystemProperty( SUREFIRE_TEST_CLASSPATH ); } - private RunResult invokeProvider( Object testSet, ClassLoader testsClassLoader, ClassLoader surefireClassLoader, - Object factory ) + public RunResult invokeProvider( Object testSet, ClassLoader testsClassLoader, ClassLoader surefireClassLoader, + Object factory, boolean insideFork ) { final PrintStream orgSystemOut = System.out; final PrintStream orgSystemErr = System.err; @@ -168,7 +98,7 @@ public class SurefireStarter ProviderFactory providerFactory = new ProviderFactory( startupConfiguration, providerConfiguration, surefireClassLoader, testsClassLoader, factory ); - final SurefireProvider provider = providerFactory.createProvider(); + final SurefireProvider provider = providerFactory.createProvider( insideFork ); try { Modified: maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java (original) +++ maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireStarter.java Sun Nov 20 22:22:25 2011 @@ -20,15 +20,10 @@ package org.apache.maven.surefire.booter */ import java.io.PrintStream; -import org.apache.maven.surefire.providerapi.SurefireProvider; -import org.apache.maven.surefire.report.ReporterException; import org.apache.maven.surefire.suite.RunResult; -import org.apache.maven.surefire.testset.TestSetFailedException; -import org.apache.maven.surefire.util.NestedRuntimeException; -import org.apache.maven.surefire.util.ReflectionUtils; /** - * Invokes surefire with the correct classloader setup. + * Invokes surefire with the correct classloader setup. This class covers all startups in forked VM's. * <p/> * This part of the booter is always guaranteed to be in the * same vm as the tests will be run in. @@ -46,22 +41,20 @@ public class SurefireStarter private final StartupConfiguration startupConfiguration; - private final static String SUREFIRE_TEST_CLASSPATH = "surefire.test.class.path"; - - private final StartupReportConfiguration startupReportConfiguration; + private final StarterCommon starterCommon; public SurefireStarter( StartupConfiguration startupConfiguration, ProviderConfiguration providerConfiguration, StartupReportConfiguration startupReportConfiguration ) { this.providerConfiguration = providerConfiguration; this.startupConfiguration = startupConfiguration; - this.startupReportConfiguration = startupReportConfiguration; + this.starterCommon = new StarterCommon( startupConfiguration, providerConfiguration ); } public RunResult runSuitesInProcessWhenForked( TypeEncodedValue testSet ) throws SurefireExecutionException { - writeSurefireTestClasspathProperty(); + starterCommon.writeSurefireTestClasspathProperty(); final ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); // todo: Find out.... @@ -78,7 +71,7 @@ public class SurefireStarter Object test = testSet.getDecodedValue(); - return invokeProvider( test, testsClassLoader, surefireClassLoader, forkingReporterFactory ); + return starterCommon.invokeProvider( test, testsClassLoader, surefireClassLoader, forkingReporterFactory, true ); } private Object createForkingReporterFactory( SurefireReflector surefireReflector ) @@ -96,99 +89,15 @@ public class SurefireStarter public RunResult runSuitesInProcessWhenForked() throws SurefireExecutionException { - ClassLoader testsClassLoader = createInProcessTestClassLoader(); + ClassLoader testsClassLoader = starterCommon.createInProcessTestClassLoader(); - ClassLoader surefireClassLoader = createSurefireClassloader( testsClassLoader ); + ClassLoader surefireClassLoader = starterCommon.createSurefireClassloader( testsClassLoader ); SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); final Object factory = createForkingReporterFactory( surefireReflector ); - return invokeProvider( null, testsClassLoader, surefireClassLoader, factory ); + return starterCommon.invokeProvider( null, testsClassLoader, surefireClassLoader, factory, true ); } - public RunResult runSuitesInProcess() - throws SurefireExecutionException - { - // The test classloader must be constructed first to avoid issues with commons-logging until we properly - // separate the TestNG classloader - ClassLoader testsClassLoader = createInProcessTestClassLoader(); - - ClassLoader surefireClassLoader = createSurefireClassloader( testsClassLoader ); - - SurefireReflector surefireReflector = new SurefireReflector( surefireClassLoader ); - - final Object factory = surefireReflector.createReportingReporterFactory( startupReportConfiguration ); - - return invokeProvider( null, testsClassLoader, surefireClassLoader, factory ); - } - - private ClassLoader createSurefireClassloader( ClassLoader testsClassLoader ) - throws SurefireExecutionException - { - final ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); - - return classpathConfiguration.createSurefireClassLoader( testsClassLoader ); - } - - private ClassLoader createInProcessTestClassLoader() - throws SurefireExecutionException - { - writeSurefireTestClasspathProperty(); - ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); - if ( startupConfiguration.isManifestOnlyJarRequestedAndUsable() ) - { - ClassLoader testsClassLoader = getClass().getClassLoader(); // ClassLoader.getSystemClassLoader() - // SUREFIRE-459, trick the app under test into thinking its classpath was conventional - // (instead of a single manifest-only jar) - System.setProperty( "surefire.real.class.path", System.getProperty( "java.class.path" ) ); - classpathConfiguration.getTestClasspath().writeToSystemProperty( "java.class.path" ); - return testsClassLoader; - } - else - { - return classpathConfiguration.createTestClassLoader(); - } - } - - private void writeSurefireTestClasspathProperty() - { - ClasspathConfiguration classpathConfiguration = startupConfiguration.getClasspathConfiguration(); - classpathConfiguration.getTestClasspath().writeToSystemProperty( SUREFIRE_TEST_CLASSPATH ); - } - - private RunResult invokeProvider( Object testSet, ClassLoader testsClassLoader, ClassLoader surefireClassLoader, - Object factory ) - { - final PrintStream orgSystemOut = System.out; - final PrintStream orgSystemErr = System.err; - // Note that System.out/System.err are also read in the "ReporterConfiguration" instatiation - // in createProvider below. These are the same values as here. - - ProviderFactory providerFactory = - new ProviderFactory( startupConfiguration, providerConfiguration, surefireClassLoader, testsClassLoader, - factory ); - final SurefireProvider provider = providerFactory.createProvider(); - - try - { - return provider.invoke( testSet ); - } - catch ( TestSetFailedException e ) - { - throw new NestedRuntimeException( e ); - } - catch ( ReporterException e ) - { - throw new NestedRuntimeException( e ); - } - finally - { - if ( System.getSecurityManager() == null ) - { - System.setOut( orgSystemOut ); - System.setErr( orgSystemErr ); - } - } - } } Modified: maven/surefire/trunk/surefire-providers/surefire-junit4/src/test/java/org/apache/maven/surefire/junit4/JUnit4ProviderTest.java URL: http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-providers/surefire-junit4/src/test/java/org/apache/maven/surefire/junit4/JUnit4ProviderTest.java?rev=1204285&r1=1204284&r2=1204285&view=diff ============================================================================== --- maven/surefire/trunk/surefire-providers/surefire-junit4/src/test/java/org/apache/maven/surefire/junit4/JUnit4ProviderTest.java (original) +++ maven/surefire/trunk/surefire-providers/surefire-junit4/src/test/java/org/apache/maven/surefire/junit4/JUnit4ProviderTest.java Sun Nov 20 22:22:25 2011 @@ -32,7 +32,7 @@ public class JUnit4ProviderTest extends TestCase { public void testCreateProvider(){ - BaseProviderFactory providerParameters = new BaseProviderFactory(null); + BaseProviderFactory providerParameters = new BaseProviderFactory(null, Boolean.TRUE); providerParameters.setProviderProperties( new Properties() ); providerParameters.setClassLoaders( this.getClass().getClassLoader(), this.getClass().getClassLoader() ); providerParameters.setTestRequest( new TestRequest( null, null, null ) );