blob: d3367321333a87805d801b87413960ecca17086c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2019 SAP SE and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP SE - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.pomless;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.maven.model.InputLocation;
import org.apache.maven.model.InputSource;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.building.ModelProcessor;
import org.apache.maven.model.io.ModelParseException;
import org.apache.maven.model.io.ModelReader;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.junit.Test;
import org.sonatype.maven.polyglot.mapping.Mapping;
public class TychoModelReaderTest extends PlexusTestCase {
@Test
public void testReadBundle() throws Exception {
File buildProperties = new File(getPolyglotTestDir(), "bundle1/" + TychoBundleMapping.MANIFEST_MF_MARKER);
Model model = getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
assertEquals("4.0.0", model.getModelVersion());
assertEquals("pomless.bundle", model.getArtifactId());
assertEquals("Pomless Bundle", model.getName());
assertEquals("0.1.0-SNAPSHOT", model.getVersion());
assertEquals("eclipse-plugin", model.getPackaging());
assertParent(model.getParent());
assertLocation("bundle1/META-INF/MANIFEST.MF", model.getLocation(""));
}
@Test
public void testReadBundle2() throws Exception {
File buildProperties = new File(getPolyglotTestDir(), "bundle2/" + TychoBundleMapping.MANIFEST_MF_MARKER);
Model model = getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
assertEquals("4.0.0", model.getModelVersion());
assertEquals("pomless.bundle", model.getArtifactId());
assertEquals("Pomless Bundle", model.getName());
assertEquals("0.1.0-SNAPSHOT", model.getVersion());
assertEquals("eclipse-plugin", model.getPackaging());
assertParent(model.getParent());
assertLocation("bundle2/META-INF/MANIFEST.MF", model.getLocation(""));
}
@Test
public void testReadBundle3() throws Exception {
File buildProperties = new File(getPolyglotTestDir(), "bundle3/" + TychoBundleMapping.MANIFEST_MF_MARKER);
Model model = getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
assertEquals("4.0.0", model.getModelVersion());
assertEquals("pomless.bundle", model.getArtifactId());
assertEquals("Pomless Bundle", model.getName());
assertEquals("0.1.0-SNAPSHOT", model.getVersion());
assertEquals("eclipse-plugin", model.getPackaging());
assertParent(model.getParent());
assertLocation("bundle3/META-INF/MANIFEST.MF", model.getLocation(""));
}
@Test
public void testReadTestBundle() throws Exception {
File buildProperties = new File(getPolyglotTestDir(), "bundle1.tests/" + TychoBundleMapping.MANIFEST_MF_MARKER);
Model model = getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
assertEquals("pomless.bundle.tests", model.getArtifactId());
assertEquals("1.0.1", model.getVersion());
assertEquals("eclipse-test-plugin", model.getPackaging());
assertParent(model.getParent());
assertLocation("bundle1.tests/META-INF/MANIFEST.MF", model.getLocation(""));
}
@Test
public void testReadFeature() throws Exception {
File feature = new File(getPolyglotTestDir(), "feature/feature.xml");
Model model = getTychoModelReader(TychoFeatureMapping.PACKAGING).read(feature, createReaderOptions(feature));
assertEquals("pomless.feature", model.getArtifactId());
assertEquals("Pomless Feature", model.getName());
assertEquals("1.0.0-SNAPSHOT", model.getVersion());
assertEquals("eclipse-feature", model.getPackaging());
assertParent(model.getParent());
assertLocation("feature/feature.xml", model.getLocation(""));
}
@Test
public void testReadFeature2() throws Exception {
File feature = new File(getPolyglotTestDir(), "feature2/feature.xml");
Model model = getTychoModelReader(TychoFeatureMapping.PACKAGING).read(feature, createReaderOptions(feature));
assertEquals("pomless.feature", model.getArtifactId());
assertEquals("Pomless Feature 2", model.getName());
assertEquals("Eclipse.org", model.getOrganization().getName());
assertEquals("1.0.0-SNAPSHOT", model.getVersion());
assertEquals("eclipse-feature", model.getPackaging());
assertParent(model.getParent());
assertLocation("feature2/feature.xml", model.getLocation(""));
}
@Test
public void testMissingManifestOrFeature() throws Exception {
File buildDir = new File(getTestResourcesDir(), "modelreader/missingManifestOrFeature/");
assertNull(getMapping(TychoBundleMapping.PACKAGING).locatePom(buildDir));
assertNull(getMapping(TychoFeatureMapping.PACKAGING).locatePom(buildDir));
assertNull(getMapping(TychoRepositoryMapping.PACKAGING).locatePom(buildDir));
assertNull(getMapping(TychoTargetMapping.PACKAGING).locatePom(buildDir));
}
@Test
public void testIllFormedFeature() throws Exception {
File featureXml = new File(getTestResourcesDir(), "modelreader/features/illFormed/feature.xml");
try {
getTychoModelReader(TychoFeatureMapping.PACKAGING).read(featureXml, createReaderOptions(featureXml));
fail();
} catch (ModelParseException e) {
// expected
}
}
@Test
public void testFeatureWithoutId() throws Exception {
File featureXml = new File(getTestResourcesDir(), "modelreader/features/missingId/feature.xml");
try {
getTychoModelReader(TychoFeatureMapping.PACKAGING).read(featureXml, createReaderOptions(featureXml));
fail();
} catch (ModelParseException e) {
assertThat(e.getMessage(), containsString("missing or empty 'id' attribute in element 'feature'"));
}
}
@Test
public void testFeatureWithoutVersion() throws Exception {
File featureXml = new File(getTestResourcesDir(), "modelreader/features/missingVersion/feature.xml");
try {
getTychoModelReader(TychoFeatureMapping.PACKAGING).read(featureXml, createReaderOptions(featureXml));
fail();
} catch (ModelParseException e) {
assertThat(e.getMessage(), containsString("missing or empty 'version' attribute in element 'feature'"));
}
}
@Test
public void testBundleWithoutSymbolicName() throws Exception {
File buildProperties = new File(getTestResourcesDir(),
"modelreader/plugins/missingBsn/" + TychoBundleMapping.MANIFEST_MF_MARKER);
try {
getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
fail();
} catch (ModelParseException e) {
assertThat(e.getMessage(), containsString("Bundle-SymbolicName missing in"));
}
}
@Test
public void testBundleWithoutVersion() throws Exception {
File buildProperties = new File(getTestResourcesDir(),
"modelreader/plugins/missingVersion/" + TychoBundleMapping.MANIFEST_MF_MARKER);
try {
getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
fail();
} catch (ModelParseException e) {
assertThat(e.getMessage(), containsString("Bundle-Version missing in"));
}
}
@Test
public void testNoParent() throws Exception {
File buildProperties = new File(getTestResourcesDir(),
"modelreader/noParent/bundle/" + TychoBundleMapping.MANIFEST_MF_MARKER);
try {
getTychoModelReader(TychoBundleMapping.PACKAGING).read(buildProperties,
createReaderOptions(buildProperties));
fail();
} catch (IOException e) {
assertThat(e.getMessage(), containsString("No parent pom file found in"));
}
}
@Test
public void testFindParent() throws Exception {
File location = new File(getTestResourcesDir(),
"modelreader/grandparentInheritance/bundle/" + TychoBundleMapping.MANIFEST_MF_MARKER);
Model model = getTychoModelReader(TychoBundleMapping.PACKAGING).read(location, createReaderOptions(location));
assertNotNull(model);
Parent parentReference = model.getParent();
assertEquals("bundle-parent", parentReference.getArtifactId());
assertEquals("grandparent.groupid", parentReference.getGroupId());
assertEquals("1.2.3", parentReference.getVersion());
}
@Test
public void testReadProduct() throws ModelParseException, IOException, ComponentLookupException {
File product = new File(getPolyglotTestDir(), "product/myproduct.product");
Model model = getTychoModelReader(TychoRepositoryMapping.PACKAGING).read(product, createReaderOptions(product));
assertEquals("4.0.0", model.getModelVersion());
assertEquals("pomless.product.validproduct", model.getArtifactId());
assertEquals("0.0.2-SNAPSHOT", model.getVersion());
assertEquals("eclipse-repository", model.getPackaging());
assertParent(model.getParent());
}
public ModelReader getTychoModelReader(String packaging) throws ComponentLookupException {
return getMapping(packaging).getReader();
}
private Mapping getMapping(String packaging) throws ComponentLookupException {
return lookup(Mapping.class, packaging);
}
@Test
public void testProductWithoutUid() throws IOException, ComponentLookupException {
try {
File product = new File(getTestResourcesDir(), "modelreader/products/missingUid/myproduct.product");
getTychoModelReader(TychoRepositoryMapping.PACKAGING).read(product, createReaderOptions(product));
fail();
} catch (ModelParseException e) {
assertThat(e.getMessage(), containsString("missing or empty 'uid' attribute in element 'product'"));
}
}
@Test
public void testProductWithoutVersion() throws IOException, ComponentLookupException {
File product = new File(getTestResourcesDir(), "modelreader/products/missingVersion/myproduct.product");
getTychoModelReader(TychoRepositoryMapping.PACKAGING).read(product, createReaderOptions(product));
}
@Test()
public void testIllFormedProduct() throws Exception {
File product = new File(getTestResourcesDir(), "modelreader/products/illFormed/myproduct.product");
try {
getTychoModelReader(TychoRepositoryMapping.PACKAGING).read(product, createReaderOptions(product));
fail();
} catch (ModelParseException e) {
//expected
}
}
@Test
public void testReadUpdateSite() throws ModelParseException, IOException, ComponentLookupException {
File updatesite = new File(getTestResourcesDir(), "modelreader/updatesites/site/category.xml");
Model model = getTychoModelReader(TychoRepositoryMapping.PACKAGING).read(updatesite,
createReaderOptions(updatesite));
assertEquals("4.0.0", model.getModelVersion());
assertEquals("site.eclipse-repository", model.getArtifactId());
assertEquals("0.0.1-SNAPSHOT", model.getVersion());
assertEquals("eclipse-repository", model.getPackaging());
assertParent(model.getParent());
}
private void assertParent(Parent parent) {
assertNotNull(parent);
assertEquals("testParent.groupId", parent.getGroupId());
assertEquals("testparent", parent.getArtifactId());
assertEquals("0.0.1-SNAPSHOT", parent.getVersion());
}
private void assertLocation(String expectedLocation, InputLocation location) {
assertNotNull(location);
assertEquals(0, location.getLineNumber());
assertEquals(0, location.getColumnNumber());
InputSource source = location.getSource();
assertNotNull(source);
assertEquals(new File(getPolyglotTestDir(), expectedLocation).toString(), source.getLocation());
assertNotNull(source.getModelId());
assertTrue(source.getModelId().matches("^testParent.groupId:.*:.*"));
}
private Map<String, String> createReaderOptions(File buildProperties) {
Map<String, String> options = new HashMap<>();
options.put(ModelProcessor.SOURCE, buildProperties.getAbsolutePath());
return options;
}
private File getPolyglotTestDir() {
return new File(getTestResourcesDir(), "testpomless/");
}
private File getTestResourcesDir() {
return new File(getBasedir(), "src/test/resources/");
}
}