blob: afcb64201e34c4800de99cb8a5fca5e5de04096c [file] [log] [blame]
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.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.surefire.extensions.SurefireConsoleOutputReporter;
import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter;
import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter;
import org.apache.maven.surefire.extensions.ForkNodeFactory;
import org.apache.maven.surefire.api.suite.RunResult;
import org.apache.maven.surefire.api.util.DefaultScanResult;
import org.apache.maven.toolchain.Toolchain;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.powermock.reflect.Whitebox.invokeMethod;
import static org.powermock.reflect.Whitebox.setInternalState;
/**
*
*/
public class MojoMocklessTest
{
@Test
public void testGetStartupReportConfiguration() throws Exception
{
AbstractSurefireMojo surefirePlugin = new Mojo( null, null );
StartupReportConfiguration config = invokeMethod( surefirePlugin, "getStartupReportConfiguration", "", false );
assertThat( config.getXmlReporter() )
.isNotNull()
.isInstanceOf( SurefireStatelessReporter.class );
assertThat( config.getConsoleOutputReporter() )
.isNotNull()
.isInstanceOf( SurefireConsoleOutputReporter.class );
assertThat( config.getTestsetReporter() )
.isNotNull()
.isInstanceOf( SurefireStatelessTestsetInfoReporter.class );
}
@Test
public void testGetStartupReportConfiguration2() throws Exception
{
AbstractSurefireMojo surefirePlugin = new Mojo( null, null );
SurefireStatelessReporter xmlReporter = new SurefireStatelessReporter( false, "3.0" );
SurefireConsoleOutputReporter consoleReporter = new SurefireConsoleOutputReporter();
SurefireStatelessTestsetInfoReporter testsetInfoReporter = new SurefireStatelessTestsetInfoReporter();
setInternalState( surefirePlugin, "statelessTestsetReporter", xmlReporter );
setInternalState( surefirePlugin, "consoleOutputReporter", consoleReporter );
setInternalState( surefirePlugin, "statelessTestsetInfoReporter", testsetInfoReporter );
StartupReportConfiguration config = invokeMethod( surefirePlugin, "getStartupReportConfiguration", "", false );
assertThat( config.getXmlReporter() )
.isNotNull()
.isSameAs( xmlReporter );
assertThat( config.getConsoleOutputReporter() )
.isNotNull()
.isSameAs( consoleReporter );
assertThat( config.getTestsetReporter() )
.isNotNull()
.isSameAs( testsetInfoReporter );
}
@Test
public void testForkMode()
{
AbstractSurefireMojo surefirePlugin = new Mojo( null, null );
setInternalState( surefirePlugin, "toolchain", new MyToolChain() );
setInternalState( surefirePlugin, "forkMode", "never" );
assertThat( surefirePlugin.getEffectiveForkMode() )
.isEqualTo( "once" );
}
@Test
@SuppressWarnings( "checkstyle:magicnumber" )
public void testForkCountComputation()
{
AbstractSurefireMojo surefirePlugin = new Mojo( null, null );
assertConversionFails( surefirePlugin, "nothing" );
assertConversionFails( surefirePlugin, "5,0" );
assertConversionFails( surefirePlugin, "5.0" );
assertConversionFails( surefirePlugin, "5,0C" );
assertConversionFails( surefirePlugin, "5.0CC" );
assertForkCount( surefirePlugin, 5, "5" );
int availableProcessors = Runtime.getRuntime().availableProcessors();
assertForkCount( surefirePlugin, 3 * availableProcessors, "3C" );
assertForkCount( surefirePlugin, (int) ( 2.5 * availableProcessors ), "2.5C" );
assertForkCount( surefirePlugin, availableProcessors, "1.0001 C" );
assertForkCount( surefirePlugin, 1, 1d / ( (double) availableProcessors + 1 ) + "C" );
assertForkCount( surefirePlugin, 0, "0 C" );
}
private static void assertForkCount( AbstractSurefireMojo surefirePlugin, int expected, String value )
{
assertThat( surefirePlugin.convertWithCoreCount( value ) )
.isEqualTo( expected );
}
private static void assertConversionFails( AbstractSurefireMojo surefirePlugin, String value )
{
try
{
surefirePlugin.convertWithCoreCount( value );
}
catch ( NumberFormatException e )
{
return;
}
fail( "Expected NumberFormatException when converting " + value );
}
private static class MyToolChain implements Toolchain
{
@Override
public String getType()
{
return null;
}
@Override
public String findTool( String s )
{
return null;
}
}
@Test
public void scanDependenciesShouldReturnNull()
throws MojoFailureException
{
Mojo mojo = new Mojo( null, null );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNull();
}
@Test
public void scanDependenciesShouldReturnNullAfterMissingBuildArtifact()
throws MojoFailureException
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "jar", null, handler );
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNull();
}
@Test
public void scanDependenciesShouldReturnNullWithWAR()
throws MojoFailureException
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "war", null, handler );
testDeps.setFile( new File( new File( "target" ), "a-1.0.war" ) );
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNull();
}
@Test
public void scanDependenciesShouldReturnNullWithExistingWAR()
throws Exception
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "war", null, handler );
File artifactFile = File.createTempFile( "surefire", ".war" );
testDeps.setFile( artifactFile );
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNull();
}
@Test
public void scanDependenciesShouldReturnClassWithExistingTestJAR()
throws Exception
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "test-jar", null, handler );
File artifactFile = File.createTempFile( "surefire", ".jar" );
testDeps.setFile( artifactFile );
try ( ZipOutputStream os = new ZipOutputStream( new FileOutputStream( artifactFile ) ) )
{
os.putNextEntry( new ZipEntry( "pkg/" ) );
os.closeEntry();
os.putNextEntry( new ZipEntry( "pkg/MyTest.class" ) );
os.closeEntry();
os.finish();
}
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNotNull();
assertThat( result.isEmpty() )
.isFalse();
assertThat( result.getClasses() )
.contains( "pkg.MyTest" );
}
@Test
public void scanDependenciesShouldReturnNullWithEmptyTestJAR()
throws Exception
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "jar", null, handler );
File artifactFile = File.createTempFile( "surefire", ".jar" );
testDeps.setFile( artifactFile );
try ( ZipOutputStream os = new ZipOutputStream( new FileOutputStream( artifactFile ) ) )
{
os.putNextEntry( new ZipEntry( "pkg/" ) );
os.closeEntry();
os.finish();
}
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNotNull();
assertThat( result.isEmpty() )
.isTrue();
}
@Test
public void scanDependenciesShouldReturnClassWithDirectory()
throws Exception
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDeps = new DefaultArtifact( "g", "a", version, "compile", "test-jar", null, handler );
File artifactFile = File.createTempFile( "surefire", "-classes" );
String classDir = artifactFile.getCanonicalPath();
assertThat( artifactFile.delete() ).isTrue();
File classes = new File( classDir );
assertThat( classes.mkdir() ).isTrue();
testDeps.setFile( classes );
assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
.isTrue();
List<Artifact> projectTestArtifacts = singletonList( testDeps );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNotNull();
assertThat( result.isEmpty() )
.isFalse();
assertThat( result.getClasses() )
.contains( "AnotherTest" );
}
@Test
public void scanMultipleDependencies()
throws Exception
{
VersionRange version = VersionRange.createFromVersion( "1.0" );
ArtifactHandler handler = new DefaultArtifactHandler();
Artifact testDep1 = new DefaultArtifact( "g", "x", version, "compile", "jar", null, handler );
File artifactFile1 = File.createTempFile( "surefire", "-classes" );
String classDir = artifactFile1.getCanonicalPath();
assertThat( artifactFile1.delete() ).isTrue();
File classes = new File( classDir );
assertThat( classes.mkdir() ).isTrue();
testDep1.setFile( classes );
assertThat( new File( classes, "AnotherTest.class" ).createNewFile() )
.isTrue();
Artifact testDep2 = new DefaultArtifact( "g", "a", version, "test", "jar", null, handler );
File artifactFile2 = File.createTempFile( "surefire", ".jar" );
testDep2.setFile( artifactFile2 );
try ( ZipOutputStream os = new ZipOutputStream( new FileOutputStream( artifactFile2 ) ) )
{
os.putNextEntry( new ZipEntry( "pkg/" ) );
os.closeEntry();
os.putNextEntry( new ZipEntry( "pkg/MyTest.class" ) );
os.closeEntry();
os.finish();
}
List<Artifact> projectTestArtifacts = asList( testDep1, testDep2 );
String[] dependenciesToScan = { "g:a" };
Mojo mojo = new Mojo( projectTestArtifacts, dependenciesToScan );
DefaultScanResult result = mojo.scanDependencies();
assertThat( result )
.isNotNull();
assertThat( result.isEmpty() )
.isFalse();
assertThat( result.getClasses() )
.hasSize( 1 );
assertThat( result.getClasses() )
.contains( "pkg.MyTest" );
}
private static final class Mojo
extends AbstractSurefireMojo
{
private final List<Artifact> projectTestArtifacts;
private final String[] dependenciesToScan;
Mojo( List<Artifact> projectTestArtifacts, String[] dependenciesToScan )
{
this.projectTestArtifacts = projectTestArtifacts;
this.dependenciesToScan = dependenciesToScan;
}
@Override
protected String getPluginName()
{
return null;
}
@Override
protected int getRerunFailingTestsCount()
{
return 0;
}
@Override
public boolean isSkipTests()
{
return false;
}
@Override
public void setSkipTests( boolean skipTests )
{
}
@Override
public boolean isSkipExec()
{
return false;
}
@Override
public void setSkipExec( boolean skipExec )
{
}
@Override
public boolean isSkip()
{
return false;
}
@Override
public void setSkip( boolean skip )
{
}
@Override
public File getBasedir()
{
return null;
}
@Override
public void setBasedir( File basedir )
{
}
@Override
public File getTestClassesDirectory()
{
return null;
}
@Override
public void setTestClassesDirectory( File testClassesDirectory )
{
}
@Override
public File getMainBuildPath()
{
return null;
}
@Override
public void setMainBuildPath( File mainBuildPath )
{
}
@Override
public File getReportsDirectory()
{
return null;
}
@Override
public void setReportsDirectory( File reportsDirectory )
{
}
@Override
public String getTest()
{
return null;
}
@Override
public void setTest( String test )
{
}
@Override
public List<String> getIncludes()
{
return null;
}
@Override
public File getIncludesFile()
{
return null;
}
@Override
public void setIncludes( List<String> includes )
{
}
@Override
public boolean isPrintSummary()
{
return false;
}
@Override
public void setPrintSummary( boolean printSummary )
{
}
@Override
public String getReportFormat()
{
return null;
}
@Override
public void setReportFormat( String reportFormat )
{
}
@Override
public boolean isUseFile()
{
return false;
}
@Override
public void setUseFile( boolean useFile )
{
}
@Override
public String getDebugForkedProcess()
{
return null;
}
@Override
public void setDebugForkedProcess( String debugForkedProcess )
{
}
@Override
public int getForkedProcessTimeoutInSeconds()
{
return 0;
}
@Override
public void setForkedProcessTimeoutInSeconds( int forkedProcessTimeoutInSeconds )
{
}
@Override
public int getForkedProcessExitTimeoutInSeconds()
{
return 0;
}
@Override
public void setForkedProcessExitTimeoutInSeconds( int forkedProcessTerminationTimeoutInSeconds )
{
}
@Override
public double getParallelTestsTimeoutInSeconds()
{
return 0;
}
@Override
public void setParallelTestsTimeoutInSeconds( double parallelTestsTimeoutInSeconds )
{
}
@Override
public double getParallelTestsTimeoutForcedInSeconds()
{
return 0;
}
@Override
public void setParallelTestsTimeoutForcedInSeconds( double parallelTestsTimeoutForcedInSeconds )
{
}
@Override
public boolean isUseSystemClassLoader()
{
return false;
}
@Override
public void setUseSystemClassLoader( boolean useSystemClassLoader )
{
}
@Override
public boolean isUseManifestOnlyJar()
{
return false;
}
@Override
public void setUseManifestOnlyJar( boolean useManifestOnlyJar )
{
}
@Override
public String getEncoding()
{
return null;
}
@Override
public void setEncoding( String encoding )
{
}
@Override
public Boolean getFailIfNoSpecifiedTests()
{
return null;
}
@Override
public void setFailIfNoSpecifiedTests( boolean failIfNoSpecifiedTests )
{
}
@Override
public int getSkipAfterFailureCount()
{
return 0;
}
@Override
public String getShutdown()
{
return null;
}
@Override
public File getExcludesFile()
{
return null;
}
@Override
protected List<File> suiteXmlFiles()
{
return null;
}
@Override
protected boolean hasSuiteXmlFiles()
{
return false;
}
@Override
protected String[] getExcludedEnvironmentVariables()
{
return new String[0];
}
@Override
public File[] getSuiteXmlFiles()
{
return new File[0];
}
@Override
public void setSuiteXmlFiles( File[] suiteXmlFiles )
{
}
@Override
public String getRunOrder()
{
return null;
}
@Override
public void setRunOrder( String runOrder )
{
}
@Override
public String[] getDependenciesToScan()
{
return dependenciesToScan;
}
@Override
protected void handleSummary( RunResult summary, Exception firstForkException )
{
}
@Override
protected boolean isSkipExecution()
{
return false;
}
@Override
protected String[] getDefaultIncludes()
{
return new String[0];
}
@Override
protected String getReportSchemaLocation()
{
return null;
}
@Override
protected boolean useModulePath()
{
return false;
}
@Override
protected void setUseModulePath( boolean useModulePath )
{
}
@Override
protected ForkNodeFactory getForkNode()
{
return null;
}
@Override
protected String getEnableProcessChecker()
{
return null;
}
@Override
protected Artifact getMojoArtifact()
{
return null;
}
@Override
List<Artifact> getProjectTestArtifacts()
{
return projectTestArtifacts;
}
@Override
public File getSystemPropertiesFile()
{
return null;
}
@Override
public void setSystemPropertiesFile( File systemPropertiesFile )
{
}
}
}