blob: ee3a000f6ed125f6ee457e602a0c24e6b9c80d29 [file] [log] [blame]
package org.apache.maven.shared.invoker;
/*
* 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.Os;
import org.codehaus.plexus.util.cli.CommandLineException;
import org.codehaus.plexus.util.cli.Commandline;
import org.junit.After;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
public class MavenCommandLineBuilderTest
{
private List<File> toDelete = new ArrayList<File>();
private Properties sysProps;
@Test
public void testWrapwithQuotes()
{
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
String test = "noSpacesInHere";
assertSame( test, tcb.wrapStringWithQuotes( test ) );
assertEquals( "noSpacesInHere", tcb.wrapStringWithQuotes( test ) );
test = "bunch of spaces in here";
assertNotSame( test, tcb.wrapStringWithQuotes( test ) );
assertEquals( "\"bunch of spaces in here\"", tcb.wrapStringWithQuotes( test ) );
}
@Test
public void testShouldFailToSetLocalRepoLocationGloballyWhenItIsAFile()
throws IOException
{
logTestStart();
File lrd = File.createTempFile( "workdir-test", "file" ).getCanonicalFile();
toDelete.add( lrd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setLocalRepositoryDirectory( lrd );
Commandline cli = new Commandline();
try
{
tcb.setEnvironmentPaths( newRequest(), cli );
fail( "Should not set local repo location to point to a file." );
}
catch ( IllegalArgumentException e )
{
assertTrue( true );
}
}
@Test
public void testShouldFailToSetLocalRepoLocationFromRequestWhenItIsAFile()
throws IOException
{
logTestStart();
File lrd = File.createTempFile( "workdir-test", "file" ).getCanonicalFile();
toDelete.add( lrd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
try
{
tcb.setEnvironmentPaths( newRequest().setLocalRepositoryDirectory( lrd ), cli );
fail( "Should not set local repo location to point to a file." );
}
catch ( IllegalArgumentException e )
{
assertTrue( true );
}
}
@Test
public void testShouldSetLocalRepoLocationGlobally()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File lrd = new File( tmpDir, "workdir" ).getCanonicalFile();
lrd.mkdirs();
toDelete.add( lrd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setLocalRepositoryDirectory( lrd );
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( newRequest(), cli );
assertArgumentsPresentInOrder( cli, "-D", "maven.repo.local=" + lrd.getPath() );
}
@Test
public void testShouldSetLocalRepoLocationFromRequest()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File lrd = new File( tmpDir, "workdir" ).getCanonicalFile();
lrd.mkdirs();
toDelete.add( lrd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( newRequest().setLocalRepositoryDirectory( lrd ), cli );
assertArgumentsPresentInOrder( cli, "-D", "maven.repo.local=" + lrd.getPath() );
}
@Test
public void testRequestProvidedLocalRepoLocationShouldOverrideGlobal()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File lrd = new File( tmpDir, "workdir" ).getCanonicalFile();
File glrd = new File( tmpDir, "global-workdir" ).getCanonicalFile();
lrd.mkdirs();
glrd.mkdirs();
toDelete.add( lrd );
toDelete.add( glrd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setLocalRepositoryDirectory( glrd );
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( newRequest().setLocalRepositoryDirectory( lrd ), cli );
assertArgumentsPresentInOrder( cli, "-D", "maven.repo.local=" + lrd.getPath() );
}
@Test
public void testShouldSetWorkingDirectoryGlobally()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File wd = new File( tmpDir, "workdir" );
wd.mkdirs();
toDelete.add( wd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setWorkingDirectory( wd );
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( newRequest(), cli );
assertEquals( cli.getWorkingDirectory(), wd );
}
@Test
public void testShouldSetWorkingDirectoryFromRequest()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File wd = new File( tmpDir, "workdir" );
wd.mkdirs();
toDelete.add( wd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
InvocationRequest req = newRequest();
req.setBaseDirectory( wd );
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( req, cli );
assertEquals( cli.getWorkingDirectory(), wd );
}
@Test
public void testRequestProvidedWorkingDirectoryShouldOverrideGlobal()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File wd = new File( tmpDir, "workdir" );
File gwd = new File( tmpDir, "global-workdir" );
wd.mkdirs();
gwd.mkdirs();
toDelete.add( wd );
toDelete.add( gwd );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setWorkingDirectory( gwd );
InvocationRequest req = newRequest();
req.setBaseDirectory( wd );
Commandline cli = new Commandline();
tcb.setEnvironmentPaths( req, cli );
assertEquals( cli.getWorkingDirectory(), wd );
}
@Test
public void testShouldUseSystemOutLoggerWhenNoneSpecified()
throws Exception
{
logTestStart();
setupTempMavenHomeIfMissing( false );
TestCommandLineBuilder tclb = new TestCommandLineBuilder();
tclb.checkRequiredState();
}
private File setupTempMavenHomeIfMissing( boolean forceDummy )
throws Exception
{
String mavenHome = System.getProperty( "maven.home" );
File appDir = null;
if ( forceDummy || ( mavenHome == null ) || !new File( mavenHome ).exists() )
{
File tmpDir = getTempDir();
appDir = new File( tmpDir, "invoker-tests/maven-home" );
File binDir = new File( appDir, "bin" );
binDir.mkdirs();
toDelete.add( appDir );
if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
{
createDummyFile( binDir, "mvn.bat" );
}
else
{
createDummyFile( binDir, "mvn" );
}
Properties props = System.getProperties();
props.setProperty( "maven.home", appDir.getCanonicalPath() );
System.setProperties( props );
}
else
{
appDir = new File( mavenHome );
}
return appDir;
}
@Test
public void testShouldFailIfLoggerSetToNull()
{
logTestStart();
TestCommandLineBuilder tclb = new TestCommandLineBuilder();
tclb.setLogger( null );
try
{
tclb.checkRequiredState();
fail( "Should not allow execution to proceed when logger is missing." );
}
catch ( IllegalStateException e )
{
assertTrue( true );
}
catch ( IOException e )
{
fail( e.getMessage() );
}
}
@Test
public void testShouldFindDummyMavenExecutable()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
File dummyMavenHomeBin = new File( base, "dummy-maven-home/bin" );
dummyMavenHomeBin.mkdirs();
toDelete.add( base );
File check;
if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
{
check = createDummyFile( dummyMavenHomeBin, "mvn.bat" );
}
else
{
check = createDummyFile( dummyMavenHomeBin, "mvn" );
}
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setMavenHome( dummyMavenHomeBin.getParentFile() );
File mavenExe = tcb.findMavenExecutable();
assertEquals( check.getCanonicalPath(), mavenExe.getCanonicalPath() );
}
@Test
public void testShouldSetBatchModeFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setBatchMode( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-B" ) );
}
@Test
public void testShouldSetOfflineFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setOffline( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-o" ) );
}
@Test
public void testShouldSetUpdateSnapshotsFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setUpdateSnapshots( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-U" ) );
}
@Test
public void testShouldSetDebugFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setDebug( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-X" ) );
}
@Test
public void testShouldSetErrorFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setShowErrors( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-e" ) );
}
@Test
public void testDebugOptionShouldMaskShowErrorsOption()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setDebug( true ).setShowErrors( true ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-X" ) );
assertArgumentsNotPresent( cli, Collections.singleton( "-e" ) );
}
@Test
public void testAlsoMake()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setAlsoMake( true ), cli );
// -am is only useful with -pl
assertArgumentsNotPresent( cli, Collections.singleton( "-am" ) );
}
@Test
public void testProjectsAndAlsoMake()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setProjects( Collections.singletonList( "proj1" ) ).setAlsoMake( true ),
cli );
assertArgumentsPresentInOrder( cli, "-pl", "proj1", "-am" );
}
@Test
public void testAlsoMakeDependents()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setAlsoMakeDependents( true ), cli );
// -amd is only useful with -pl
assertArgumentsNotPresent( cli, Collections.singleton( "-amd" ) );
}
@Test
public void testProjectsAndAlsoMakeDependents()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setProjects( Collections.singletonList( "proj1" ) ).setAlsoMakeDependents( true ),
cli );
assertArgumentsPresentInOrder( cli, "-pl", "proj1", "-amd" );
}
@Test
public void testProjectsAndAlsoMakeAndAlsoMakeDependents()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setProjects( Collections.singletonList( "proj1" ) ).setAlsoMake( true ).setAlsoMakeDependents( true ),
cli );
assertArgumentsPresentInOrder( cli, "-pl", "proj1", "-am", "-amd" );
}
@Test
public void testShouldSetResumeFrom()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setResumeFrom( ":module3" ), cli );
assertArgumentsPresentInOrder( cli, "-rf", ":module3" );
}
@Test
public void testShouldSetStrictChecksumPolityFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setGlobalChecksumPolicy( InvocationRequest.CheckSumPolicy.Fail ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-C" ) );
}
@Test
public void testShouldSetLaxChecksumPolicyFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setFlags( newRequest().setGlobalChecksumPolicy( InvocationRequest.CheckSumPolicy.Warn ), cli );
assertArgumentsPresent( cli, Collections.singleton( "-c" ) );
}
@Test
public void testShouldSetFailAtEndFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setReactorFailureBehavior( InvocationRequest.ReactorFailureBehavior.FailAtEnd ),
cli );
assertArgumentsPresent( cli, Collections.singleton( "-fae" ) );
}
@Test
public void testShouldSetFailNeverFlagFromRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setReactorFailureBehavior( InvocationRequest.ReactorFailureBehavior.FailNever ),
cli );
assertArgumentsPresent( cli, Collections.singleton( "-fn" ) );
}
@Test
public void testShouldUseDefaultOfFailFastWhenSpecifiedInRequest()
{
logTestStart();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
Commandline cli = new Commandline();
tcb.setReactorBehavior( newRequest().setReactorFailureBehavior( InvocationRequest.ReactorFailureBehavior.FailFast ),
cli );
Set<String> banned = new HashSet<String>();
banned.add( "-fae" );
banned.add( "-fn" );
assertArgumentsNotPresent( cli, banned );
}
@Test
public void testShouldSpecifyFileOptionUsingNonStandardPomFileLocation()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "file-option-nonstd-pom-file-location" ).getCanonicalFile();
projectDir.mkdirs();
File pomFile = createDummyFile( projectDir, "non-standard-pom.xml" ).getCanonicalFile();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setPomFile( pomFile );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "non-standard-pom.xml" );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldSpecifyFileOptionUsingNonStandardPomInBasedir()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "file-option-nonstd-basedir" ).getCanonicalFile();
projectDir.mkdirs();
File basedir = createDummyFile( projectDir, "non-standard-pom.xml" ).getCanonicalFile();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setBaseDirectory( basedir );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "non-standard-pom.xml" );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldNotSpecifyFileOptionUsingStandardPomFileLocation()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "std-pom-file-location" ).getCanonicalFile();
projectDir.mkdirs();
File pomFile = createDummyFile( projectDir, "pom.xml" ).getCanonicalFile();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setPomFile( pomFile );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "pom.xml" );
assertArgumentsNotPresent( cli, args );
}
@Test
public void testShouldNotSpecifyFileOptionUsingStandardPomInBasedir()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "std-basedir-is-pom-file" ).getCanonicalFile();
projectDir.mkdirs();
File basedir = createDummyFile( projectDir, "pom.xml" ).getCanonicalFile();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setBaseDirectory( basedir );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "pom.xml" );
assertArgumentsNotPresent( cli, args );
}
@Test
public void testShouldUseDefaultPomFileWhenBasedirSpecifiedWithoutPomFileName()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "std-basedir-no-pom-filename" ).getCanonicalFile();
projectDir.mkdirs();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setBaseDirectory( projectDir );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "pom.xml" );
assertArgumentsNotPresent( cli, args );
}
@Test
public void testShouldSpecifyPomFileWhenBasedirSpecifiedWithPomFileName()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "std-basedir-with-pom-filename" ).getCanonicalFile();
projectDir.mkdirs();
Commandline cli = new Commandline();
InvocationRequest req = newRequest().setBaseDirectory( projectDir ).setPomFileName( "non-standard-pom.xml" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setEnvironmentPaths( req, cli );
tcb.setPomLocation( req, cli );
assertEquals( projectDir, cli.getWorkingDirectory() );
Set<String> args = new HashSet<String>();
args.add( "-f" );
args.add( "non-standard-pom.xml" );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldSpecifyCustomUserSettingsLocationFromRequest()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "custom-settings" ).getCanonicalFile();
projectDir.mkdirs();
File settingsFile = createDummyFile( projectDir, "settings.xml" );
Commandline cli = new Commandline();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setSettingsLocation( newRequest().setUserSettingsFile( settingsFile ), cli );
Set<String> args = new HashSet<String>();
args.add( "-s" );
args.add( settingsFile.getCanonicalPath() );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldSpecifyCustomGlobalSettingsLocationFromRequest()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "custom-settings" ).getCanonicalFile();
projectDir.mkdirs();
File settingsFile = createDummyFile( projectDir, "settings.xml" );
Commandline cli = new Commandline();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setSettingsLocation( newRequest().setGlobalSettingsFile( settingsFile ), cli );
Set<String> args = new HashSet<String>();
args.add( "-gs" );
args.add( settingsFile.getCanonicalPath() );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldSpecifyCustomToolchainsLocationFromRequest()
throws Exception
{
logTestStart();
File tmpDir = getTempDir();
File base = new File( tmpDir, "invoker-tests" );
toDelete.add( base );
File projectDir = new File( base, "custom-toolchains" ).getCanonicalFile();
projectDir.mkdirs();
File toolchainsFile = createDummyFile( projectDir, "toolchains.xml" );
Commandline cli = new Commandline();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setToolchainsLocation( newRequest().setToolchainsFile( toolchainsFile ), cli );
Set<String> args = new HashSet<String>();
args.add( "-t" );
args.add( toolchainsFile.getCanonicalPath() );
assertArgumentsPresent( cli, args );
}
@Test
public void testShouldSpecifyCustomPropertyFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
Properties properties = new Properties();
properties.setProperty( "key", "value" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setProperties( newRequest().setProperties( properties ), cli );
assertArgumentsPresentInOrder( cli, "-D", "key=value" );
}
@Test
public void testShouldSpecifyCustomPropertyWithSpacesInValueFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
Properties properties = new Properties();
properties.setProperty( "key", "value with spaces" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setProperties( newRequest().setProperties( properties ), cli );
assertArgumentsPresentInOrder( cli, "-D", "key=value with spaces" );
}
@Test
public void testShouldSpecifyCustomPropertyWithSpacesInKeyFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
Properties properties = new Properties();
properties.setProperty( "key with spaces", "value with spaces" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setProperties( newRequest().setProperties( properties ), cli );
assertArgumentsPresentInOrder( cli, "-D", "key with spaces=value with spaces" );
}
@Test
public void testShouldSpecifySingleGoalFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
List<String> goals = new ArrayList<String>();
goals.add( "test" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setGoals( newRequest().setGoals( goals ), cli );
assertArgumentsPresent( cli, Collections.singleton( "test" ) );
}
@Test
public void testShouldSpecifyTwoGoalsFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
List<String> goals = new ArrayList<String>();
goals.add( "test" );
goals.add( "clean" );
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setGoals( newRequest().setGoals( goals ), cli );
assertArgumentsPresent( cli, new HashSet<String>( goals ) );
assertArgumentsPresentInOrder( cli, goals );
}
@Test
public void testShouldSpecifyThreadsFromRequest()
throws IOException
{
logTestStart();
Commandline cli = new Commandline();
TestCommandLineBuilder tcb = new TestCommandLineBuilder();
tcb.setThreads( newRequest().setThreads( "2.0C" ), cli );
assertArgumentsPresentInOrder( cli, "-T", "2.0C" );
}
@Test
public void testBuildTypicalMavenInvocationEndToEnd()
throws Exception
{
logTestStart();
File mavenDir = setupTempMavenHomeIfMissing( false );
InvocationRequest request = newRequest();
File tmpDir = getTempDir();
File projectDir = new File( tmpDir, "invoker-tests/typical-end-to-end-cli-build" );
projectDir.mkdirs();
toDelete.add( projectDir.getParentFile() );
request.setBaseDirectory( projectDir );
Set<String> expectedArgs = new HashSet<String>();
Set<String> bannedArgs = new HashSet<String>();
createDummyFile( projectDir, "pom.xml" );
bannedArgs.add( "-f" );
bannedArgs.add( "pom.xml" );
Properties properties = new Properties();
// this is REALLY bad practice, but since it's just a test...
properties.setProperty( "maven.tests.skip", "true" );
expectedArgs.add( "maven.tests.skip=true" );
request.setProperties( properties );
request.setOffline( true );
expectedArgs.add( "-o" );
List<String> goals = new ArrayList<String>();
goals.add( "post-clean" );
goals.add( "deploy" );
goals.add( "site-deploy" );
request.setGoals( goals );
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
Commandline commandline = commandLineBuilder.build( request );
assertArgumentsPresent( commandline, expectedArgs );
assertArgumentsNotPresent( commandline, bannedArgs );
assertArgumentsPresentInOrder( commandline, goals );
String executable = commandline.getExecutable();
assertTrue( executable.indexOf( new File( mavenDir, "bin/mvn" ).getCanonicalPath() ) > -1 );
assertEquals( projectDir.getCanonicalPath(), commandline.getWorkingDirectory().getCanonicalPath() );
}
@Test
public void testShouldSetEnvVar_MAVEN_TERMINATE_CMD()
throws Exception
{
logTestStart();
setupTempMavenHomeIfMissing( false );
InvocationRequest request = newRequest();
File tmpDir = getTempDir();
File projectDir = new File( tmpDir, "invoker-tests/maven-terminate-cmd-options-set" );
projectDir.mkdirs();
toDelete.add( projectDir.getParentFile() );
request.setBaseDirectory( projectDir );
createDummyFile( projectDir, "pom.xml" );
List<String> goals = new ArrayList<String>();
goals.add( "clean" );
request.setGoals( goals );
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
Commandline commandline = commandLineBuilder.build( request );
String[] environmentVariables = commandline.getEnvironmentVariables();
String envVarMavenTerminateCmd = null;
for ( int i = 0; i < environmentVariables.length; i++ )
{
String envVar = environmentVariables[i];
if ( envVar.startsWith( "MAVEN_TERMINATE_CMD=" ) )
{
envVarMavenTerminateCmd = envVar;
break;
}
}
assertEquals( "MAVEN_TERMINATE_CMD=on", envVarMavenTerminateCmd );
}
@Test
public void testShouldInsertActivatedProfiles()
throws Exception
{
setupTempMavenHomeIfMissing( false );
String profile1 = "profile-1";
String profile2 = "profile-2";
InvocationRequest request = newRequest();
List<String> profiles = new ArrayList<String>();
profiles.add( profile1 );
profiles.add( profile2 );
request.setProfiles( profiles );
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
Commandline commandline = commandLineBuilder.build( request );
assertArgumentsPresentInOrder( commandline, "-P", profile1 + "," + profile2 );
}
@Test
public void testShouldSetEnvVar_M2_HOME()
throws Exception
{
Assume.assumeNotNull( System.getenv( "M2_HOME" ) );
logTestStart();
setupTempMavenHomeIfMissing( true );
InvocationRequest request = newRequest();
File tmpDir = getTempDir();
File projectDir = new File( tmpDir, "invoker-tests/maven-terminate-cmd-options-set" );
projectDir.mkdirs();
toDelete.add( projectDir.getParentFile() );
request.setBaseDirectory( projectDir );
createDummyFile( projectDir, "pom.xml" );
List<String> goals = new ArrayList<String>();
goals.add( "clean" );
request.setGoals( goals );
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
File mavenHome2 = new File( System.getProperty( "maven.home" ) );
commandLineBuilder.setMavenHome( mavenHome2 );
Commandline commandline = commandLineBuilder.build( request );
String[] environmentVariables = commandline.getEnvironmentVariables();
String m2Home = null;
for ( int i = 0; i < environmentVariables.length; i++ )
{
String envVar = environmentVariables[i];
if ( envVar.startsWith( "M2_HOME=" ) )
{
m2Home = envVar;
}
}
assertEquals( "M2_HOME=" + mavenHome2.getAbsolutePath(), m2Home );
}
@Test
public void testMvnCommand()
throws Exception
{
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
File mavenExecutable = new File( "mvnDebug" );
commandLineBuilder.setMavenExecutable( mavenExecutable );
File executable = commandLineBuilder.findMavenExecutable();
assertTrue( "Expected executable to exist", executable.exists() );
assertTrue( "Expected executable to be absolute", executable.isAbsolute() );
}
@Test
public void testAddShellEnvironment()
throws Exception
{
setupTempMavenHomeIfMissing( false );
InvocationRequest request = newRequest();
String envVar1Name = "VAR-1";
String envVar1Value = "VAR-1-VALUE";
String envVar2Name = "VAR-2";
String envVar2Value = "VAR-2-VALUE";
request.addShellEnvironment( envVar1Name, envVar1Value );
request.addShellEnvironment( envVar2Name, envVar2Value );
MavenCommandLineBuilder commandLineBuilder = new MavenCommandLineBuilder();
Commandline commandline = commandLineBuilder.build( request );
assertEnvironmentVariablePresent( commandline, envVar1Name, envVar1Value );
assertEnvironmentVariablePresent( commandline, envVar2Name, envVar2Value );
}
@Before
public void setUp()
{
sysProps = System.getProperties();
Properties p = new Properties( sysProps );
System.setProperties( p );
}
@After
public void tearDown()
throws IOException
{
System.setProperties( sysProps );
for ( File file : toDelete )
{
if ( file.exists() )
{
if ( file.isDirectory() )
{
FileUtils.deleteDirectory( file );
}
else
{
file.delete();
}
}
}
}
// this is just a debugging helper for separating unit test output...
private void logTestStart()
{
NullPointerException npe = new NullPointerException();
StackTraceElement element = npe.getStackTrace()[1];
System.out.println( "Starting: " + element.getMethodName() );
}
private void assertEnvironmentVariablePresent( Commandline cli, String varName, String varValue )
throws CommandLineException
{
List<String> environmentVariables = Arrays.asList( cli.getEnvironmentVariables() );
String expectedDeclaration = varName + "=" + varValue;
assertTrue( "Environment variable setting: \'" + expectedDeclaration + "\' is mssing in "
+ environmentVariables, environmentVariables.contains( expectedDeclaration ) );
}
private void assertArgumentsPresentInOrder( Commandline cli, String... expected )
{
assertArgumentsPresentInOrder( cli, Arrays.asList( expected ) );
}
private void assertArgumentsPresentInOrder( Commandline cli, List<String> expected )
{
String[] arguments = cli.getArguments();
int expectedCounter = 0;
for ( int i = 0; i < arguments.length; i++ )
{
if ( arguments[i].equals( expected.get( expectedCounter ) ) )
{
expectedCounter++;
}
}
assertEquals( "Arguments: " + expected + " were not found or are in the wrong order: "
+ Arrays.asList( arguments ), expected.size(), expectedCounter );
}
private void assertArgumentsPresent( Commandline cli, Set<String> requiredArgs )
{
String[] argv = cli.getArguments();
List<String> args = Arrays.asList( argv );
for ( String arg : requiredArgs )
{
assertTrue( "Command-line argument: \'" + arg + "\' is missing in " + args, args.contains( arg ) );
}
}
private void assertArgumentsNotPresent( Commandline cli, Set<String> bannedArgs )
{
String[] argv = cli.getArguments();
List<String> args = Arrays.asList( argv );
for ( String arg : bannedArgs )
{
assertFalse( "Command-line argument: \'" + arg + "\' should not be present.", args.contains( arg ) );
}
}
private File createDummyFile( File directory, String filename )
throws IOException
{
File dummyFile = new File( directory, filename );
FileWriter writer = null;
try
{
writer = new FileWriter( dummyFile );
writer.write( "This is a dummy file." );
}
finally
{
IOUtil.close( writer );
}
toDelete.add( dummyFile );
return dummyFile;
}
private static final class TestCommandLineBuilder
extends MavenCommandLineBuilder
{
public void checkRequiredState()
throws IOException
{
super.checkRequiredState();
}
public File findMavenExecutable()
throws CommandLineConfigurationException, IOException
{
return super.findMavenExecutable();
}
public void setEnvironmentPaths( InvocationRequest request, Commandline cli )
{
super.setEnvironmentPaths( request, cli );
}
public void setFlags( InvocationRequest request, Commandline cli )
{
super.setFlags( request, cli );
}
public void setGoals( InvocationRequest request, Commandline cli )
{
super.setGoals( request, cli );
}
public void setPomLocation( InvocationRequest request, Commandline cli )
{
super.setPomLocation( request, cli );
}
public void setProperties( InvocationRequest request, Commandline cli )
{
super.setProperties( request, cli );
}
public void setReactorBehavior( InvocationRequest request, Commandline cli )
{
super.setReactorBehavior( request, cli );
}
public void setSettingsLocation( InvocationRequest request, Commandline cli )
{
super.setSettingsLocation( request, cli );
}
public void setShellEnvironment( InvocationRequest request, Commandline cli )
throws CommandLineConfigurationException
{
super.setShellEnvironment( request, cli );
}
}
private File getTempDir()
throws Exception
{
return new File( System.getProperty( "java.io.tmpdir" ) ).getCanonicalFile();
}
private InvocationRequest newRequest()
{
return new DefaultInvocationRequest();
}
}