Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
// CHECKSTYLE_OFF: FileLength|RegexpHeader
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.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugin.surefire.booterclient.ChecksumCalculator;
import org.apache.maven.plugin.surefire.booterclient.ForkConfiguration;
import org.apache.maven.plugin.surefire.booterclient.ForkStarter;
import org.apache.maven.plugin.surefire.util.DependencyScanner;
import org.apache.maven.plugin.surefire.util.DirectoryScanner;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter;
import org.apache.maven.shared.utils.StringUtils;
import org.apache.maven.shared.utils.io.FileUtils;
import org.apache.maven.surefire.booter.ClassLoaderConfiguration;
import org.apache.maven.surefire.booter.Classpath;
import org.apache.maven.surefire.booter.ClasspathConfiguration;
import org.apache.maven.surefire.booter.KeyValueSource;
import org.apache.maven.surefire.booter.ProviderConfiguration;
import org.apache.maven.surefire.booter.ProviderParameterNames;
import org.apache.maven.surefire.booter.StartupConfiguration;
import org.apache.maven.surefire.booter.SurefireBooterForkException;
import org.apache.maven.surefire.booter.SurefireExecutionException;
import org.apache.maven.surefire.report.ReporterConfiguration;
import org.apache.maven.surefire.suite.RunResult;
import org.apache.maven.surefire.testset.DirectoryScannerParameters;
import org.apache.maven.surefire.testset.RunOrderParameters;
import org.apache.maven.surefire.testset.TestArtifactInfo;
import org.apache.maven.surefire.testset.TestRequest;
import org.apache.maven.surefire.testset.TestSetFailedException;
import org.apache.maven.surefire.util.DefaultScanResult;
import org.apache.maven.surefire.util.RunOrder;
import org.apache.maven.toolchain.Toolchain;
import org.apache.maven.toolchain.ToolchainManager;
import javax.annotation.Nonnull;
/**
* Abstract base class for running tests using Surefire.
*
* @author Stephen Connolly
* @version $Id: SurefirePlugin.java 945065 2010-05-17 10:26:22Z stephenc $
*/
public abstract class AbstractSurefireMojo
extends AbstractMojo
implements SurefireExecutionParameters
{
// common mojo parameters
/**
* Information about this plugin, mainly used to lookup this plugin's configuration from the currently executing
* project.
*
* @since 2.12
*/
@Parameter( defaultValue = "${plugin}", readonly = true )
protected PluginDescriptor pluginDescriptor;
/**
* Set this to "true" to skip running tests, but still compile them. Its use is NOT RECOMMENDED, but quite
* convenient on occasion.
*
* @since 2.4
*/
@Parameter( property = "skipTests", defaultValue = "false" )
protected boolean skipTests;
/**
* This old parameter is just like skipTests, but bound to the old property "maven.test.skip.exec".
*
* @since 2.3
* @deprecated Use skipTests instead.
*/
@Parameter( property = "maven.test.skip.exec" )
protected boolean skipExec;
/**
* Set this to "true" to bypass unit tests entirely. Its use is NOT RECOMMENDED, especially if you enable it using
* the "maven.test.skip" property, because maven.test.skip disables both running the tests and compiling the tests.
* Consider using the skipTests parameter instead.
*/
@Parameter( property = "maven.test.skip", defaultValue = "false" )
protected boolean skip;
/**
* The Maven Project Object.
*/
@Component
protected MavenProject project;
/**
* The base directory of the project being tested. This can be obtained in your integration test via
* System.getProperty("basedir").
*/
@Parameter( defaultValue = "${basedir}" )
protected File basedir;
/**
* The directory containing generated test classes of the project being tested. This will be included at the
* beginning of the test classpath. *
*/
@Parameter( defaultValue = "${project.build.testOutputDirectory}" )
protected File testClassesDirectory;
/**
* The directory containing generated classes of the project being tested. This will be included after the test
* classes in the test classpath.
*/
@Parameter( defaultValue = "${project.build.outputDirectory}" )
protected File classesDirectory;
/**
* List of dependencies to exclude from the test classpath. Each dependency string must follow the format
* groupId:artifactId. For example: org.acme:project-a
*
* @since 2.6
*/
@Parameter( property = "maven.test.dependency.excludes" )
private String[] classpathDependencyExcludes;
/**
* A dependency scope to exclude from the test classpath. The scope should be one of the scopes defined by
* org.apache.maven.artifact.Artifact. This includes the following:
*
*
*
* @since 2.6
*/
@Parameter( defaultValue = "" )
private String classpathDependencyScopeExclude;
/**
* Additional elements to be appended to the classpath.
*
* @since 2.4
*/
@Parameter( property = "maven.test.additionalClasspath" )
private String[] additionalClasspathElements;
/**
* The test source directory containing test class sources.
*
* @since 2.2
*/
@Parameter( defaultValue = "${project.build.testSourceDirectory}", required = true )
protected File testSourceDirectory;
/**
* A file containing include patterns. Blank lines, or lines starting with # are ignored. If {@code includes} are
* also specified these patterns are appended.
*/
@Parameter
protected File includesFile;
/**
* A list of <exclude> elements specifying the tests (by pattern) that should be excluded in testing. When not
* specified and when the test parameter is not specified, the default excludes will be
* <excludes>
* <exclude>**/*$*</exclude>
* </excludes>
* (which excludes all inner classes).
* This parameter is ignored if the TestNG suiteXmlFiles parameter is specified.
*
* Each exclude item may also contain a comma-separated sublist of items, which will be treated as multiple
* <exclude> entries.
*
* Notice that these values are relative to the directory containing generated test classes of the project
* being tested. This directory is declared by the parameter testClassesDirectory which defaults
* to the POM property ${project.build.testOutputDirectory}, typically src/test/java
* unless overridden.
*/
@Parameter
protected List excludes;
/**
* A file containing exclude patterns. Blank lines, or lines starting with # are ignored. If {@code excludes} are
* also specified these patterns are appended.
*/
@Parameter
protected File excludesFile;
/**
* ArtifactRepository of the localRepository. To obtain the directory of localRepository in unit tests use
* System.getProperty("localRepository").
*/
@Parameter( defaultValue = "${localRepository}", required = true, readonly = true )
protected ArtifactRepository localRepository;
/**
* List of System properties to pass to the JUnit tests.
*
* @deprecated Use systemPropertyVariables instead.
*/
@Parameter
protected Properties systemProperties;
/**
* List of System properties to pass to the JUnit tests.
*
* @since 2.5
*/
@Parameter
protected Map systemPropertyVariables;
/**
* List of System properties, loaded from a file, to pass to the JUnit tests.
*
* @since 2.8.2
*/
@Parameter
protected File systemPropertiesFile;
/**
* List of properties for configuring all TestNG related configurations. This is the new preferred method of
* configuring TestNG.
*
* @since 2.4
*/
@Parameter
protected Properties properties;
/**
* Map of plugin artifacts.
*/
// olamy: would make more sense using defaultValue but doesn't work with maven 2.x
@Parameter( property = "plugin.artifactMap", required = true, readonly = true )
protected Map pluginArtifactMap;
/**
* Map of project artifacts.
*/
// olamy: would make more sense using defaultValue but doesn't work with maven 2.x
@Parameter( property = "project.artifactMap", readonly = true, required = true )
protected Map projectArtifactMap;
/**
* Add custom text into report filename: TEST-testClassName-reportNameSuffix.xml,
* testClassName-reportNameSuffix.txt and testClassName-reportNameSuffix-output.txt.
* File TEST-testClassName-reportNameSuffix.xml has changed attributes 'testsuite'--'name'
* and 'testcase'--'classname' - reportNameSuffix is added to the attribute value.
*/
@Parameter( property = "surefire.reportNameSuffix", defaultValue = "" )
protected String reportNameSuffix;
/**
* Set this to "true" to redirect the unit test standard output to a file (found in
* reportsDirectory/testName-output.txt).
*
* @since 2.3
*/
@Parameter( property = "maven.test.redirectTestOutputToFile", defaultValue = "false" )
protected boolean redirectTestOutputToFile;
/**
* Set this to "true" to cause a failure if there are no tests to run. Defaults to "false".
*
* @since 2.4
*/
@Parameter( property = "failIfNoTests" )
protected Boolean failIfNoTests;
/**
* DEPRECATED since version 2.14. Use forkCount and reuseForks instead.
*
*
* Option to specify the forking mode. Can be "never", "once", "always", "perthread". "none" and "pertest" are also
* accepted for backwards compatibility. "always" forks for each test-class. "perthread" will create
* threadCount parallel forks, each executing one test-class. See also parameter
* reuseForks.
*
* @since 2.1
*/
@Parameter( property = "forkMode", defaultValue = "once" )
protected String forkMode;
/**
* Option to specify the jvm (or path to the java executable) to use with the forking options. For the default, the
* jvm will be a new instance of the same VM as the one used to run Maven. JVM settings are not inherited from
* MAVEN_OPTS.
*
* @since 2.1
*/
@Parameter( property = "jvm" )
protected String jvm;
/**
* Arbitrary JVM options to set on the command line.
*
*
* Using an alternate syntax for argLine,
@{...}
allows late replacement of properties when the
* plugin is executed, so properties that have been modified by other plugins will be picked up correctly.
* See the Frequently Asked Questions page with more details:
*
* http://maven.apache.org/surefire/maven-surefire-plugin/faq.html
*
*
* http://maven.apache.org/surefire/maven-failsafe-plugin/faq.html
*
* @since 2.1
*/
@Parameter( property = "argLine" )
protected String argLine;
/**
* Additional environment variables to set on the command line.
*
* @since 2.1.3
*/
@Parameter
protected Map environmentVariables = new HashMap();
/**
* Command line working directory.
*
* @since 2.1.3
*/
@Parameter( property = "basedir" )
protected File workingDirectory;
/**
* When false it makes tests run using the standard classloader delegation instead of the default Maven isolated
* classloader. Only used when forking (forkMode is not "none").
* Setting it to false helps with some problems caused by conflicts between xml parsers in the classpath and the
* Java 5 provider parser.
*
* @since 2.1
*/
@Parameter( property = "childDelegation", defaultValue = "false" )
protected boolean childDelegation;
/**
* (TestNG/JUnit47 provider with JUnit4.8+ only) Groups for this test. Only classes/methods/etc decorated with one
* of the groups specified here will be included in test run, if specified.
* For JUnit, this parameter forces the use of the 4.7 provider
* This parameter is ignored if the suiteXmlFiles parameter is specified.
* Since version 2.18.1 and JUnit 4.12, the @Category annotation type is automatically inherited from
* superclasses, see @java.lang.annotation.Inherited. Make sure that test class inheritance still makes
* sense together with @Category annotation of the JUnit 4.12 or higher appeared in superclass.
*
* @since 2.2
*/
@Parameter( property = "groups" )
protected String groups;
/**
* (TestNG/JUnit47 provider with JUnit4.8+ only) Excluded groups. Any methods/classes/etc with one of the groups
* specified in this list will specifically not be run.
* For JUnit, this parameter forces the use of the 4.7 provider
* This parameter is ignored if the suiteXmlFiles parameter is specified.
* Since version 2.18.1 and JUnit 4.12, the @Category annotation type is automatically inherited from
* superclasses, see @java.lang.annotation.Inherited. Make sure that test class inheritance still makes
* sense together with @Category annotation of the JUnit 4.12 or higher appeared in superclass.
*
* @since 2.2
*/
@Parameter( property = "excludedGroups" )
protected String excludedGroups;
/**
* Allows you to specify the name of the JUnit artifact. If not set, junit:junit will be used.
*
* @since 2.3.1
*/
@Parameter( property = "junitArtifactName", defaultValue = "junit:junit" )
protected String junitArtifactName;
/**
* Allows you to specify the name of the TestNG artifact. If not set, org.testng:testng will be used.
*
* @since 2.3.1
*/
@Parameter( property = "testNGArtifactName", defaultValue = "org.testng:testng" )
protected String testNGArtifactName;
/**
* (TestNG/JUnit 4.7 provider) The attribute thread-count allows you to specify how many threads should be
* allocated for this execution. Only makes sense to use in conjunction with the parallel parameter.
*
* @since 2.2
*/
@Parameter( property = "threadCount" )
protected int threadCount;
/**
* Option to specify the number of VMs to fork in parallel in order to execute the tests. When terminated with "C",
* the number part is multiplied with the number of CPU cores. Floating point value are only accepted together with
* "C". If set to "0", no VM is forked and all tests are executed within the main process.
*
* Example values: "1.5C", "4"
*
* The system properties and the argLine of the forked processes may contain the place holder string
* ${surefire.forkNumber}, which is replaced with a fixed number for each of the parallel forks,
* ranging from 1 to the effective value of forkCount times the maximum number of parallel
* Surefire executions in maven parallel builds, i.e. the effective value of the -T command line
* argument of maven core.
*
* @since 2.14
*/
@Parameter( property = "forkCount", defaultValue = "1" )
private String forkCount;
/**
* Indicates if forked VMs can be reused. If set to "false", a new VM is forked for each test class to be executed.
* If set to "true", up to forkCount VMs will be forked and then reused to execute all tests.
*
* @since 2.13
*/
@Parameter( property = "reuseForks", defaultValue = "true" )
private boolean reuseForks;
/**
* (JUnit 4.7 provider) Indicates that threadCount, threadCountSuites, threadCountClasses, threadCountMethods
* are per cpu core.
*
* @since 2.5
*/
@Parameter( property = "perCoreThreadCount", defaultValue = "true" )
protected boolean perCoreThreadCount;
/**
* (JUnit 4.7 provider) Indicates that the thread pool will be unlimited. The parallel parameter and
* the actual number of classes/methods will decide. Setting this to "true" effectively disables
* perCoreThreadCount and threadCount. Defaults to "false".
*
* @since 2.5
*/
@Parameter( property = "useUnlimitedThreads", defaultValue = "false" )
protected boolean useUnlimitedThreads;
/**
* (TestNG provider) When you use the parallel attribute, TestNG will try to run all your test methods
* in separate threads, except for methods that depend on each other, which will be run in the same thread in order
* to respect their order of execution.
*
* (JUnit 4.7 provider) Supports values "classes"/"methods"/"both" to run in separate threads, as controlled by
* threadCount.
*
* Since version 2.16 (JUnit 4.7 provider), the value "both" is DEPRECATED.
* Use "classesAndMethods" instead.
*
* Since version 2.16 (JUnit 4.7 provider), additional vales are available
* "suites"/"suitesAndClasses"/"suitesAndMethods"/"classesAndMethods"/"all".
*
* @since 2.2
*/
@Parameter( property = "parallel" )
protected String parallel;
/**
* (JUnit 4.7 / provider only) The thread counts do not exceed the number of parallel suite, class runners and
* average number of methods per class if set to true.
*
* True by default.
*
* @since 2.17
*/
@Parameter( property = "parallelOptimized", defaultValue = "true" )
protected boolean parallelOptimized;
/**
* (JUnit 4.7 provider) This attribute allows you to specify the concurrency in test suites, i.e.:
*
*
number of concurrent suites if threadCount is 0 or unspecified
*
limited suites concurrency if useUnlimitedThreads is set to true
*
if threadCount and certain thread-count parameters are > 0 for parallel, the
* concurrency is computed from ratio. For instance parallel=all and the ratio between
* threadCountSuites:threadCountClasses:threadCountMethods is
* 2:3:5, there is 20% of threadCount in concurrent suites.
*
*
* Only makes sense to use in conjunction with the parallel parameter.
* The default value 0 behaves same as unspecified one.
*
* @since 2.16
*/
@Parameter( property = "threadCountSuites", defaultValue = "0" )
protected int threadCountSuites;
/**
* (JUnit 4.7 provider) This attribute allows you to specify the concurrency in test classes, i.e.:
*
*
number of concurrent classes if threadCount is 0 or unspecified
*
limited classes concurrency if useUnlimitedThreads is set to true
*
if threadCount and certain thread-count parameters are > 0 for parallel, the
* concurrency is computed from ratio. For instance parallel=all and the ratio between
* threadCountSuites:threadCountClasses:threadCountMethods is
* 2:3:5, there is 30% of threadCount in concurrent classes.
*
as in the previous case but without this leaf thread-count. Example: parallel=suitesAndClasses,
* threadCount=16, threadCountSuites=5, threadCountClasses is unspecified leaf, the number of concurrent classes
* is varying from >= 11 to 14 or 15. The threadCountSuites become number of threads.
*
*
*
* Only makes sense to use in conjunction with the parallel parameter.
* The default value 0 behaves same as unspecified one.
*
* @since 2.16
*/
@Parameter( property = "threadCountClasses", defaultValue = "0" )
protected int threadCountClasses;
/**
* (JUnit 4.7 provider) This attribute allows you to specify the concurrency in test methods, i.e.:
*
*
number of concurrent methods if threadCount is 0 or unspecified
*
limited concurrency of methods if useUnlimitedThreads is set to true
*
if threadCount and certain thread-count parameters are > 0 for parallel, the
* concurrency is computed from ratio. For instance parallel=all and the ratio between
* threadCountSuites:threadCountClasses:threadCountMethods is 2:3:5,
* there is 50% of threadCount in concurrent methods.
*
as in the previous case but without this leaf thread-count. Example: parallel=all, threadCount=16,
* threadCountSuites=2, threadCountClasses=3, but threadCountMethods is unspecified leaf, the number of concurrent
* methods is varying from >= 11 to 14 or 15. The threadCountSuites and threadCountClasses become number of
* threads.
*
* Only makes sense to use in conjunction with the parallel parameter. The default value 0
* behaves same as unspecified one.
*
* @since 2.16
*/
@Parameter( property = "threadCountMethods", defaultValue = "0" )
protected int threadCountMethods;
/**
* Whether to trim the stack trace in the reports to just the lines within the test, or show the full trace.
*
* @since 2.2
*/
@Parameter( property = "trimStackTrace", defaultValue = "true" )
protected boolean trimStackTrace;
/**
* Resolves the artifacts needed.
*/
@Component
protected ArtifactResolver artifactResolver;
/**
* Creates the artifact.
*/
@Component
protected ArtifactFactory artifactFactory;
/**
* The remote plugin repositories declared in the POM.
*
* @since 2.2
*/
@Parameter( defaultValue = "${project.pluginArtifactRepositories}" )
protected List remoteRepositories;
/**
* For retrieval of artifact's metadata.
*/
@Component
protected ArtifactMetadataSource metadataSource;
/**
* Flag to disable the generation of report files in xml format.
*
* @since 2.2
*/
@Parameter( property = "disableXmlReport", defaultValue = "false" )
protected boolean disableXmlReport;
/**
* By default, Surefire enables JVM assertions for the execution of your test cases. To disable the assertions, set
* this flag to "false".
*
* @since 2.3.1
*/
@Parameter( property = "enableAssertions", defaultValue = "true" )
protected boolean enableAssertions;
/**
* The current build session instance.
*/
@Component
protected MavenSession session;
/**
* (TestNG only) Define the factory class used to create all test instances.
*
* @since 2.5
*/
@Parameter( property = "objectFactory" )
protected String objectFactory;
/**
*
*/
@Parameter( defaultValue = "${session.parallel}", readonly = true )
protected Boolean parallelMavenExecution;
/**
* List of dependencies to scan for test classes to include in the test run.
* The child elements of this element must be <dependency> elements, and the
* contents of each of these elements must be a string which follows the format:
*
* groupId:artifactId. For example: org.acme:project-a.
*
* @since 2.15
*/
@Parameter( property = "dependenciesToScan" )
private String[] dependenciesToScan;
/**
*
*/
@Component
protected ToolchainManager toolchainManager;
private Artifact surefireBooterArtifact;
private Toolchain toolchain;
private int effectiveForkCount = -1;
/**
* The placeholder that is replaced by the executing thread's running number. The thread number
* range starts with 1
* Deprecated.
*/
public static final String THREAD_NUMBER_PLACEHOLDER = "${surefire.threadNumber}";
/**
* The placeholder that is replaced by the executing fork's running number. The fork number
* range starts with 1
*/
public static final String FORK_NUMBER_PLACEHOLDER = "${surefire.forkNumber}";
protected abstract String getPluginName();
protected abstract int getRerunFailingTestsCount();
private SurefireDependencyResolver dependencyResolver;
public void execute()
throws MojoExecutionException, MojoFailureException
{
// Stuff that should have been final
setupStuff();
if ( verifyParameters() && !hasExecutedBefore() )
{
DefaultScanResult scan = scanForTestClasses();
if ( !isValidSuiteXmlFileConfig() && scan.isEmpty() )
{
if ( getEffectiveFailIfNoTests() )
{
throw new MojoFailureException(
"No tests were executed! (Set -DfailIfNoTests=false to ignore this error.)" );
}
handleSummary( RunResult.noTestsRun(), null );
return;
}
logReportsDirectory();
executeAfterPreconditionsChecked( scan );
}
}
private void setupStuff()
{
createDependencyResolver();
surefireBooterArtifact = getSurefireBooterArtifact();
toolchain = getToolchain();
}
private DefaultScanResult scanForTestClasses()
{
DefaultScanResult scan = scanDirectories();
DefaultScanResult scanDeps = scanDependencies();
return scan.append( scanDeps );
}
private DefaultScanResult scanDirectories()
{
return new DirectoryScanner( getTestClassesDirectory(), getIncludeList(), getExcludeList(),
getSpecificTests() ).scan();
}
private DefaultScanResult scanDependencies()
{
if ( getDependenciesToScan() == null )
{
return null;
}
else
{
try
{
// noinspection unchecked
return new DependencyScanner( DependencyScanner.filter( project.getTestArtifacts(),
Arrays.asList( getDependenciesToScan() ) ),
getIncludeList(), getExcludeList(), getSpecificTests() ).scan();
}
catch ( Exception e )
{
throw new RuntimeException( e );
}
}
}
boolean verifyParameters()
throws MojoFailureException, MojoExecutionException
{
setProperties( new SurefireProperties( getProperties() ) );
if ( isSkipExecution() )
{
getLog().info( "Tests are skipped." );
return false;
}
String jvmToUse = getJvm();
if ( toolchain != null )
{
getLog().info( "Toolchain in maven-" + getPluginName() + "-plugin: " + toolchain );
if ( jvmToUse != null )
{
getLog().warn( "Toolchains are ignored, 'executable' parameter is set to " + jvmToUse );
}
}
if ( !getTestClassesDirectory().exists()
&& ( getDependenciesToScan() == null || getDependenciesToScan().length == 0 ) )
{
if ( Boolean.TRUE.equals( getFailIfNoTests() ) )
{
throw new MojoFailureException( "No tests to run!" );
}
getLog().info( "No tests to run." );
}
else
{
convertDeprecatedForkMode();
ensureWorkingDirectoryExists();
ensureParallelRunningCompatibility();
ensureThreadCountWithPerThread();
warnIfUselessUseSystemClassLoaderParameter();
warnIfDefunctGroupsCombinations();
}
return true;
}
protected abstract boolean isSkipExecution();
protected void executeAfterPreconditionsChecked( DefaultScanResult scanResult )
throws MojoExecutionException, MojoFailureException
{
List providers = createProviders();
RunResult current = RunResult.noTestsRun();
Exception firstForkException = null;
for ( ProviderInfo provider : providers )
{
try
{
current = current.aggregate( executeProvider( provider, scanResult ) );
}
catch ( SurefireBooterForkException e )
{
if ( firstForkException == null )
{
firstForkException = e;
}
}
catch ( SurefireExecutionException e )
{
if ( firstForkException == null )
{
firstForkException = e;
}
}
catch ( TestSetFailedException e )
{
if ( firstForkException == null )
{
firstForkException = e;
}
}
}
if ( firstForkException != null )
{
current = RunResult.failure( current, firstForkException );
}
handleSummary( current, firstForkException );
}
private void createDependencyResolver()
{
dependencyResolver =
new SurefireDependencyResolver( getArtifactResolver(), getArtifactFactory(), getLog(), getLocalRepository(),
getRemoteRepositories(), getMetadataSource(), getPluginName() );
}
protected List createProviders()
throws MojoFailureException, MojoExecutionException
{
final Artifact junitDepArtifact = getJunitDepArtifact();
ProviderList wellKnownProviders =
new ProviderList( new DynamicProviderInfo( null ), new TestNgProviderInfo( getTestNgArtifact() ),
new JUnitCoreProviderInfo( getJunitArtifact(), junitDepArtifact ),
new JUnit4ProviderInfo( getJunitArtifact(), junitDepArtifact ),
new JUnit3ProviderInfo() );
return wellKnownProviders.resolve( getLog() );
}
private SurefireProperties setupProperties()
{
SurefireProperties sysProps = null;
try
{
sysProps = SurefireProperties.loadProperties( systemPropertiesFile );
}
catch ( IOException e )
{
String msg = "The system property file '" + systemPropertiesFile.getAbsolutePath() + "' can't be read.";
if ( getLog().isDebugEnabled() )
{
getLog().warn( msg, e );
}
else
{
getLog().warn( msg );
}
}
SurefireProperties result =
SurefireProperties.calculateEffectiveProperties( getSystemProperties(), getSystemPropertyVariables(),
getUserProperties(), sysProps );
result.setProperty( "basedir", getBasedir().getAbsolutePath() );
result.setProperty( "user.dir", getWorkingDirectory().getAbsolutePath() );
result.setProperty( "localRepository", getLocalRepository().getBasedir() );
if ( isForking() )
{
for ( Object o : result.propertiesThatCannotBeSetASystemProperties() )
{
if ( getArgLine() == null || !getArgLine().contains( "-D" + o + "=" ) )
{
getLog().warn( o + " cannot be set as system property, use -D"
+ o + "=... instead" );
}
}
for ( Object systemPropertyMatchingArgLine : systemPropertiesMatchingArgLine( result ) )
{
getLog().warn( "The system property " + systemPropertyMatchingArgLine + " is configured twice! "
+ "The property appears in and any of , "
+ " or user property." );
}
}
if ( getLog().isDebugEnabled() )
{
showToLog( result, getLog(), "system property" );
}
return result;
}
private Set