blob: e579d691e2f6c021003b3cc8e9a42dbeed60aac9 [file] [log] [blame]
package org.apache.maven.plugin;
/*
* 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.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.AbstractCoreMavenComponentTestCase;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.MutablePlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import javax.inject.Inject;
/**
* @author Jason van Zyl
*/
public class PluginParameterExpressionEvaluatorTest
extends AbstractCoreMavenComponentTestCase
{
private static final String FS = File.separator;
@Inject
private RepositorySystem factory;
@Override
protected void tearDown()
throws Exception
{
factory = null;
super.tearDown();
}
public void testPluginDescriptorExpressionReference()
throws Exception
{
MojoExecution exec = newMojoExecution();
MavenSession session = newMavenSession();
Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin}" );
System.out.println( "Result: " + result );
assertSame( "${plugin} expression does not return plugin descriptor.",
exec.getMojoDescriptor().getPluginDescriptor(),
result );
}
public void testPluginArtifactsExpressionReference()
throws Exception
{
MojoExecution exec = newMojoExecution();
Artifact depArtifact = createArtifact( "group", "artifact", "1" );
List<Artifact> deps = new ArrayList<>();
deps.add( depArtifact );
exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps );
MavenSession session = newMavenSession();
@SuppressWarnings( "unchecked" )
List<Artifact> depResults =
(List<Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifacts}" );
System.out.println( "Result: " + depResults );
assertNotNull( depResults );
assertEquals( 1, depResults.size() );
assertSame( "dependency artifact is wrong.", depArtifact, depResults.get( 0 ) );
}
public void testPluginArtifactMapExpressionReference()
throws Exception
{
MojoExecution exec = newMojoExecution();
Artifact depArtifact = createArtifact( "group", "artifact", "1" );
List<Artifact> deps = new ArrayList<>();
deps.add( depArtifact );
exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps );
MavenSession session = newMavenSession();
@SuppressWarnings( "unchecked" )
Map<String, Artifact> depResults =
(Map<String, Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactMap}" );
System.out.println( "Result: " + depResults );
assertNotNull( depResults );
assertEquals( 1, depResults.size() );
assertSame( "dependency artifact is wrong.",
depArtifact,
depResults.get( ArtifactUtils.versionlessKey( depArtifact ) ) );
}
public void testPluginArtifactIdExpressionReference()
throws Exception
{
MojoExecution exec = newMojoExecution();
MavenSession session = newMavenSession();
Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactId}" );
System.out.println( "Result: " + result );
assertSame( "${plugin.artifactId} expression does not return plugin descriptor's artifactId.",
exec.getMojoDescriptor().getPluginDescriptor().getArtifactId(),
result );
}
public void testValueExtractionWithAPomValueContainingAPath()
throws Exception
{
String expected = getTestFile( "target/test-classes/target/classes" ).getCanonicalPath();
Build build = new Build();
build.setDirectory( expected.substring( 0, expected.length() - "/classes".length() ) );
Model model = new Model();
model.setBuild( build );
MavenProject project = new MavenProject( model );
project.setFile( new File( "pom.xml" ).getCanonicalFile() );
ExpressionEvaluator expressionEvaluator = createExpressionEvaluator( project, null, new Properties() );
Object value = expressionEvaluator.evaluate( "${project.build.directory}/classes" );
String actual = new File( value.toString() ).getCanonicalPath();
assertEquals( expected, actual );
}
public void testEscapedVariablePassthrough()
throws Exception
{
String var = "${var}";
Model model = new Model();
model.setVersion( "1" );
MavenProject project = new MavenProject( model );
ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
Object value = ee.evaluate( "$" + var );
assertEquals( var, value );
}
public void testEscapedVariablePassthroughInLargerExpression()
throws Exception
{
String var = "${var}";
String key = var + " with version: ${project.version}";
Model model = new Model();
model.setVersion( "1" );
MavenProject project = new MavenProject( model );
ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
Object value = ee.evaluate( "$" + key );
assertEquals( "${var} with version: 1", value );
}
public void testMultipleSubExpressionsInLargerExpression()
throws Exception
{
String key = "${project.artifactId} with version: ${project.version}";
Model model = new Model();
model.setArtifactId( "test" );
model.setVersion( "1" );
MavenProject project = new MavenProject( model );
ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
Object value = ee.evaluate( key );
assertEquals( "test with version: 1", value );
}
public void testMissingPOMPropertyRefInLargerExpression()
throws Exception
{
String expr = "/path/to/someproject-${baseVersion}";
MavenProject project = new MavenProject( new Model() );
ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
Object value = ee.evaluate( expr );
assertEquals( expr, value );
}
public void testPOMPropertyExtractionWithMissingProject_WithDotNotation()
throws Exception
{
String key = "m2.name";
String checkValue = "value";
Properties properties = new Properties();
properties.setProperty( key, checkValue );
Model model = new Model();
model.setProperties( properties );
MavenProject project = new MavenProject( model );
ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
Object value = ee.evaluate( "${" + key + "}" );
assertEquals( checkValue, value );
}
public void testBasedirExtractionWithMissingProject()
throws Exception
{
ExpressionEvaluator ee = createExpressionEvaluator( null, null, new Properties() );
Object value = ee.evaluate( "${basedir}" );
assertEquals( System.getProperty( "user.dir" ), value );
}
public void testValueExtractionFromSystemPropertiesWithMissingProject()
throws Exception
{
String sysprop = "PPEET_sysprop1";
Properties executionProperties = new Properties();
if ( executionProperties.getProperty( sysprop ) == null )
{
executionProperties.setProperty( sysprop, "value" );
}
ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties );
Object value = ee.evaluate( "${" + sysprop + "}" );
assertEquals( "value", value );
}
public void testValueExtractionFromSystemPropertiesWithMissingProject_WithDotNotation()
throws Exception
{
String sysprop = "PPEET.sysprop2";
Properties executionProperties = new Properties();
if ( executionProperties.getProperty( sysprop ) == null )
{
executionProperties.setProperty( sysprop, "value" );
}
ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties );
Object value = ee.evaluate( "${" + sysprop + "}" );
assertEquals( "value", value );
}
@SuppressWarnings( "deprecation" )
private static MavenSession createSession( PlexusContainer container, ArtifactRepository repo, Properties properties )
throws CycleDetectedException, DuplicateProjectException
{
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
.setSystemProperties( properties )
.setGoals( Collections.<String>emptyList() )
.setBaseDirectory( new File( "" ) )
.setLocalRepository( repo );
return new MavenSession( container, request, new DefaultMavenExecutionResult(), Collections.<MavenProject>emptyList() );
}
public void testLocalRepositoryExtraction()
throws Exception
{
ExpressionEvaluator expressionEvaluator =
createExpressionEvaluator( createDefaultProject(), null, new Properties() );
Object value = expressionEvaluator.evaluate( "${localRepository}" );
assertEquals( "local", ( (ArtifactRepository) value ).getId() );
}
public void testTwoExpressions()
throws Exception
{
Build build = new Build();
build.setDirectory( "expected-directory" );
build.setFinalName( "expected-finalName" );
Model model = new Model();
model.setBuild( build );
ExpressionEvaluator expressionEvaluator =
createExpressionEvaluator( new MavenProject( model ), null, new Properties() );
Object value = expressionEvaluator.evaluate( "${project.build.directory}" + FS + "${project.build.finalName}" );
assertEquals( "expected-directory" + File.separatorChar + "expected-finalName", value );
}
public void testShouldExtractPluginArtifacts()
throws Exception
{
PluginDescriptor pd = new PluginDescriptor();
Artifact artifact = createArtifact( "testGroup", "testArtifact", "1.0" );
pd.setArtifacts( Collections.singletonList( artifact ) );
ExpressionEvaluator ee = createExpressionEvaluator( createDefaultProject(), pd, new Properties() );
Object value = ee.evaluate( "${plugin.artifacts}" );
assertTrue( value instanceof List );
@SuppressWarnings( "unchecked" )
List<Artifact> artifacts = (List<Artifact>) value;
assertEquals( 1, artifacts.size() );
Artifact result = artifacts.get( 0 );
assertEquals( "testGroup", result.getGroupId() );
}
private MavenProject createDefaultProject()
{
return new MavenProject( new Model() );
}
private ExpressionEvaluator createExpressionEvaluator( MavenProject project, PluginDescriptor pluginDescriptor, Properties executionProperties )
throws Exception
{
ArtifactRepository repo = factory.createDefaultLocalRepository();
MutablePlexusContainer container = (MutablePlexusContainer) getContainer();
MavenSession session = createSession( container, repo, executionProperties );
session.setCurrentProject( project );
MojoDescriptor mojo = new MojoDescriptor();
mojo.setPluginDescriptor( pluginDescriptor );
mojo.setGoal( "goal" );
MojoExecution mojoExecution = new MojoExecution( mojo );
return new PluginParameterExpressionEvaluator( session, mojoExecution );
}
protected Artifact createArtifact( String groupId, String artifactId, String version )
throws Exception
{
Dependency dependency = new Dependency();
dependency.setGroupId( groupId );
dependency.setArtifactId( artifactId );
dependency.setVersion( version );
dependency.setType( "jar" );
dependency.setScope( "compile" );
return factory.createDependencyArtifact( dependency );
}
private MojoExecution newMojoExecution()
{
PluginDescriptor pd = new PluginDescriptor();
pd.setArtifactId( "my-plugin" );
pd.setGroupId( "org.myco.plugins" );
pd.setVersion( "1" );
MojoDescriptor md = new MojoDescriptor();
md.setPluginDescriptor( pd );
pd.addComponentDescriptor( md );
return new MojoExecution( md );
}
private MavenSession newMavenSession()
throws Exception
{
return createMavenSession( null );
}
@Override
protected String getProjectsDirectory()
{
// TODO Auto-generated method stub
return null;
}
}