blob: a9673cc04127459498c5850133a996ccf9ef6086 [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
*
* https://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.ivy.plugins.parser.m2;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
import org.apache.ivy.core.module.descriptor.DependencyArtifactDescriptor;
import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ExcludeRule;
import org.apache.ivy.core.module.descriptor.License;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.resolve.ResolveData;
import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.parser.AbstractModuleDescriptorParserTester;
import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParserTest;
import org.apache.ivy.plugins.repository.url.URLResource;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.plugins.resolver.MockResolver;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
public class PomModuleDescriptorParserTest extends AbstractModuleDescriptorParserTester {
private IvySettings settings = new IvySettings();
private class MockedDependencyResolver extends MockResolver {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
// TODO make it a real mock and check that dd and data are the one that are expected
final ModuleDescriptor moduleDesc = getModuleDescriptor(dd);
return new ResolvedModuleRevision(this, this, moduleDesc, null);
}
protected ModuleDescriptor getModuleDescriptor(final DependencyDescriptor dependencyDescriptor) {
return DefaultModuleDescriptor.newDefaultInstance(dependencyDescriptor.getDependencyRevisionId());
}
}
private File dest = new File("build/test/test-write.xml");
private MockResolver mockedResolver = new MockedDependencyResolver();
@Rule
public ExpectedException expExc = ExpectedException.none();
@Rule
public TemporaryFolder workDir = new TemporaryFolder();
@Before
public void setUp() {
settings.setDictatorResolver(mockedResolver);
if (dest.exists()) {
dest.delete();
}
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
}
@After
public void tearDown() {
if (dest.exists()) {
dest.delete();
}
}
@Test
public void testAccept() {
assertTrue(PomModuleDescriptorParser.getInstance().accept(
new URLResource(getClass().getResource("test-simple.pom"))));
assertFalse(PomModuleDescriptorParser.getInstance().accept(
new URLResource(XmlModuleDescriptorParserTest.class.getResource("test.xml"))));
}
@Test
public void testSimple() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-simple.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
assertNotNull(md.getConfigurations());
assertEquals(Arrays.asList(PomModuleDescriptorBuilder.MAVEN2_CONFIGURATIONS),
Arrays.asList(md.getConfigurations()));
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
assertEquals("jar", artifact[0].getExt());
assertEquals("jar", artifact[0].getType());
}
@Test
public void testLargePom() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-large-pom.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache.myfaces", "myfaces", "6");
assertEquals(mrid, md.getModuleRevisionId());
}
@Test
public void testPackaging() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-packaging.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
assertEquals("war", artifact[0].getExt());
assertEquals("war", artifact[0].getType());
}
@Test
public void testEjbPackaging() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-ejb-packaging.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
assertEquals("jar", artifact[0].getExt());
assertEquals("ejb", artifact[0].getType());
}
@Test
public void testEjbType() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-ejb-type.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test-ejb-type", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
DependencyDescriptor[] deps = md.getDependencies();
assertNotNull(deps);
assertEquals(1, deps.length);
DependencyArtifactDescriptor[] artifacts = deps[0].getAllDependencyArtifacts();
assertNotNull(artifacts);
assertEquals(1, artifacts.length);
assertEquals("test", artifacts[0].getName());
assertEquals("jar", artifacts[0].getExt());
assertEquals("ejb", artifacts[0].getType());
}
@Test
public void testParent() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parent.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
}
@Test
public void testParentNotFound() throws Exception {
expExc.expect(IOException.class);
expExc.expectMessage("Impossible to load parent");
PomModuleDescriptorParser.getInstance().parseDescriptor(new IvySettings(),
getClass().getResource("test-parent-not-found.pom"), false);
}
@Test
public void testParent2() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parent2.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
}
@Test
public void testParentVersion() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parent.version.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
}
@Test
public void testParentGroupId() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parent.groupid.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
}
@Test
public void testProjectParentVersion() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-project.parent.version.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
}
@Test
public void testDependencies() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals("There is no special artifact when there is no classifier", 0,
dds[0].getAllDependencyArtifacts().length);
}
@Test
public void testDependenciesWithClassifier() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies-with-classifier.pom"), true);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
Map<String, String> extraAtt = Collections.singletonMap("classifier", "asl");
assertEquals(1, dds[0].getAllDependencyArtifacts().length);
assertEquals(extraAtt, dds[0].getAllDependencyArtifacts()[0].getExtraAttributes());
// now we verify the conversion to an Ivy file
PomModuleDescriptorParser.getInstance().toIvyFile(
getClass().getResource("test-dependencies-with-classifier.pom").openStream(),
new URLResource(getClass().getResource("test-dependencies-with-classifier.pom")), dest,
md);
assertTrue(dest.exists());
// the converted Ivy file should be parsable with validate=true
ModuleDescriptor md2 = XmlModuleDescriptorParser.getInstance().parseDescriptor(
new IvySettings(), dest.toURI().toURL(), true);
// and the parsed module descriptor should be similar to the original
assertNotNull(md2);
assertEquals(md.getModuleRevisionId(), md2.getModuleRevisionId());
dds = md2.getDependencies();
assertEquals(1, dds[0].getAllDependencyArtifacts().length);
assertEquals(extraAtt, dds[0].getAllDependencyArtifacts()[0].getExtraAttributes());
}
/**
* @see "https://issues.apache.org/jira/browse/IVY-1642"
*/
@Test
public void testDependenciesWithAndWithoutClassifier() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies-with-and-without-classifier.pom"), true);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(5, dds.length);
Map<String, String> extraAtt = Collections.singletonMap("classifier", "asl");
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
DependencyArtifactDescriptor[] dads = dds[0].getAllDependencyArtifacts();
assertEquals(2, dads.length);
assertEquals(Collections.emptyMap(), dads[0].getExtraAttributes());
assertEquals(extraAtt, dads[1].getExtraAttributes());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging2", "1.0.4"),
dds[1].getDependencyRevisionId());
dads = dds[1].getAllDependencyArtifacts();
assertEquals(2, dads.length);
assertEquals(Collections.emptyMap(), dads[1].getExtraAttributes());
assertEquals(extraAtt, dads[0].getExtraAttributes());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging3", "1.0.4"),
dds[2].getDependencyRevisionId());
dads = dds[2].getAllDependencyArtifacts();
assertEquals(2, dads.length);
assertEquals(extraAtt, dads[0].getExtraAttributes());
assertEquals(Collections.singletonMap("classifier", "foo"),
dads[1].getExtraAttributes());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging4", "1.0.4"),
dds[3].getDependencyRevisionId());
dads = dds[3].getAllDependencyArtifacts();
assertEquals(2, dads.length);
assertEquals(Collections.emptyMap(), dads[0].getExtraAttributes());
assertEquals(extraAtt, dads[1].getExtraAttributes());
DependencyArtifactDescriptor[] providedDads = dds[3].getDependencyArtifacts("provided");
assertEquals(1, providedDads.length);
assertSame(dads[0], providedDads[0]);
DependencyArtifactDescriptor[] compileDads = dds[3].getDependencyArtifacts("compile");
assertEquals(1, compileDads.length);
assertSame(dads[1], compileDads[0]);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging5", "1.0.4"),
dds[4].getDependencyRevisionId());
dads = dds[4].getAllDependencyArtifacts();
assertEquals(2, dads.length);
assertEquals(extraAtt, dads[0].getExtraAttributes());
assertEquals(Collections.emptyMap(), dads[1].getExtraAttributes());
providedDads = dds[4].getDependencyArtifacts("provided");
assertEquals(1, providedDads.length);
assertSame(dads[1], providedDads[0]);
compileDads = dds[4].getDependencyArtifacts("compile");
assertEquals(1, compileDads.length);
assertSame(dads[0], compileDads[0]);
// now we verify the conversion to an Ivy file
PomModuleDescriptorParser.getInstance().toIvyFile(
getClass().getResource("test-dependencies-with-and-without-classifier.pom").openStream(),
new URLResource(getClass().getResource("test-dependencies-with-and-without-classifier.pom")), dest,
md);
assertTrue(dest.exists());
// the converted Ivy file should be parsable with validate=true
ModuleDescriptor md2 = XmlModuleDescriptorParser.getInstance().parseDescriptor(
new IvySettings(), dest.toURI().toURL(), true);
// and the parsed module descriptor should be similar to the original
assertNotNull(md2);
assertEquals(md.getModuleRevisionId(), md2.getModuleRevisionId());
dds = md2.getDependencies();
assertEquals(5, dds.length);
for (int i = 0; i < dds.length; i++) {
assertEquals(2, dds[i].getAllDependencyArtifacts().length);
int withExt = i == 0 || i == 3 ? 1: 0;
assertEquals(extraAtt, dds[i].getAllDependencyArtifacts()[withExt].getExtraAttributes());
}
}
@Test
public void testDependenciesWithType() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies-with-type.pom"), true);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals(1, dds[0].getAllDependencyArtifacts().length);
assertEquals("dll", dds[0].getAllDependencyArtifacts()[0].getExt());
assertEquals("dll", dds[0].getAllDependencyArtifacts()[0].getType());
}
@Test
public void testWithVersionPropertyAndPropertiesTag() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-version.pom"), false);
assertNotNull(md);
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(2, dds.length);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-other", "1.0"),
dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-yet-other", "5.76"),
dds[1].getDependencyRevisionId());
}
/**
* Test case for IVY-392.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-392">IVY-392</a>
*/
@Test
public void testDependenciesWithInactiveProfile() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies-with-profile.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
}
@Test
public void testWithoutVersion() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-without-version.pom"), false);
assertNotNull(md);
assertEquals(new ModuleId("org.apache", "test"), md.getModuleRevisionId().getModuleId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
}
@Test
public void testProperties() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-properties.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("drools", "drools-smf", "2.0-beta-18"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("drools", "drools-core", "2.0-beta-18"),
dds[0].getDependencyRevisionId());
}
@Test
public void testReal() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("commons-lang-1.0.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("commons-lang", "commons-lang", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("junit", "junit", "3.7"),
dds[0].getDependencyRevisionId());
}
@Test
public void testReal2() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("wicket-1.3-incubating-SNAPSHOT.pom"), false);
assertNotNull(md);
assertEquals(
ModuleRevisionId.newInstance("org.apache.wicket", "wicket", "1.3-incubating-SNAPSHOT"),
md.getModuleRevisionId());
}
/**
* Test case for IVY-425.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-425">IVY-425</a>
*/
@Test
public void testVariables() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("spring-hibernate3-2.0.2.pom"), false);
assertNotNull(md);
assertEquals(
ModuleRevisionId.newInstance("org.springframework", "spring-hibernate3", "2.0.2"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(11, dds.length);
assertEquals(ModuleRevisionId.newInstance("org.springframework", "spring-web", "2.0.2"),
dds[10].getDependencyRevisionId());
}
/**
* Test case for IVY-423.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-423">IVY-423</a>
*/
@Test
public void testDependenciesInProfile() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("mule-module-builders-1.3.3.pom"), false);
assertNotNull(md);
assertEquals(
ModuleRevisionId.newInstance("org.mule.modules", "mule-module-builders", "1.3.3"),
md.getModuleRevisionId());
}
/**
* Test case for IVY-424.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-424">IVY-424</a>
*/
@Test
public void testIVY424() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("shale-tiger-1.1.0-SNAPSHOT.pom"), false);
assertNotNull(md);
assertEquals(
ModuleRevisionId.newInstance("org.apache.shale", "shale-tiger", "1.1.0-SNAPSHOT"),
md.getModuleRevisionId());
}
@Test
public void testOptional() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-optional.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
assertTrue(Arrays.asList(md.getConfigurationsNames()).contains("optional"));
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(3, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals(new HashSet<>(Collections.singletonList("optional")),
new HashSet<>(Arrays.asList(dds[0].getModuleConfigurations())));
// I don't know what it should be. Ivy has no notion of optional dependencies
// assertEquals(new HashSet<>(Arrays.asList("compile(*)", "runtime(*)", "master(*)")),
// new HashSet<>(Arrays.asList(dds[0].getDependencyConfigurations("optional"))));
assertEquals(ModuleRevisionId.newInstance("cglib", "cglib", "2.0.2"),
dds[1].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[1].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("runtime"))));
assertEquals(ModuleRevisionId.newInstance("cglib", "cglib-extra", "2.0.2"),
dds[2].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[2].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("runtime"))));
}
@Test
public void testDependenciesWithScope() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencies-with-scope.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(3, dds.length);
assertEquals(ModuleRevisionId.newInstance("odmg", "odmg", "3.0"),
dds[0].getDependencyRevisionId());
assertEquals(new HashSet<>(Collections.singletonList("runtime")),
new HashSet<>(Arrays.asList(dds[0].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("compile(*)", "runtime(*)", "master(*)")),
new HashSet<>(Arrays.asList(dds[0].getDependencyConfigurations("runtime"))));
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[1].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[1].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("runtime"))));
assertEquals(ModuleRevisionId.newInstance("cglib", "cglib", "2.0.2"),
dds[2].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[2].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("runtime"))));
}
@Test
public void testExclusion() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-exclusion.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(4, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[0].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[0].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[0].getDependencyConfigurations("runtime"))));
assertEquals(0, dds[0].getAllExcludeRules().length);
assertEquals(ModuleRevisionId.newInstance("dom4j", "dom4j", "1.6"),
dds[1].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[1].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[1].getDependencyConfigurations("runtime"))));
assertDependencyModulesExcludes(dds[1], new String[] {"compile"},
new String[] {"jaxme-api", "jaxen"});
assertDependencyModulesExcludes(dds[1], new String[] {"runtime"},
new String[] {"jaxme-api", "jaxen"});
assertEquals(ModuleRevisionId.newInstance("cglib", "cglib", "2.0.2"),
dds[2].getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(dds[2].getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(dds[2].getDependencyConfigurations("runtime"))));
assertEquals(0, dds[2].getAllExcludeRules().length);
// test for IVY-1531 (where the pom.xml can have a exclusion for groupid=* and artifactid=*,
// implying transitive=false, in Ivy land)
final DependencyDescriptor excludeAllTransitiveDepsDescriptor = dds[3];
assertEquals(ModuleRevisionId.newInstance("org.owasp.esapi", "esapi", "2.1.0"),
excludeAllTransitiveDepsDescriptor.getDependencyRevisionId());
assertEquals(new HashSet<>(Arrays.asList("compile", "runtime")),
new HashSet<>(Arrays.asList(excludeAllTransitiveDepsDescriptor.getModuleConfigurations())));
assertEquals(new HashSet<>(Arrays.asList("master(*)", "compile(*)")),
new HashSet<>(Arrays.asList(excludeAllTransitiveDepsDescriptor.getDependencyConfigurations("compile"))));
assertEquals(new HashSet<>(Collections.singletonList("runtime(*)")),
new HashSet<>(Arrays.asList(excludeAllTransitiveDepsDescriptor.getDependencyConfigurations("runtime"))));
assertEquals("No exclusion elements were expected to be present for " + excludeAllTransitiveDepsDescriptor,
0, excludeAllTransitiveDepsDescriptor.getAllExcludeRules().length);
assertFalse("Dependency " + excludeAllTransitiveDepsDescriptor + " was expected to have transitive=false",
excludeAllTransitiveDepsDescriptor.isTransitive());
}
/**
* Test case for IVY-417.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-417">IVY-417</a>
*/
@Test
public void testWithPlugins() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("mule-1.3.3.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.mule", "mule", "1.3.3"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(0, dds.length);
}
@Test
public void testHomeAndDescription() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("mule-1.3.3.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.mule", "mule", "1.3.3"),
md.getModuleRevisionId());
assertEquals("http://mule.mulesource.org", md.getHomePage());
assertEquals(
"Mule is a simple yet robust and highly scalable Integration and ESB services "
+ "framework. It is designed\n as a light-weight, event-driven component "
+ "technology that handles communication with disparate systems\n "
+ "transparently providing a simple component interface.", md.getDescription()
.replaceAll("\r\n", "\n").replace('\r', '\n'));
}
@Test
public void testLicense() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("spring-hibernate3-2.0.2.pom"), false);
License[] licenses = md.getLicenses();
assertNotNull(licenses);
assertEquals(1, licenses.length);
assertEquals("The Apache Software License, Version 2.0", licenses[0].getName());
assertEquals("https://www.apache.org/licenses/LICENSE-2.0.txt", licenses[0].getUrl());
}
/**
* Tests that if a module doesn't have a license specified, then parent pom's license (if any)
* is used for the child module
*
* @throws Exception if something goes wrong
*/
@Test
public void testLicenseFromParent() throws Exception {
final IvySettings customIvySettings = createIvySettingsForParentLicenseTesting("test-parent-with-licenses.pom",
"org.apache", "test-ivy-license-parent");
final String pomFile = "test-project-with-parent-licenses.pom";
final ModuleDescriptor childModule = PomModuleDescriptorParser.getInstance().parseDescriptor(customIvySettings,
this.getClass().getResource(pomFile), false);
assertNotNull("Could not find " + pomFile, pomFile);
final License[] licenses = childModule.getLicenses();
assertNotNull("No licenses found in the module " + childModule, licenses);
assertEquals("Unexpected number of licenses found in the module " + childModule, 1, licenses.length);
assertEquals("Unexpected license name", "MIT License", licenses[0].getName());
assertEquals("Unexpected license URL", "http://opensource.org/licenses/MIT", licenses[0].getUrl());
}
/**
* Tests that if a project explicitly specifies the licenses, then the licenses (if any) from
* its parent pom aren't applied to the child project
*
* @throws Exception if something goes wrong
*/
@Test
public void testOverriddenLicense() throws Exception {
final IvySettings customIvySettings = createIvySettingsForParentLicenseTesting("test-parent-with-licenses.pom",
"org.apache", "test-ivy-license-parent");
final String pomFile = "test-project-with-overridden-licenses.pom";
final ModuleDescriptor childModule = PomModuleDescriptorParser.getInstance().parseDescriptor(customIvySettings,
this.getClass().getResource(pomFile), false);
assertNotNull("Could not find " + pomFile, pomFile);
final License[] licenses = childModule.getLicenses();
assertNotNull("No licenses found in the module " + childModule, licenses);
assertEquals("Unexpected number of licenses found in the module " + childModule, 1, licenses.length);
assertEquals("Unexpected license name", "The Apache Software License, Version 2.0", licenses[0].getName());
assertEquals("Unexpected license URL", "https://www.apache.org/licenses/LICENSE-2.0.txt", licenses[0].getUrl());
}
@Test
public void testDependencyManagement() throws ParseException, IOException {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencyMgt.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-depMgt", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals("There is no special artifact when there is no classifier", 0,
dds[0].getAllDependencyArtifacts().length);
assertEquals(4, md.getExtraInfos().size());
}
@Test
public void testDependencyManagementWithScope() throws ParseException, IOException {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-dependencyMgt-with-scope.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-depMgt", "1.1"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
assertEquals("There is no special artifact when there is no classifier", 0,
dds[0].getAllDependencyArtifacts().length);
assertEquals("The number of configurations is incorrect", 1,
dds[0].getModuleConfigurations().length);
assertEquals("The configuration must be test", "test", dds[0].getModuleConfigurations()[0]);
}
@Test
public void testParentDependencyMgt() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings,
getClass().getResource("test-dependencyMgt.pom"), false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parentDependencyMgt.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-parentdep", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(2, dds.length);
assertEquals(
ModuleRevisionId.newInstance("commons-collection", "commons-collection", "1.0.5"),
dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[1].getDependencyRevisionId());
ExcludeRule[] excludes = dds[0].getAllExcludeRules();
assertNotNull(excludes);
assertEquals(2, excludes.length);
assertEquals("javax.mail", excludes[0].getId().getModuleId().getOrganisation());
assertEquals("mail", excludes[0].getId().getModuleId().getName());
assertEquals("javax.jms", excludes[1].getId().getModuleId().getOrganisation());
assertEquals("jms", excludes[1].getId().getModuleId().getName());
}
@Test
public void testOverrideParentVersionPropertyDependencyMgt()
throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings,
getClass().getResource("test-versionPropertyDependencyMgt.pom"),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-overrideParentVersionPropertyDependencyMgt.pom"), false);
assertNotNull(md);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-parentdep", "1.0"),
md.getModuleRevisionId());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(2, dds.length);
assertEquals(
ModuleRevisionId.newInstance("commons-collections", "commons-collections", "3.2.1"),
dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.1.1"),
dds[1].getDependencyRevisionId());
ExcludeRule[] excludes = dds[0].getAllExcludeRules();
assertNotNull(excludes);
assertEquals(2, excludes.length);
assertEquals("javax.mail", excludes[0].getId().getModuleId().getOrganisation());
assertEquals("mail", excludes[0].getId().getModuleId().getName());
assertEquals("javax.jms", excludes[1].getId().getModuleId().getOrganisation());
assertEquals("jms", excludes[1].getId().getModuleId().getName());
}
@Test
public void testParentProperties() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings, getClass().getResource("test-version.pom"),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-parent-properties.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(3, dds.length);
// 2 are inherited from parent. Only the first one is important for this test
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-version-other", "5.76"),
dds[0].getDependencyRevisionId());
// present in the pom using a property defined in the parent
}
@Test
public void testOverrideParentProperties() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings, getClass().getResource("test-version.pom"),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-override-parent-properties.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(2, dds.length);
// 2 are inherited from parent. Only the first one is important for this test
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-yet-other", "5.79"),
dds[1].getDependencyRevisionId());
}
@Test
public void testOverrideGrandparentProperties() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
String resource;
if ("test".equals(dd.getDependencyId().getName())) {
resource = "test-parent-properties.pom";
} else {
resource = "test-version.pom";
}
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings, getClass().getResource(resource), false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-override-grandparent-properties.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(3, dds.length);
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-version-other", "5.79"),
dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("org.apache", "test-yet-other", "5.79"),
dds[2].getDependencyRevisionId());
}
@Test
public void testPomWithEntity() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-entity.pom"), true);
assertNotNull(md);
}
@Test
public void testModel() throws Exception {
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-model.pom"), false);
assertNotNull(md);
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org.apache", "test", "1.0");
assertEquals(mrid, md.getModuleRevisionId());
assertNotNull(md.getConfigurations());
assertEquals(Arrays.asList(PomModuleDescriptorBuilder.MAVEN2_CONFIGURATIONS),
Arrays.asList(md.getConfigurations()));
Artifact[] artifact = md.getArtifacts("master");
assertEquals(1, artifact.length);
assertEquals(mrid, artifact[0].getModuleRevisionId());
assertEquals("test", artifact[0].getName());
assertEquals("jar", artifact[0].getExt());
assertEquals("jar", artifact[0].getType());
}
@Test
public void testParentBomImport() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings,
getClass().getResource(
String.format("depmgt/%s.pom", dd.getDependencyId().getName())),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("depmgt/child.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
}
@Test
public void testGrandparentBomImport() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings,
getClass().getResource(
String.format("depmgt/%s.pom", dd.getDependencyId().getName())),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("depmgt/grandchild.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(2, dds.length);
assertEquals(
ModuleRevisionId.newInstance("commons-collection", "commons-collection", "1.0.5"),
dds[0].getDependencyRevisionId());
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[1].getDependencyRevisionId());
}
@Test
public void testParentProfileBomImport() throws ParseException, IOException {
settings.setDictatorResolver(new MockResolver() {
public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data)
throws ParseException {
try {
ModuleDescriptor moduleDescriptor = PomModuleDescriptorParser.getInstance()
.parseDescriptor(settings,
getClass().getResource(
String.format("depmgt/%s.pom", dd.getDependencyId().getName())),
false);
return new ResolvedModuleRevision(null, null, moduleDescriptor, null);
} catch (IOException e) {
throw new AssertionError(e);
}
}
});
ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("depmgt/profile-parent-child.pom"), false);
assertNotNull(md);
assertEquals("1.0", md.getRevision());
DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
}
/**
* Test case for IVY-1561.
* A pom.xml which has references to properties that are either set via environment variables
* or system properties, must have its properties evaluated correctly.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1561">IVY-1561</a>
*/
@Test
public void testSystemPropertyAndEnvReferences() throws Exception {
// The pom we are testing contains a reference to a string called
// "env.THIS_WILL_BE_REPLACED_IN_TEST_BY_A_ENV_VAR". This piece of code replaces it with
// "env.someenvname" where someenvname is a environment variable we choose in this test case
// (after randomly picking it from the ones that are set).
// Finally we save the updated pom content in a separate file and test against that file
final String envName = chooseSomeEnvVar();
final URL originalPomFile = this.getClass().getResource("test-system-properties.pom");
assertNotNull("Pom file to test, is missing", originalPomFile);
final List<String> pomContent = Files.readAllLines(Paths.get(originalPomFile.toURI()), StandardCharsets.UTF_8);
final List<String> replacedContent = new ArrayList<>();
for (final String line : pomContent) {
replacedContent.add(line.replaceAll("THIS_WILL_BE_REPLACED_IN_TEST_BY_A_ENV_VAR", envName));
}
// write the new pom contents into a separate file
final Path updatedPomFile = Paths.get(workDir.getRoot().toPath().toString(), "updated-test-system-properties.pom");
Files.write(updatedPomFile, replacedContent, StandardCharsets.UTF_8);
// now start testing - we do 2 rounds -
// once with a system property (referenced in the pom) set and once unset
boolean withSystemPropertiesSet = false;
try {
for (int i = 0; i < 2; i++) {
if (i == 1) {
System.setProperty("version.test.system.property.b", "1.2.3");
withSystemPropertiesSet = true;
}
final ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings, updatedPomFile.toUri().toURL(), false);
assertNotNull("Module descriptor created from POM reader was null", md);
assertEquals("Unexpected module descriptor created by POM reader",
ModuleRevisionId.newInstance("foo.bar", "hello-world", "2.0.2"),
md.getModuleRevisionId());
final DependencyDescriptor[] dds = md.getDependencies();
assertNotNull("No dependency descriptors found in module descriptor", dds);
assertEquals("Unexpected number of dependencies in module descriptor", 4, dds.length);
final Set<ModuleRevisionId> expectedDependencies = new HashSet<>();
expectedDependencies.add(ModuleRevisionId.newInstance("aopalliance", "aopalliance", "1.0"));
final String commonsLoggingDepVersion = envName == null ? "${env.THIS_WILL_BE_REPLACED_IN_TEST_BY_A_ENV_VAR}" : System.getenv(envName);
expectedDependencies.add(ModuleRevisionId.newInstance("commons-logging", "commons-logging", commonsLoggingDepVersion));
expectedDependencies.add(ModuleRevisionId.newInstance("foo.bar", "hello-world-api", "2.0.2"));
expectedDependencies.add(ModuleRevisionId.newInstance("a", "b", withSystemPropertiesSet ? "1.2.3" : "2.3.4"));
for (final DependencyDescriptor dd : dds) {
assertNotNull("Dependency was null in the dependencies", dd);
assertTrue("Unexpected dependency " + dd.getDependencyRevisionId() + " in module descriptor", expectedDependencies.remove(dd.getDependencyRevisionId()));
}
assertTrue("Following dependencies were missing from module descriptor " + expectedDependencies, expectedDependencies.isEmpty());
}
} finally {
System.clearProperty("version.test.system.property.b");
}
}
/**
* Tests that the {@code properties} setup in the Maven {@code profiles} that are conditionally activated,
* become available to the module being parsed and such properties can be used as references within the pom
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1577">IVY-1577</a> for more details
*/
@Test
public void testPropertiesDefinedInProfiles() throws Exception {
final String[] packagingTypesToTest = new String[]{"bundle", "jar"};
for (final String expectedPackagingType : packagingTypesToTest) {
String sysPropToSet = null;
switch (expectedPackagingType) {
case "bundle": {
sysPropToSet = "PomModuleDescriptorParserTest.some-other-test-prop";
break;
}
case "jar": {
sysPropToSet = "PomModuleDescriptorParserTest.some-test-prop";
break;
}
default: {
fail("Unexpected packaging type");
}
}
// activate the relevant profile, based on a system property
System.setProperty(sysPropToSet, "foo");
try {
// now parse the pom
final ModuleDescriptor md = PomModuleDescriptorParser.getInstance().parseDescriptor(settings,
getClass().getResource("test-properties-in-profile.pom"), false);
assertNotNull("Parsed module descriptor was null", md);
assertEquals("Unexpected module descriptor", ModuleRevisionId.newInstance("org.apache", "test", "5.0.1"), md.getModuleRevisionId());
final Artifact[] artifacts = md.getAllArtifacts();
assertNotNull("No artifacts found for module", artifacts);
assertEquals("Unexpected number of artifacts for module", 1, artifacts.length);
final Artifact mainArtifact = artifacts[0];
// make sure that the main artifact which references a conditionally set property (via a Maven profile)
// is indeed using the right value
assertEquals("Unexpected artifact type", expectedPackagingType, mainArtifact.getType());
// some other basic tests
final DependencyDescriptor[] dds = md.getDependencies();
assertNotNull(dds);
assertEquals(1, dds.length);
assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
dds[0].getDependencyRevisionId());
} finally {
if (sysPropToSet != null) {
// reset the system prop that we had set
System.clearProperty(sysPropToSet);
}
}
}
}
private static String chooseSomeEnvVar() {
final Map<String, String> env = System.getenv();
for (final Map.Entry<String, String> entry : env.entrySet()) {
if (entry.getKey() != null && entry.getValue() != null) {
return entry.getKey();
}
}
return null;
}
private IvySettings createIvySettingsForParentLicenseTesting(final String parentPomFileName, final String parentOrgName,
final String parentModuleName) throws Exception {
final URL parentPomURL = this.getClass().getResource(parentPomFileName);
assertNotNull("Could not find " + parentPomFileName, parentPomURL);
final PomReader parentPomReader = new PomReader(parentPomURL, new URLResource(parentPomURL));
final License[] parentLicenses = parentPomReader.getLicenses();
assertNotNull("Missing licenses in parent pom " + parentPomFileName, parentLicenses);
assertEquals("Unexpected number of licenses in parent pom " + parentPomFileName, 1, parentLicenses.length);
final DependencyResolver dependencyResolver = new MockedDependencyResolver() {
@Override
protected ModuleDescriptor getModuleDescriptor(DependencyDescriptor dependencyDescriptor) {
final String depOrg = dependencyDescriptor.getDependencyId().getOrganisation();
final String depModuleName = dependencyDescriptor.getDependencyId().getName();
if (depOrg.equals(parentOrgName) && depModuleName.equals(parentModuleName)) {
final DefaultModuleDescriptor moduleDescriptor = DefaultModuleDescriptor.newDefaultInstance(dependencyDescriptor.getDependencyRevisionId());
for (final License license : parentLicenses) {
moduleDescriptor.addLicense(license);
}
return moduleDescriptor;
} else {
return super.getModuleDescriptor(dependencyDescriptor);
}
}
};
final IvySettings ivySettings = new IvySettings();
ivySettings.setDictatorResolver(dependencyResolver);
return ivySettings;
}
}