blob: eb676599130a07399347666e57092ef7b87677b9 [file] [log] [blame]
/*
* 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.
*/
package org.apache.maven.plugin;
import javax.inject.Inject;
import java.io.File;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Properties;
import org.apache.maven.AbstractCoreMavenComponentTestCase;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.api.Artifact;
import org.apache.maven.api.MojoExecution;
import org.apache.maven.api.Session;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.configuration.internal.EnhancedComponentConfigurator;
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.internal.impl.AbstractSession;
import org.apache.maven.internal.impl.DefaultMojoExecution;
import org.apache.maven.internal.impl.DefaultProject;
import org.apache.maven.internal.impl.DefaultSession;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.interpolation.reflection.IntrospectionException;
import org.apache.maven.model.root.RootLocator;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.CycleDetectedException;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.MutablePlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.configuration.DefaultPlexusConfiguration;
import org.codehaus.plexus.util.Os;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.graph.DefaultDependencyNode;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
import org.junit.jupiter.api.Test;
import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
/**
*/
public class PluginParameterExpressionEvaluatorV4Test extends AbstractCoreMavenComponentTestCase {
private static final String FS = File.separator;
@Inject
PlexusContainer container;
@Inject
private MavenRepositorySystem factory;
private Path rootDirectory;
@Test
public void testPluginDescriptorExpressionReference() throws Exception {
Session session = newSession();
MojoExecution exec = newMojoExecution(session);
Object result =
new PluginParameterExpressionEvaluatorV4(session, null, exec).evaluate("${mojo.plugin.descriptor}");
System.out.println("Result: " + result);
assertSame(
exec.getPlugin().getDescriptor(),
result,
"${mojo.plugin.descriptor} expression does not return plugin descriptor.");
}
@Test
public void testPluginArtifactsExpressionReference() throws Exception {
Session session = newSession();
MojoExecution exec = newMojoExecution(session);
@SuppressWarnings("unchecked")
Collection<Artifact> depResults = (Collection<Artifact>)
new PluginParameterExpressionEvaluatorV4(session, null, exec).evaluate("${mojo.plugin.dependencies}");
System.out.println("Result: " + depResults);
assertNotNull(depResults);
assertEquals(1, depResults.size());
assertEquals(
exec.getPlugin().getArtifact().key(),
depResults.iterator().next().key(),
"dependency artifact is wrong.");
}
@Test
public void testPluginArtifactMapExpressionReference() throws Exception {
Session session = newSession();
MojoExecution exec = newMojoExecution(session);
@SuppressWarnings("unchecked")
Map<String, org.apache.maven.api.Dependency> depResults = (Map<String, org.apache.maven.api.Dependency>)
new PluginParameterExpressionEvaluatorV4(session, null, exec)
.evaluate("${mojo.plugin.dependenciesMap}");
System.out.println("Result: " + depResults);
assertNotNull(depResults);
assertEquals(1, depResults.size());
assertTrue(depResults.containsKey("org.myco.plugins:my-plugin"));
assertEquals(
exec.getPlugin().getArtifact().key(),
depResults.get("org.myco.plugins:my-plugin").key(),
"dependency artifact is wrong.");
}
@Test
public void testPluginArtifactIdExpressionReference() throws Exception {
Session session = newSession();
MojoExecution exec = newMojoExecution(session);
Object result = new PluginParameterExpressionEvaluatorV4(session, null, exec)
.evaluate("${mojo.plugin.artifact.artifactId}");
System.out.println("Result: " + result);
assertSame(
exec.getPlugin().getArtifact().getArtifactId(),
result,
"${plugin.artifactId} expression does not return plugin descriptor's artifactId.");
}
@Test
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, new Properties());
Object value = expressionEvaluator.evaluate("${project.build.directory}/classes");
String actual = new File(value.toString()).getCanonicalPath();
assertEquals(expected, actual);
}
@Test
public void testEscapedVariablePassthrough() throws Exception {
String var = "${var}";
Model model = new Model();
model.setVersion("1");
MavenProject project = new MavenProject(model);
ExpressionEvaluator ee = createExpressionEvaluator(project, new Properties());
Object value = ee.evaluate("$" + var);
assertEquals(var, value);
}
@Test
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, new Properties());
Object value = ee.evaluate("$" + key);
assertEquals("${var} with version: 1", value);
}
@Test
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, new Properties());
Object value = ee.evaluate(key);
assertEquals("test with version: 1", value);
}
@Test
public void testMissingPOMPropertyRefInLargerExpression() throws Exception {
String expr = "/path/to/someproject-${baseVersion}";
MavenProject project = new MavenProject(new Model());
ExpressionEvaluator ee = createExpressionEvaluator(project, new Properties());
Object value = ee.evaluate(expr);
assertEquals(expr, value);
}
@Test
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, new Properties());
Object value = ee.evaluate("${" + key + "}");
assertEquals(checkValue, value);
}
@Test
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, executionProperties);
Object value = ee.evaluate("${" + sysprop + "}");
assertEquals("value", value);
}
@Test
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, executionProperties);
Object value = ee.evaluate("${" + sysprop + "}");
assertEquals("value", value);
}
@SuppressWarnings("deprecation")
private static MavenSession createSession(PlexusContainer container, ArtifactRepository repo, Properties properties)
throws CycleDetectedException, DuplicateProjectException, NoLocalRepositoryManagerException {
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
.setSystemProperties(properties)
.setGoals(Collections.<String>emptyList())
.setBaseDirectory(new File(""))
.setLocalRepository(repo);
DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
repositorySession.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory()
.newInstance(repositorySession, new LocalRepository(repo.getUrl())));
MavenSession session =
new MavenSession(container, repositorySession, request, new DefaultMavenExecutionResult());
session.setProjects(Collections.<MavenProject>emptyList());
return session;
}
@Test
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), new Properties());
Object value = expressionEvaluator.evaluate("${project.build.directory}" + FS + "${project.build.finalName}");
assertEquals("expected-directory" + File.separatorChar + "expected-finalName", value);
}
@Test
public void testShouldExtractPluginArtifacts() throws Exception {
ExpressionEvaluator ee = createExpressionEvaluator(createDefaultProject(), new Properties());
Object value = ee.evaluate("${mojo.plugin.dependencies}");
assertTrue(value instanceof Collection);
@SuppressWarnings("unchecked")
Collection<Artifact> artifacts = (Collection<Artifact>) value;
assertEquals(1, artifacts.size());
Artifact result = artifacts.iterator().next();
assertEquals("org.myco.plugins", result.getGroupId());
}
@Test
void testRootDirectoryNotPrefixed() throws Exception {
ExpressionEvaluator ee = createExpressionEvaluator(createDefaultProject(), new Properties());
assertNull(ee.evaluate("${rootDirectory}"));
}
@Test
void testRootDirectoryWithNull() throws Exception {
ExpressionEvaluator ee = createExpressionEvaluator(createDefaultProject(), new Properties());
Exception e = assertThrows(Exception.class, () -> ee.evaluate("${session.rootDirectory}"));
e = assertInstanceOf(IntrospectionException.class, e.getCause());
e = assertInstanceOf(IllegalStateException.class, e.getCause());
assertEquals(RootLocator.UNABLE_TO_FIND_ROOT_PROJECT_MESSAGE, e.getMessage());
}
@Test
void testRootDirectory() throws Exception {
this.rootDirectory = Paths.get("myRootDirectory");
ExpressionEvaluator ee = createExpressionEvaluator(createDefaultProject(), new Properties());
assertInstanceOf(Path.class, ee.evaluate("${session.rootDirectory}"));
}
private MavenProject createDefaultProject() {
return new MavenProject(new Model());
}
private ExpressionEvaluator createExpressionEvaluator(MavenProject project, Properties executionProperties)
throws Exception {
ArtifactRepository repo = getLocalRepository();
MutablePlexusContainer container = (MutablePlexusContainer) getContainer();
MavenSession mavenSession = createSession(container, repo, executionProperties);
mavenSession.setCurrentProject(project);
mavenSession.getRequest().setRootDirectory(rootDirectory);
mavenSession.getRequest().setTopDirectory(rootDirectory);
DefaultSession session =
new DefaultSession(mavenSession, mock(RepositorySystem.class), null, null, container, null);
MojoExecution mojoExecution = newMojoExecution(session);
return new PluginParameterExpressionEvaluatorV4(
session, project != null ? new DefaultProject(session, project) : null, mojoExecution);
}
private MojoExecution newMojoExecution(Session session) {
PluginDescriptor pd = new PluginDescriptor();
pd.setArtifactId("my-plugin");
pd.setGroupId("org.myco.plugins");
pd.setVersion("1");
DefaultArtifact artifact = new DefaultArtifact(
pd.getGroupId(),
pd.getArtifactId(),
pd.getVersion(),
"compile",
"maven-plugin",
"",
new DefaultArtifactHandler("maven-plugin"));
pd.setPluginArtifact(artifact);
pd.setArtifacts(Collections.singletonList(artifact));
DefaultDependencyNode node = new DefaultDependencyNode(
new org.eclipse.aether.graph.Dependency(RepositoryUtils.toArtifact(artifact), "compile"));
pd.setDependencyNode(node);
MojoDescriptor md = new MojoDescriptor();
md.setGoal("my-goal");
md.setPluginDescriptor(pd);
pd.addComponentDescriptor(md);
return new DefaultMojoExecution((AbstractSession) session, new org.apache.maven.plugin.MojoExecution(md));
}
private DefaultSession newSession() throws Exception {
DefaultSession session =
new DefaultSession(newMavenSession(), mock(RepositorySystem.class), null, null, container, null);
return session;
}
private MavenSession newMavenSession() throws Exception {
return createMavenSession(null);
}
@Test
public void testUri() throws Exception {
Path path = Paths.get("").toAbsolutePath();
MavenSession mavenSession = createMavenSession(null);
mavenSession.getRequest().setTopDirectory(path);
mavenSession.getRequest().setRootDirectory(path);
Object result = new PluginParameterExpressionEvaluatorV4(mavenSession.getSession(), null)
.evaluate("${session.rootDirectory.uri}");
assertEquals(path.toUri(), result);
}
@Test
public void testPath() throws Exception {
Path path = Paths.get("").toAbsolutePath();
MavenSession mavenSession = createMavenSession(null);
mavenSession.getRequest().setTopDirectory(path);
mavenSession.getRequest().setRootDirectory(path);
Object result = new PluginParameterExpressionEvaluatorV4(mavenSession.getSession(), null)
.evaluate("${session.rootDirectory/target}");
assertEquals(path.resolve("target"), result);
}
@Test
public void testPluginInjection() throws Exception {
Path path = Paths.get("rép➜α").toAbsolutePath();
MavenSession mavenSession = createMavenSession(null);
mavenSession.getRequest().setTopDirectory(path);
mavenSession.getRequest().setRootDirectory(path);
DefaultModelBuildingRequest mbr = new DefaultModelBuildingRequest();
PluginParameterExpressionEvaluatorV4 evaluator =
new PluginParameterExpressionEvaluatorV4(mavenSession.getSession(), null);
DefaultPlexusConfiguration configuration = new DefaultPlexusConfiguration("config");
configuration.addChild("uri", "${session.rootDirectory.uri}");
configuration.addChild("path", "${session.rootDirectory}");
configuration.addChild("uriString", "${session.rootDirectory.uri.string}");
configuration.addChild("uriAsciiString", "${session.rootDirectory.uri.ASCIIString}");
configuration.addChild("pathString", "${session.rootDirectory.string}");
Mojo mojo = new Mojo();
new EnhancedComponentConfigurator().configureComponent(mojo, configuration, evaluator, null);
assertEquals(
Objects.equals(path.toUri().toString(), path.toUri().toASCIIString()), !Os.isFamily(Os.FAMILY_WINDOWS));
assertEquals(mojo.uri, path.toUri());
assertEquals(mojo.path, path);
assertEquals(mojo.uriString, path.toUri().toString());
assertEquals(mojo.uriAsciiString, path.toUri().toASCIIString());
assertEquals(mojo.pathString, path.toString());
}
@Override
protected String getProjectsDirectory() {
// TODO Auto-generated method stub
return null;
}
public static class Mojo {
URI uri;
Path path;
String uriString;
String uriAsciiString;
String pathString;
}
}