blob: dd8950d20392fe9ab4fd953d17deb2076bdf123d [file] [log] [blame]
package org.apache.maven.plugin.failsafe;
/*
* 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.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.failsafe.util.FailsafeSummaryXmlUtils;
import org.apache.maven.plugin.surefire.SurefireHelper;
import org.apache.maven.plugin.surefire.SurefireReportParameters;
import org.apache.maven.plugin.surefire.log.PluginConsoleLogger;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.surefire.api.cli.CommandLineOption;
import org.apache.maven.surefire.api.suite.RunResult;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.Collection;
import static org.apache.maven.plugin.surefire.SurefireHelper.reportExecution;
import static org.apache.maven.surefire.shared.utils.StringUtils.capitalizeFirstLetter;
import static org.apache.maven.surefire.api.suite.RunResult.noTestsRun;
/**
* Verify integration tests ran using Surefire.
*
* @author Stephen Connolly
* @author Jason van Zyl
*/
@SuppressWarnings( "unused" )
@Mojo( name = "verify", defaultPhase = LifecyclePhase.VERIFY, requiresProject = true, threadSafe = true )
public class VerifyMojo
extends AbstractMojo
implements SurefireReportParameters
{
/**
* 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" )
private boolean skipTests;
/**
* Set this to 'true' to skip running integration tests, but still compile them. Its use is NOT RECOMMENDED, but
* quite convenient on occasion.
*
* @since 2.4.3-alpha-2
*/
@Parameter( property = "skipITs" )
private boolean skipITs;
/**
* This old parameter is just like skipTests, but bound to the old property maven.test.skip.exec.
*
* @since 2.3
* @deprecated Use -DskipTests instead.
*/
@Deprecated
@Parameter( property = "maven.test.skip.exec" )
private 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" )
private boolean skip;
/**
* Set this to true to ignore a failure during testing. Its use is NOT RECOMMENDED, but quite convenient on
* occasion.
*/
@Parameter( property = "maven.test.failure.ignore", defaultValue = "false" )
private boolean testFailureIgnore;
/**
* The base directory of the project being tested. This can be obtained in your unit test by
* System.getProperty("basedir").
*/
@Parameter( defaultValue = "${basedir}" )
private File basedir;
/**
* The directory containing generated test classes of the project being tested.
* This will be included at the beginning the test classpath.
*/
@Parameter( defaultValue = "${project.build.testOutputDirectory}" )
private File testClassesDirectory;
/**
* Base directory where all reports are written to.
*/
@Parameter( defaultValue = "${project.build.directory}/failsafe-reports" )
private File reportsDirectory;
/**
* The summary file to read integration test results from.
*/
@Parameter( defaultValue = "${project.build.directory}/failsafe-reports/failsafe-summary.xml", required = true )
private File summaryFile;
/**
* Additional summary files to read integration test results from.
* @since 2.6
*/
@Parameter
private File[] summaryFiles;
/**
* Set this to "true" to cause a failure if there are no tests to run.
*
* @since 2.4
*/
@Parameter( property = "failIfNoTests" )
private Boolean failIfNoTests;
/**
* The character encoding scheme to be applied.
* Deprecated since 2.20.1 and used encoding UTF-8 in <tt>failsafe-summary.xml</tt>.
*
* @deprecated since of 2.20.1
*/
@Parameter( property = "encoding", defaultValue = "${project.reporting.outputEncoding}" )
private String encoding;
/**
* The current build session instance.
*/
@Parameter( defaultValue = "${session}", readonly = true )
private MavenSession session;
@Component
private Logger logger;
private Collection<CommandLineOption> cli;
private volatile PluginConsoleLogger consoleLogger;
@Override
public void execute()
throws MojoExecutionException, MojoFailureException
{
cli = commandLineOptions();
if ( verifyParameters() )
{
logDebugOrCliShowErrors( capitalizeFirstLetter( getPluginName() )
+ " report directory: " + getReportsDirectory() );
RunResult summary;
try
{
summary = existsSummaryFile() ? readSummary( summaryFile ) : noTestsRun();
if ( existsSummaryFiles() )
{
for ( final File summaryFile : summaryFiles )
{
summary = summary.aggregate( readSummary( summaryFile ) );
}
}
}
catch ( Exception e )
{
throw new MojoExecutionException( e.getMessage(), e );
}
reportExecution( this, summary, getConsoleLogger(), null );
}
}
private PluginConsoleLogger getConsoleLogger()
{
if ( consoleLogger == null )
{
synchronized ( this )
{
if ( consoleLogger == null )
{
consoleLogger = new PluginConsoleLogger( logger );
}
}
}
return consoleLogger;
}
private RunResult readSummary( File summaryFile ) throws Exception
{
return FailsafeSummaryXmlUtils.toRunResult( summaryFile );
}
protected boolean verifyParameters()
throws MojoFailureException
{
if ( isSkip() || isSkipTests() || isSkipITs() || isSkipExec() )
{
getConsoleLogger().info( "Tests are skipped." );
return false;
}
if ( !getTestClassesDirectory().exists() )
{
if ( getFailIfNoTests() != null && getFailIfNoTests() )
{
throw new MojoFailureException( "No tests to run!" );
}
}
if ( !existsSummary() )
{
getConsoleLogger().info( "No tests to run." );
return false;
}
return true;
}
protected String getPluginName()
{
return "failsafe";
}
protected String[] getDefaultIncludes()
{
return null;
}
@Override
public boolean isSkipTests()
{
return skipTests;
}
@Override
public void setSkipTests( boolean skipTests )
{
this.skipTests = skipTests;
}
public boolean isSkipITs()
{
return skipITs;
}
public void setSkipITs( boolean skipITs )
{
this.skipITs = skipITs;
}
@Override
@Deprecated
public boolean isSkipExec()
{
return skipExec;
}
@Override
@Deprecated
public void setSkipExec( boolean skipExec )
{
this.skipExec = skipExec;
}
@Override
public boolean isSkip()
{
return skip;
}
@Override
public void setSkip( boolean skip )
{
this.skip = skip;
}
@Override
public boolean isTestFailureIgnore()
{
return testFailureIgnore;
}
@Override
public void setTestFailureIgnore( boolean testFailureIgnore )
{
this.testFailureIgnore = testFailureIgnore;
}
@Override
public File getBasedir()
{
return basedir;
}
@Override
public void setBasedir( File basedir )
{
this.basedir = basedir;
}
@Override
public File getTestClassesDirectory()
{
return testClassesDirectory;
}
@Override
public void setTestClassesDirectory( File testClassesDirectory )
{
this.testClassesDirectory = testClassesDirectory;
}
@Override
public File getReportsDirectory()
{
return reportsDirectory;
}
@Override
public void setReportsDirectory( File reportsDirectory )
{
this.reportsDirectory = reportsDirectory;
}
@Override
public Boolean getFailIfNoTests()
{
return failIfNoTests;
}
@Override
public void setFailIfNoTests( boolean failIfNoTests )
{
this.failIfNoTests = failIfNoTests;
}
private boolean existsSummaryFile()
{
return summaryFile != null && summaryFile.isFile();
}
private boolean existsSummaryFiles()
{
return summaryFiles != null && summaryFiles.length != 0;
}
private boolean existsSummary()
{
return existsSummaryFile() || existsSummaryFiles();
}
private Collection<CommandLineOption> commandLineOptions()
{
return SurefireHelper.commandLineOptions( session, getConsoleLogger() );
}
private void logDebugOrCliShowErrors( String s )
{
SurefireHelper.logDebugOrCliShowErrors( s, getConsoleLogger(), cli );
}
}