blob: 4f6267017586684b5495260226fe0958a53b9d23 [file] [log] [blame]
package org.apache.maven.plugin.surefire.booterclient;
/*
* 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.util.Collections;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.apache.maven.shared.utils.StringUtils;
import org.apache.maven.shared.utils.cli.Commandline;
import org.apache.maven.surefire.booter.Classpath;
import org.apache.maven.surefire.booter.SurefireBooterForkException;
import junit.framework.TestCase;
public class ForkConfigurationTest
extends TestCase
{
public void testCreateCommandLine_UseSystemClassLoaderForkOnce_ShouldConstructManifestOnlyJar()
throws IOException, SurefireBooterForkException
{
ForkConfiguration config = getForkConfiguration( null, "java" );
File cpElement = getTempClasspathFile();
Commandline cli =
config.createCommandLine( Collections.singletonList( cpElement.getAbsolutePath() ), true, false, null, 1 );
String line = StringUtils.join( cli.getCommandline(), " " );
assertTrue( line.contains( "-jar" ) );
}
public void testArglineWithNewline()
throws IOException, SurefireBooterForkException
{
// SUREFIRE-657
File cpElement = getTempClasspathFile();
ForkConfiguration forkConfiguration = getForkConfiguration( "abc\ndef", null );
final Commandline commandLine =
forkConfiguration.createCommandLine( Collections.singletonList( cpElement.getAbsolutePath() ), false, false,
null, 1 );
assertTrue( commandLine.toString().contains( "abc def" ) );
}
public void testCurrentWorkingDirectoryPropagationIncludingForkNumberExpansion()
throws IOException, SurefireBooterForkException
{
// SUREFIRE-1136
File baseDir =
new File( FileUtils.getTempDirectory(), "SUREFIRE-1136-" + RandomStringUtils.randomAlphabetic( 3 ) );
baseDir.mkdirs();
baseDir.deleteOnExit();
File cwd = new File( baseDir, "fork_${surefire.forkNumber}" );
ForkConfiguration config = getForkConfiguration( null, "java", cwd.getCanonicalFile() );
Commandline commandLine = config.createCommandLine( Collections.<String>emptyList(), true, false, null, 1 );
File forkDirectory = new File( baseDir, "fork_1" );
forkDirectory.deleteOnExit();
assertTrue( forkDirectory.getCanonicalPath().equals(
commandLine.getShell().getWorkingDirectory().getCanonicalPath() ) );
}
public void testExceptionWhenCurrentDirectoryIsNotRealDirectory()
throws IOException, SurefireBooterForkException
{
// SUREFIRE-1136
File baseDir =
new File( FileUtils.getTempDirectory(), "SUREFIRE-1136-" + RandomStringUtils.randomAlphabetic( 3 ) );
baseDir.mkdirs();
baseDir.deleteOnExit();
File cwd = new File( baseDir, "cwd.txt" );
FileUtils.touch( cwd );
cwd.deleteOnExit();
ForkConfiguration config = getForkConfiguration( null, "java", cwd.getCanonicalFile() );
try
{
config.createCommandLine( Collections.<String>emptyList(), true, false, null, 1 );
}
catch ( SurefireBooterForkException sbfe )
{
// To handle issue with ~ expansion on Windows
String absolutePath = cwd.getCanonicalPath();
assertEquals( "WorkingDirectory " + absolutePath + " exists and is not a directory", sbfe.getMessage() );
return;
}
fail();
}
public void testExceptionWhenCurrentDirectoryCannotBeCreated()
throws IOException, SurefireBooterForkException
{
// SUREFIRE-1136
File baseDir =
new File( FileUtils.getTempDirectory(), "SUREFIRE-1136-" + RandomStringUtils.randomAlphabetic( 3 ) );
baseDir.mkdirs();
baseDir.deleteOnExit();
// NULL is invalid for JDK starting from 1.7.60 - https://github.com/openjdk-mirror/jdk/commit/e5389115f3634d25d101e2dcc71f120d4fd9f72f
// ? character is invalid on Windows, seems to be imposable to create invalid directory using Java on Linux
File cwd = new File( baseDir, "?\u0000InvalidDirectoryName" );
ForkConfiguration config = getForkConfiguration( null, "java", cwd.getAbsoluteFile() );
try
{
config.createCommandLine( Collections.<String>emptyList(), true, false, null, 1 );
}
catch ( SurefireBooterForkException sbfe )
{
assertEquals( "Cannot create workingDirectory " + cwd.getAbsolutePath(), sbfe.getMessage() );
return;
}
if ( SystemUtils.IS_OS_WINDOWS || isJavaVersionAtLeast( 7, 60 ) )
{
fail();
}
}
private File getTempClasspathFile()
throws IOException
{
File cpElement = File.createTempFile( "ForkConfigurationTest.", ".file" );
cpElement.deleteOnExit();
return cpElement;
}
public static ForkConfiguration getForkConfiguration( String argLine, String jvm )
throws IOException
{
return getForkConfiguration( argLine, jvm, new File( "." ).getCanonicalFile() );
}
public static ForkConfiguration getForkConfiguration( String argLine, String jvm, File cwd )
throws IOException
{
return new ForkConfiguration( Classpath.emptyClasspath(), null, null, jvm, cwd, new Properties(), argLine, null,
false, 1, false );
}
// based on http://stackoverflow.com/questions/2591083/getting-version-of-java-in-runtime
private boolean isJavaVersionAtLeast( int major, int update )
{
String[] javaVersionElements = System.getProperty( "java.runtime.version" ).split( "\\.|_|-b" );
return Integer.valueOf( javaVersionElements[1] ) >= major
&& Integer.valueOf( javaVersionElements[4] ) >= update;
}
}