blob: fea6b0f8a22369cf31cd4e359f1fcc971c0f7087 [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.core.module.descriptor;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import javax.xml.xpath.XPathConstants;
import org.apache.ivy.TestHelper;
import org.apache.ivy.ant.IvyMakePom;
import org.apache.ivy.util.TestXmlHelper;
import org.apache.tools.ant.Project;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Tests {@link IvyMakePom}
*/
public class IvyMakePomTest {
private Project project;
@Rule
public TemporaryFolder workdir = new TemporaryFolder();
@Before
public void beforeTest() {
this.project = TestHelper.newProject();
}
/**
* Test case for IVY-1528. An Ivy file containing a <code>classifier</code> extra attribute in
* its dependency, must retain the <code>classifier</code> in the generated POM when converted
* to a POM file through {@link IvyMakePom}.
*
* @throws Exception if something goes wrong
* @see <a href="https://issues.apache.org/jira/browse/IVY-1528">IVY-1528</a>
*/
@Test
public void testClassifier() throws Exception {
final File ivyFile = new File(IvyMakePomTest.class.getResource("ivy-to-pom-classifier.xml").toURI());
assertTrue(ivyFile + " is either missing or not a file", ivyFile.isFile());
final IvyMakePom makepom = new IvyMakePom();
makepom.setProject(project);
final File generatedPomFile = workdir.newFile("test-ivy-to-pom-classifier.pom");
makepom.setPomFile(generatedPomFile);
makepom.setIvyFile(ivyFile);
// run the task
makepom.execute();
// read the generated pom
final NodeList dependencies = (NodeList) TestXmlHelper.evaluateXPathExpr(generatedPomFile, "/project/dependencies/dependency", XPathConstants.NODESET);
assertNotNull("Dependencies element wasn't found in the generated POM file", dependencies);
assertEquals("Unexpected number of dependencies in the generated POM file", 2, dependencies.getLength());
final Set<String> expectedPomArtifactIds = new HashSet<>();
expectedPomArtifactIds.add("foo");
expectedPomArtifactIds.add("bar");
for (int i = 0; i < dependencies.getLength(); i++) {
final PomDependency pomDependency = PomDependency.parse(dependencies.item(i));
assertNotNull("Dependency generated was null", pomDependency);
assertTrue("Unexpected dependency " + pomDependency, expectedPomArtifactIds.contains(pomDependency.artifactId));
// we no longer expect this, so remove it
expectedPomArtifactIds.remove(pomDependency.artifactId);
if (pomDependency.artifactId.equals("foo")) {
assertEquals("Unexpected group id for generated dependency " + pomDependency, "org", pomDependency.groupId);
assertEquals("Unexpected version for generated dependency " + pomDependency, "1.2.3", pomDependency.version);
assertNull("Classifier was expected to be absent for dependency " + pomDependency, pomDependency.classifier);
} else if (pomDependency.artifactId.equals("bar")) {
assertEquals("Unexpected group id for generated dependency " + pomDependency, "apache", pomDependency.groupId);
assertEquals("Unexpected version for generated dependency " + pomDependency, "2.0.0", pomDependency.version);
assertEquals("Unexpected classifier for dependency " + pomDependency, "class1", pomDependency.classifier);
}
}
assertTrue("Some expected dependencies " + expectedPomArtifactIds + " were not found in the generated POM file", expectedPomArtifactIds.isEmpty());
}
private static final class PomDependency {
private final String groupId;
private final String artifactId;
private final String version;
private final String scope;
private final String classifier;
@SuppressWarnings("unused")
private final boolean optional;
private PomDependency(final String groupId, final String artifactId, final String version,
final String scope, final String classifier) {
this(groupId, artifactId, version, scope, classifier, false);
}
private PomDependency(final String groupId, final String artifactId, final String version,
final String scope, final String classifier, final boolean optional) {
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.scope = scope;
this.classifier = classifier;
this.optional = optional;
}
static PomDependency parse(final Node dependencyNode) {
if (dependencyNode == null) {
return null;
}
final NodeList children = dependencyNode.getChildNodes();
if (children == null) {
return new PomDependency(null, null, null, null, null);
}
String groupId = null;
String artifactId = null;
String version = null;
String scope = null;
String classifier = null;
String optional = null;
Node nextChild = children.item(0);
while (nextChild != null) {
nextChild = skipIfTextNode(nextChild);
if (nextChild == null) {
break;
}
final String nodeName = nextChild.getNodeName();
switch (nodeName) {
case "groupId":
groupId = nextChild.getTextContent();
break;
case "artifactId":
artifactId = nextChild.getTextContent();
break;
case "version":
version = nextChild.getTextContent();
break;
case "classifier":
classifier = nextChild.getTextContent();
break;
case "scope":
scope = nextChild.getTextContent();
break;
case "optional":
optional = nextChild.getTextContent();
break;
default:
throw new RuntimeException("Unexpected child element "
+ nextChild.getNodeName() + " under dependency element");
}
// move to next sibling
nextChild = nextChild.getNextSibling();
}
return new PomDependency(groupId, artifactId, version, scope, classifier,
Boolean.parseBoolean(optional));
}
private static Node skipIfTextNode(final Node node) {
if (node.getNodeType() == Node.TEXT_NODE) {
return node.getNextSibling();
}
return node;
}
@Override
public String toString() {
return String.format("PomDependency{groupId='%s', artifactId='%s', version='%s', scope='%s', classifier='%s'}",
groupId, artifactId, version, scope, classifier);
}
}
}