blob: 03421725b4dc31c22bf7910a51aa267bb9419050 [file] [log] [blame]
package org.apache.maven.surefire.its.fixture;
/*
* 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.it.VerificationException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.apache.commons.lang3.StringUtils.isBlank;
/**
* Encapsulate all needed features to start a surefire run
* <br>
* Also includes thread-safe access to the extracted resource
* files
*
* @author Kristian Rosenvold -
*/
public final class SurefireLauncher
{
public static final String EXT_JDK_HOME_KEY = "jdk.home";
public static final String EXT_JDK_HOME = System.getProperty( EXT_JDK_HOME_KEY );
private static final File JAVA_HOME = javaHome();
private final MavenLauncher mavenLauncher;
private final String surefireVersion = System.getProperty( "surefire.version" );
public SurefireLauncher( MavenLauncher mavenLauncher )
{
this.mavenLauncher = mavenLauncher;
reset();
}
public MavenLauncher maven()
{
return mavenLauncher;
}
String getTestMethodName()
{
return mavenLauncher.getTestMethodName();
}
public void reset()
{
mavenLauncher.reset();
for ( String s : getInitialGoals() )
{
mavenLauncher.addGoal( s );
}
setInProcessJavaHome();
}
private static File javaHome()
{
String javaHome = isBlank( EXT_JDK_HOME ) ? System.getenv( "JAVA_HOME" ) : EXT_JDK_HOME;
if ( isBlank( javaHome ) )
{
javaHome = System.getProperty( "java.home" );
File jre = new File( javaHome );
if ( "jre".equals( jre.getName() ) )
{
javaHome = jre.getParent();
}
}
try
{
File javaHomeAsDir = new File( javaHome ).getCanonicalFile();
if ( !javaHomeAsDir.isDirectory() )
{
throw new RuntimeException( javaHomeAsDir.getAbsolutePath() + " is not a JAVA_HOME directory." );
}
System.out.println( "Using JAVA_HOME=" + javaHomeAsDir.getAbsolutePath() + " in forked launcher." );
return javaHomeAsDir;
}
catch ( IOException e )
{
throw new RuntimeException( e );
}
}
private void setInProcessJavaHome()
{
setLauncherJavaHome( JAVA_HOME.getPath() );
}
public SurefireLauncher setLauncherJavaHome( String javaHome )
{
mavenLauncher.addEnvVar( "JAVA_HOME", javaHome );
return this;
}
public SurefireLauncher getSubProjectLauncher( String subProject )
{
return new SurefireLauncher( mavenLauncher.getSubProjectLauncher( subProject ) );
}
public OutputValidator getSubProjectValidator( String subProject )
throws VerificationException
{
return mavenLauncher.getSubProjectValidator( subProject );
}
private SurefireLauncher addEnvVar( String key, String value )
{
mavenLauncher.addEnvVar( key, value );
return this;
}
public SurefireLauncher setMavenOpts( String opts )
{
return addEnvVar( "MAVEN_OPTS", opts );
}
private List<String> getInitialGoals()
{
List<String> goals = new ArrayList<>();
goals.add( "-Dsurefire.version=" + surefireVersion );
String jacocoAgent = System.getProperty( "jacoco.agent", "" );
goals.add( "-Djacoco.agent=" + jacocoAgent );
goals.add( "-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2" );
goals.add( "-nsu" );
return goals;
}
public SurefireLauncher showErrorStackTraces()
{
mavenLauncher.showErrorStackTraces();
return this;
}
public SurefireLauncher debugLogging()
{
mavenLauncher.debugLogging();
return this;
}
@SuppressWarnings( "UnusedDeclaration" )
public SurefireLauncher debugSurefireFork()
{
mavenLauncher.sysProp( "maven.surefire.debug", "true" );
return this;
}
public SurefireLauncher failNever()
{
mavenLauncher.failNever();
return this;
}
public SurefireLauncher groups( String groups )
{
mavenLauncher.sysProp( "groups", groups );
return this;
}
public SurefireLauncher addGoal( String goal )
{
mavenLauncher.addGoal( goal );
return this;
}
public OutputValidator executeTest()
{
return mavenLauncher.execute( "test" );
}
public OutputValidator executeInstall()
{
return mavenLauncher.execute( "install" );
}
public FailsafeOutputValidator executeVerify()
{
OutputValidator verify = execute( "verify" );
return new FailsafeOutputValidator( verify );
}
public OutputValidator execute( String goal )
{
return mavenLauncher.execute( goal );
}
public OutputValidator executeSurefireReport()
{
return mavenLauncher.execute( "surefire-report:report" );
}
public OutputValidator executeCurrentGoals()
{
return mavenLauncher.executeCurrentGoals();
}
public SurefireLauncher printSummary( boolean printsummary )
{
mavenLauncher.sysProp( "printSummary", printsummary );
return this;
}
public SurefireLauncher redirectToFile( boolean redirect )
{
mavenLauncher.sysProp( "maven.test.redirectTestOutputToFile", redirect );
return this;
}
public SurefireLauncher forkOnce()
{
return forkMode( "once" );
}
public SurefireLauncher forkNever()
{
return forkMode( "never" );
}
public SurefireLauncher forkAlways()
{
return forkMode( "always" );
}
public SurefireLauncher forkPerTest()
{
return forkMode( "pertest" );
}
public SurefireLauncher forkPerThread()
{
return forkMode( "perthread" );
}
public SurefireLauncher threadCount( int threadCount )
{
mavenLauncher.sysProp( "threadCount", threadCount );
return this;
}
public SurefireLauncher forkCount( int forkCount )
{
mavenLauncher.sysProp( "forkCount", forkCount );
return this;
}
public SurefireLauncher reuseForks( boolean reuseForks )
{
mavenLauncher.sysProp( "reuseForks", reuseForks );
return this;
}
public SurefireLauncher forkMode( String forkMode )
{
mavenLauncher.sysProp( "forkMode", forkMode );
return this;
}
public SurefireLauncher runOrder( String runOrder )
{
mavenLauncher.sysProp( "surefire.runOrder", runOrder );
return this;
}
public SurefireLauncher runOrderRandomSeed( String runOrderRandomSeed )
{
mavenLauncher.sysProp( "surefire.runOrder.random.seed", runOrderRandomSeed );
return this;
}
public SurefireLauncher failIfNoTests( boolean fail )
{
mavenLauncher.sysProp( "failIfNoTests", fail );
return this;
}
public SurefireLauncher mavenTestFailureIgnore( boolean fail )
{
mavenLauncher.sysProp( "maven.test.failure.ignore", fail );
return this;
}
public SurefireLauncher failIfNoSpecifiedTests( boolean fail )
{
mavenLauncher.sysProp( "surefire.failIfNoSpecifiedTests", fail );
return this;
}
public SurefireLauncher useSystemClassLoader( boolean useSystemClassLoader )
{
mavenLauncher.sysProp( "useSystemClassLoader", useSystemClassLoader );
return this;
}
public SurefireLauncher activateProfile( String profile )
{
mavenLauncher.activateProfile( profile );
return this;
}
public SurefireLauncher disablePerCoreThreadCount()
{
mavenLauncher.sysProp( "perCoreThreadCount", false );
return this;
}
public SurefireLauncher disableParallelOptimization()
{
mavenLauncher.sysProp( "parallelOptimized", "false" );
return this;
}
public SurefireLauncher parallel( String parallel )
{
mavenLauncher.sysProp( "parallel", parallel );
return this;
}
public SurefireLauncher parallelSuites()
{
return parallel( "suites" );
}
public SurefireLauncher parallelClasses()
{
return parallel( "classes" );
}
public SurefireLauncher parallelMethods()
{
return parallel( "methods" );
}
public SurefireLauncher parallelBoth()
{
return parallel( "both" );
}
public SurefireLauncher parallelSuitesAndClasses()
{
return parallel( "suitesAndClasses" );
}
public SurefireLauncher parallelSuitesAndMethods()
{
return parallel( "suitesAndMethods" );
}
public SurefireLauncher parallelClassesAndMethods()
{
return parallel( "classesAndMethods" );
}
public SurefireLauncher parallelAll()
{
return parallel( "all" );
}
public SurefireLauncher useUnlimitedThreads()
{
mavenLauncher.sysProp( "useUnlimitedThreads", true );
return this;
}
public SurefireLauncher threadCountSuites( int count )
{
mavenLauncher.sysProp( "threadCountSuites", count );
return this;
}
public SurefireLauncher threadCountClasses( int count )
{
mavenLauncher.sysProp( "threadCountClasses", count );
return this;
}
public SurefireLauncher threadCountMethods( int count )
{
mavenLauncher.sysProp( "threadCountMethods", count );
return this;
}
public SurefireLauncher parallelTestsTimeoutInSeconds( double timeout )
{
mavenLauncher.sysProp( "surefire.parallel.timeout", timeout );
return this;
}
public SurefireLauncher parallelTestsTimeoutForcedInSeconds( double timeout )
{
mavenLauncher.sysProp( "surefire.parallel.forcedTimeout", timeout );
return this;
}
public SurefireLauncher argLine( String value )
{
mavenLauncher.sysProp( "argLine", value );
return this;
}
public SurefireLauncher sysProp( String variable, String value )
{
mavenLauncher.sysProp( variable, value );
return this;
}
public SurefireLauncher setJUnitVersion( String version )
{
mavenLauncher.sysProp( "junit.version", version );
return this;
}
public SurefireLauncher setGroups( String groups )
{
mavenLauncher.sysProp( "groups", groups );
return this;
}
public SurefireLauncher setExcludedGroups( String excludedGroups )
{
mavenLauncher.sysProp( "excludedGroups", excludedGroups );
return this;
}
public File getUnpackedAt()
{
return mavenLauncher.getUnpackedAt();
}
public SurefireLauncher addFailsafeReportOnlyGoal()
{
mavenLauncher.addGoal( getReportPluginGoal( ":failsafe-report-only" ) );
return this;
}
public SurefireLauncher addSurefireReportGoal()
{
mavenLauncher.addGoal( getReportPluginGoal( "report" ) );
return this;
}
public SurefireLauncher addSurefireReportOnlyGoal()
{
mavenLauncher.addGoal( getReportPluginGoal( "report-only" ) );
return this;
}
private String getReportPluginGoal( String goal )
{
return "org.apache.maven.plugins:maven-surefire-report-plugin:" + surefireVersion + ":" + goal;
}
public SurefireLauncher setTestToRun( String basicTest )
{
mavenLauncher.sysProp( "test", basicTest );
return this;
}
public SurefireLauncher setForkJvm()
{
mavenLauncher.setForkJvm( true );
return this;
}
}